1、JavaMail 架构层次图:
2、JavaMail 的类层次图:
3、JavaMail 中几个最重要类的类图:
4、MimeMessage 类的具体类图:
JavaMail 文档有时间慢慢理解,使用 JavaMail 开发邮件应用程序可以参考解压之后的 JavaMail 开发文档,下面用代码实现创建一个纯文本格式的邮件:
纯文本格式的邮件:
- importjava.io.FileOutputStream;
- importjava.util.Date;
- importjava.util.Properties;
- importjavax.mail.Message;
- importjavax.mail.Session;
- importjavax.mail.internet.InternetAddress;
- importjavax.mail.internet.MimeMessage;
- /**
- *创建纯文本格式的邮件,保存为Outlook的".eml"邮件格式
- *@authorhaolloyin
- */
- publicclassTextMessage{
- publicstaticvoidmain(String[]args)throwsException{
- Stringfrom="[email protected]";
- Stringto="[email protected]";
- Stringsubject="创建一个纯文本邮件!";
- Stringbody="纯文本邮件测试!!!";
- //创建该邮件应用程序所需的环境信息以及会话信息
- Sessionsession=Session.getDefaultInstance(newProperties());
- //根据上面的Session实例创建MimeMessage实例,即一封邮件
- MimeMessagemsg=newMimeMessage(session);
- //设置发件人地址
- msg.setFrom(newInternetAddress(from));
- //设置收件人地址
- msg.setRecipients(Message.RecipientType.TO,InternetAddress.parse(to));
- //设置E-mail主题
- msg.setSubject(subject);
- //设置发送时间
- msg.setSentDate(newDate());
- //设置E-mail正文部分
- msg.setText(body);
- //必须保存对该MimeMessage实例的更改
- msg.saveChanges();
- //将msg对象中内容写入当前文件的textMail.eml文件中
- msg.writeTo(newFileOutputStream("textMail.eml"));
- }
- }
编译运行,得到 textMail.eml 文件,双击自动用 Outlook 打开,如下图:
单击 Outlook 中的“文件”—> “属性”—> “详细信息”可看到该邮件的邮件头,再点击“邮件来源”可看到该邮件的源文件内容,如下图:
注意上面被选择的内容,Content-Transfer-Encoding: base64 说明是被用 BASE64 编码转换过的了,因此邮件的正文部分如下图:
因为邮件中的 subject 和 body 都用到了中文,所以字符集编码时 charset=GBK 。
HTML 格式的邮件:
再用同样的方式创建一封 HTML 格式的邮件,对上面的代码稍作修改即可,代码如下:
- importjava.io.FileOutputStream;
- importjava.util.Date;
- importjava.util.Properties;
- importjavax.mail.Message;
- importjavax.mail.Session;
- importjavax.mail.internet.InternetAddress;
- importjavax.mail.internet.MimeMessage;
- /**
- *创建HTML格式的邮件,保存为Outlook的".eml"文件
- *@authorhaolloyin
- */
- publicclassHtmlMessage{
- publicstaticvoidmain(String[]args)throwsException{
- Stringfrom="[email protected]";
- Stringto="[email protected]";
- Stringsubject="创建一个HTML格式邮件!";
- Stringbody="<h4>HTML格式的邮件测试!!!</h4>"+
- "<ahref=http://haolloyin.blog.51cto.com/>蚂蚁</a>";
- //创建该邮件应用程序所需的环境信息以及会话信息
- Sessionsession=Session.getDefaultInstance(newProperties());
- //根据上面的Session实例创建MimeMessage实例,即一封邮件
- MimeMessagemsg=newMimeMessage(session);
- //设置发件人地址
- msg.setFrom(newInternetAddress(from));
- //设置收件人地址
- msg.setRecipients(Message.RecipientType.TO,InternetAddress.parse(to));
- //设置E-mail主题
- msg.setSubject(subject);
- //设置发送时间
- msg.setSentDate(newDate());
- //设置E-mail正文部分
- //msg.setText(body);
- msg.setContent(body,"text/html;charset=gbk");
- //保存对该MimeMessage实例的更改
- msg.saveChanges();
- //将msg对象中内容写入文件
- msg.writeTo(newFileOutputStream("htmlMail.eml"));
- }
- }
注意上面代码中的 msg.setContent(body, "text/html;charset = gbk"); 语句,双击生成的文件自动用 Outlook 打开,如下图:
我们注意到编码方式变成了 quoted-printable ,它与 BASE64 编码类似,都是将纯粹的二进制数据转换成可以打印的 ASCII 字符,具体的区别和用途请查阅资料。
目前的还不可以给指定的邮箱发送邮件,只是创建一封邮件而已。
小结:
1、了解 MIME 协议以及 MIME 邮件的组织结构对理解上面给出的类图很有帮助;
2、如果邮件的 subject 和 body 都不涉及中文,那么整封邮件都不会被转码,而是用最原始的 7bit 编码格式,可以试一试看一下效果。