嗯,更深的理解一下javaMail吧。
首先還是奉上大佬鏈接。
http://www.cnblogs.com/CryOnMyShoulder/p/9351382.html
https://blog.csdn.net/ghsau/article/category/1834295
然后開始寫一下筆記。
javaMail分為兩個部分,第一部分是API接口。第二部分是service provider,服務提供者(實現(xiàn)類)。包括SMTP,POP3,IMAP。
API中常用四部分。
Session:記錄環(huán)境信息:主機名,端口號,協(xié)議名稱,身份驗證。
Message:記錄郵件信息:主題,內容,發(fā)件人,發(fā)送抄送密送,附件。
Transport:連接郵箱的SMTP服務器,用來發(fā)送郵件。
Store:連接郵箱的POP3服務器,用來接收郵件。
服務器信息可以設置到Session中,也可以設置到Transport中。
收件人信息可以設置到Message中,也可以設置到Transport中。
接下來按發(fā)郵件的順序記錄知識點。
//0、MailBean類。
public class MailBean {
private String smtpHost = "";//服務器地址
private String smtpPort = "";//服務器端口號
private String smtpAddr = "";//發(fā)件人郵箱地址
private String userName = "";//用戶名
private String password = "";//用戶密碼
private String smtpAuth = "";//身份驗證
private String smtpDebug = "";//開啟debug調試
}
//發(fā)送郵件
public static void send(String to, String cs, String ms,
String subject,String content, MailBean mailBean, String fileList[]) {
//1、建立會話,將環(huán)境信息放進Session中。
Properties p = new Properties();
p.put("mail.smtp.auth", mailBean.getSmtpAuth());//身份驗證
p.put("mail.transport.protocol", "smtp");//發(fā)送郵件協(xié)議名
p.put("mail.smtp.host", mailBean.getSmtpHost());//郵件服務器主機名
p.put("mail.smtp.port", mailBean.getSmtpPort());//郵件服務器端口
Session session = Session.getInstance(p);
//2、創(chuàng)建郵件對象
Message msg = new MimeMessage(session);
msg.setFrom(new InternetAddress(mailBean.getSmtpAddr()));//new一個郵件地址,發(fā)件人
Multipart multipart = new MimeMultipart();//郵件正文框(包括附件)
BodyPart messageBodyPart = new MimeBodyPart();//郵件組成部分
//發(fā)送
if(to != null) {
InternetAddress[] iaToList = new InternetAddress().parse(to);
msg.setRecipients(Message.RecipientType.TO, iaToList); // 收件人
}
//抄送
if(cs != null) {
InternetAddress[] iaToListcs = new InternetAddress().parse(cs);
msg.setRecipients(Message.RecipientType.CC, iaToListcs); // 抄送人
}
//密送
if(ms != null) {
InternetAddress[] iaToListms = new InternetAddress().parse(ms);
msg.setRecipients(Message.RecipientType.BCC, iaToListms); // 密送人
}
msg.setSentDate(new Date()); // 發(fā)送日期
msg.setSubject(subject); // 主題
msg.setText(content); // 內容
messageBodyPart.setContent(content, "text/html;charset=gbk");
multipart.addBodyPart(messageBodyPart);//將body部分放在mult里
//添加附件
for(int index = 0; index < fileList.length; index++)
{
BodyPart 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);
}
msg.setContent(multipart);
//3、郵件服務器進行驗證并發(fā)送郵件
Transport tran = session.getTransport("smtp");
tran.connect(mailBean.getSmtpHost(), mailBean.getUserName(), mailBean.getPassword());
tran.sendMessage(msg, msg.getAllRecipients()); //發(fā)送
System.out.println("郵件發(fā)送成功");
tran.close();
}
剖析一下Message。
按代碼寫的順序,Message從頭到尾set進來的值分別是:
1>setFrom(發(fā)件人地址)
2>setRecipients(發(fā)送,抄送,密送人郵箱)
3>setSentDate(發(fā)送日期)
4>setSubject(主題)
5>setText(內容)——>純文本首選
6>setContent(multipart)——>由附件或者HTML文件格式消息首選
上面提到了multipart,就來說一下。把Message比喻成一個箱子,那么multipart就是箱子所有東西的集合。bodyPart就是箱子里每一個東西。
然后來說每個東西bodyPart。在代碼里bodyPart一共用過兩次:第一次是messageBodyPart,這個東西是正文。第二次是mailArchieve,這個東西的每個附件。
最后東西存在集合里,集合放在箱子里。
multipart.addBodyPart(messageBodyPart);
multipart.addBodyPart(mailArchieve);
msg.setContent(multipart);
補充:Message,Multipart,BodyPart 都是抽象類,實例化的時候必須實例化一個子類。MimeMessage,MimeMultipart,MimeBodyPart。
new InternetAddress() 和 new InternetAddress().parse() 區(qū)別。前者單發(fā),后者群發(fā)。注意群發(fā)時,郵箱地址之間用逗號分隔就好。
FileDataSource對象,下面這個圖能說明一切。
