Java邮件发送功能实现介绍
1、Java Mail介绍:
JAVA MAIL是利用现有的邮件账户发送邮件的工具,比如说,我在网易注册一个邮箱账户,通过JAVA Mail的操控,我可以不亲自登录网易邮箱,让程序自动的使用网易邮箱发送邮件。这一机制被广泛的用在注册激活和垃圾邮件的发送等方面。
2、配置JavaMail开发环境
mail.jar:就是开发javamail程序所必须要用到的核心开发包。
mail.jar文件的一些核心类主要包括:Session、Message、Address、Authenticator、Transport、Store、Folder以及javax.mail.internet包中还有一些常用的子类。
A:Session类(邮件会话)
进行收发邮件的工作都是基于这个会话的。
Session对象利用java.util.Properties对象获得邮件服务器、用户名、密码信息和整个应用程序都要使用到共享信息。
Properties props = new Properties();
Session session = Session.getDefaultInstance(props, null);
或者
Properties props = new Properties();
Session session = Session.getInstance(props, null);
从上面的两个例子中不难发现,第二个参数都是null,这是因为在上面的例子中并没有使用到邮件授权(参考D)
B: Message类
建立了Session对象后,便可以构造被发送的信息体Message抽象类
使用javax.mail.internet.MimeMessage这个子类,该类是使用MIME类型、MIME信息头的邮箱信息。
信息头只能使用US-ASCII字符
Message message = new MimeMessage(session);
message.setContent("Hello", "text/plain");//非文本信息内容
message.setText("Hello");//纯文本信息内容
message.setSubject("First");//设置邮件主题
message.setSentDate(Date);//设置邮件发送日期
C:Address
建立了Session和Message对象后,使用邮件地址Address抽象类
使用javax.mail.internet.InternetAddress这个子类。通过传入邮件地址的字符串
Address address = new InternetAddress("1107935211@163.com"); //邮件地址
Address address = new InternetAddress("1107935211@163.com", "卓越科技"); //带名字的邮件地址
message.setFrom(address);//设置发信人
message.setReplyTo(address);//同上
message.addFrom(Address[] address);//添加多个发信人
message.addRecipient(type, address)//设置收信人
Message.RecipientType.TO//收信人
Message.RecipientType.CC//抄送人
Message.RecipientType.BCC//暗送人
D.Authenticator授权者类
使用Authenticator抽象类必须实现getPasswordAuthentication()方法(用于存储认证时要用到的用户名、密码)。
并且要在Session中进行注册,使Session能够了解在认证时该使用哪个类。
Properties props = new Properties();
Authenticator auth = new MyAuthenticator();
Session session = Session.getDefaultInstance(props, auth);
/**
*自定义授权类
*/
public class EmailAutherticator extends Authenticator {
private String username;
private String password;
public EmailAutherticator() {
super();
}
public EmailAutherticator(String user, String pwd) {
super();
username = user;
password = pwd;
}
public PasswordAuthentication getPasswordAuthentication(){
return new PasswordAuthentication(username, password);
}
}
E.Transport
发送信息时使用Transport抽象类(实现了SMTP)
Transport.send(MimeMessage message);
或者一般用法
当然,方法是多样的。我们也可由Session获得相应协议对应的Transport实例。并通过传递用户名、密码、邮件服务器主机名等参数建立与邮件服务器的连接,并使用sendMessage()方法将信息发送,最后关闭连接:
session.setDebug(true);//监控邮件发送过程
message.saveChanges(); //保存文件
Transport transport = session.getTransport("smtp");//获取实现了SMTP协议的Transport类
transport.connect(host, username, password);//连接服务器
transport.sendMessage(message, message.getAllRecipients());//发送邮件给所有收件人
transport.close();//关闭连接
F.Store(存储邮件的服务器)和Folder(目录对象)
Store store = session.getStore("pop3");
store.connect(host, username, password);
Folder folder = store.getFolder("INBOX");//POP3协议只有一个名为INBOX的Folder有效
folder.open(Folder.READ_ONLY);//只读方式打开
Message message[] = folder.getMessages();//获得邮件
System.out.println(((MimeMessage)message).getContent());//邮件内容(不包含邮件头)
System.out.println(((MimeMessage)message).writeTo());//邮件内容(含邮件头)
folder.close(true);//若删除邮件则及时更新Folder,关闭
store.close();//关闭
Java邮件发送的过程:
package mail;
import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;
public class SendMail {
private static SendMail instance = null;
private SendMail() {
}
public static SendMail getInstance() {
if (instance == null) {
instance = new SendMail();
}
return instance;
}
public void send(String to[], String cs[], String ms[], String subject,
String content, String formEmail, String fileList[]) {
try {
Properties p = new Properties(); // Properties p =
// System.getProperties();
p.put("mail.smtp.auth", "true");
p.put("mail.transport.protocol", "smtp");
p.put("mail.smtp.host", "smtp.qq.com");
p.put("mail.smtp.port", "25");
// 建立会话
Session session = Session.getInstance(p);
Message msg = new MimeMessage(session); // 建立信息
BodyPart messageBodyPart = new MimeBodyPart();
Multipart multipart = new MimeMultipart();
msg.setFrom(new InternetAddress(formEmail)); // 发件人
String toList = null;
String toListcs = null;
String toListms = null;
// 发送,
if (to != null) {
toList = getMailList(to);
InternetAddress[] iaToList = new InternetAddress()
.parse(toList);
msg.setRecipients(Message.RecipientType.TO, iaToList); // 收件人
}
// 抄送
if (cs != null) {
toListcs = getMailList(cs);
InternetAddress[] iaToListcs = new InternetAddress().parse(toListcs);
msg.setRecipients(Message.RecipientType.CC, iaToListcs); // 抄送人
}
// 密送
if (ms != null) {
toListms = getMailList(ms);
InternetAddress[] iaToListms = new InternetAddress()
.parse(toListms);
msg.setRecipients(Message.RecipientType.BCC, iaToListms); // 密送人
}
msg.setSentDate(new Date()); // 发送日期
msg.setSubject(subject); // 主题
msg.setText(content); // 内容
// 显示以html格式的文本内容
messageBodyPart.setContent(content, "text/html;charset=gbk");
multipart.addBodyPart(messageBodyPart);
// 2.保存多个附件
if (fileList != null) {
addTach(fileList, multipart);
}
msg.setContent(multipart);
// 邮件服务器进行验证
Transport tran = session.getTransport("smtp");
tran.connect("smtp.qq.com", "1111@2qq.con",
"1Q2W3E4R5dTMMM");
tran.sendMessage(msg, msg.getAllRecipients()); // 发送
System.out.println("邮件发送成功");
} catch (Exception e) {
e.printStackTrace();
}
}
// 添加多个附件
public void addTach(String fileList[], Multipart multipart)
throws MessagingException, UnsupportedEncodingException {
for (int index = 0; index < fileList.length; index++) {
MimeBodyPart mailArchieve = new MimeBodyPart();
FileDataSource fds = new FileDataSource(fileList[index]);
mailArchieve.setDataHandler(new DataHandler(fds));
mailArchieve.setFileName(MimeUtility.encodeText(fds.getName(),
"GBK", "B"));
multipart.addBodyPart(mailArchieve);
}
}
private String getMailList(String[] mailArray) {
StringBuffer toList = new StringBuffer();
int length = mailArray.length;
if (mailArray != null && length < 2) {
toList.append(mailArray[0]);
} else {
for (int i = 0; i < length; i++) {
toList.append(mailArray[i]);
if (i != (length - 1)) {
toList.append(",");
}
}
}
return toList.toString();
}
public static void main(String args[]) {
SendMail send = SendMail.getInstance();
String to[] = { "aaaa@aaaa.cn" };
String cs[] = {"laaaa@aaa.cn"};
String ms[] = null;
String subject = "测试一下";
String content = "这是邮件内容,仅仅是测试,不需要回复";
String formEmail = "aaaa@mftcc.cn";
String[] arrArchievList = new String[4];
arrArchievList[0] = "c:\\2012052914033429140297.rar";
arrArchievList[1] = "c:\\topSearch.html";
arrArchievList[2] = "c:\\topSearch2.html";
arrArchievList[3] = "c:\\logo_white.png";
// 2.保存多个附件
send.send(to, cs, ms, subject, content, formEmail, arrArchievList);
}
}