转自:http://haolloyin.blog.51cto.com/1177454/353849/

在 http://java.sun.com/products/javamail/ 下载了 JavaMail 1.4.3 版本,如果所用 JDK 是 6.0 则不用再下载 activation 。下载得到的是 javamail-1.4.3.zip 的压缩包,解压得到 mail.jar 包,配置环境变量之后就可以使用了。从解压后的文件夹中有 JavaMail-1.4.pdf 这个 JavaMail 的设计规范文档。虽然是英文,但是稍微看一看我就从中截了 4 张比较有用的图片,觉得有必要了解一下,如下:

1、JavaMail 架构层次图:

2、JavaMail 的类层次图:

3、JavaMail 中几个最重要类的类图:

4、MimeMessage 类的具体类图:

JavaMail 文档有时间慢慢理解,使用 JavaMail 开发邮件应用程序可以参考解压之后的 JavaMail 开发文档,下面用代码实现创建一个纯文本格式的邮件:

纯文本格式的邮件:

  1. import java.io.FileOutputStream;
  2. import java.util.Date;
  3. import java.util.Properties;
  4. import javax.mail.Message;
  5. import javax.mail.Session;
  6. import javax.mail.internet.InternetAddress;
  7. import javax.mail.internet.MimeMessage;
  8. /**
  9. * 创建纯文本格式的邮件,保存为Outlook 的 ".eml" 邮件格式
  10. * @author haolloyin
  11. */
  12. public class TextMessage {
  13. public static void main(String[] args) throws Exception{
  14. String from = "test_hao@sina.cn";
  15. String to = "test_hao@163.com";
  16. String subject = "创建一个纯文本邮件!";
  17. String body = "纯文本邮件测试!!!";
  18. // 创建该邮件应用程序所需的环境信息以及会话信息
  19. Session session = Session.getDefaultInstance(new Properties());
  20. // 根据上面的 Session 实例创建 MimeMessage 实例,即一封邮件
  21. MimeMessage msg = new MimeMessage(session);
  22. // 设置发件人地址
  23. msg.setFrom(new InternetAddress(from));
  24. // 设置收件人地址
  25. msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
  26. // 设置 E-mail 主题
  27. msg.setSubject(subject);
  28. // 设置发送时间
  29. msg.setSentDate(new Date());
  30. // 设置 E-mail 正文部分
  31. msg.setText(body);
  32. // 必须保存对该 MimeMessage 实例的更改
  33. msg.saveChanges();
  34. // 将 msg 对象中内容写入当前文件的textMail.eml文件中
  35. msg.writeTo(new FileOutputStream("textMail.eml"));
  36. }
  37. }

编译运行,得到 textMail.eml 文件,双击自动用 Outlook 打开,如下图:

单击 Outlook 中的“文件”—> “属性”—> “详细信息”可看到该邮件的邮件头,再点击“邮件来源”可看到该邮件的源文件内容,如下图:

注意上面被选择的内容,Content-Transfer-Encoding: base64 说明是被用 BASE64 编码转换过的了,因此邮件的正文部分如下图:

因为邮件中的 subject 和 body 都用到了中文,所以字符集编码时 charset=GBK 。

 HTML 格式的邮件:

再用同样的方式创建一封 HTML 格式的邮件,对上面的代码稍作修改即可,代码如下:

  1. import java.io.FileOutputStream;
  2. import java.util.Date;
  3. import java.util.Properties;
  4. import javax.mail.Message;
  5. import javax.mail.Session;
  6. import javax.mail.internet.InternetAddress;
  7. import javax.mail.internet.MimeMessage;
  8. /**
  9. * 创建 HTML 格式的邮件,保存为 Outlook 的 ".eml" 文件
  10. * @author haolloyin
  11. */
  12. public class HtmlMessage {
  13. public static void main(String[] args) throws Exception{
  14. String from = "test_hao@sina.cn";
  15. String to = "test_hao@163.com";
  16. String subject = "创建一个 HTML 格式邮件!";
  17. String body = "<h4>HTML 格式的邮件测试!!!</h4> " +
  18. "<a href = http://haolloyin.blog.51cto.com/> 蚂蚁</a>";
  19. // 创建该邮件应用程序所需的环境信息以及会话信息
  20. Session session = Session.getDefaultInstance(new Properties());
  21. // 根据上面的 Session 实例创建 MimeMessage 实例,即一封邮件
  22. MimeMessage msg = new MimeMessage(session);
  23. // 设置发件人地址
  24. msg.setFrom(new InternetAddress(from));
  25. // 设置收件人地址
  26. msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
  27. // 设置 E-mail 主题
  28. msg.setSubject(subject);
  29. // 设置发送时间
  30. msg.setSentDate(new Date());
  31. // 设置 E-mail 正文部分
  32. //      msg.setText(body);
  33. msg.setContent(body, "text/html;charset = gbk");
  34. // 保存对该 MimeMessage 实例的更改
  35. msg.saveChanges();
  36. // 将 msg 对象中内容写入文件
  37. msg.writeTo(new FileOutputStream("htmlMail.eml"));
  38. }
  39. }

注意上面代码中的 msg.setContent(body, "text/html;charset = gbk");  语句,双击生成的文件自动用 Outlook 打开,如下图:

我们注意到编码方式变成了 quoted-printable ,它与 BASE64 编码类似,都是将纯粹的二进制数据转换成可以打印的 ASCII 字符,具体的区别和用途请查阅资料。

目前的还不可以给指定的邮箱发送邮件,只是创建一封邮件而已。

小结:

1、了解 MIME 协议以及 MIME 邮件的组织结构对理解上面给出的类图很有帮助;

2、如果邮件的 subject 和 body 都不涉及中文,那么整封邮件都不会被转码,而是用最原始的 7bit 编码格式,可以试一试看一下效果。

我的相关文章:

图解使用Telnet程序手工发送邮件

简单的E-mail发送端程序的Java实现

图解使用telnet程序手工接收邮件及其过程

最新文章

  1. Tween公式 以及四个参数
  2. nodejs 在linux上后台运行
  3. JS通过getBoundingClientRect获取的height可能与css设置的height不一致
  4. 2016HUAS暑假集训题1 A-士兵队列训练问题
  5. const,static,volatile
  6. web1
  7. JavaWeb网页聊天室(WebSocket即时通讯)
  8. nginx反向代理原理和配置讲解
  9. Python爬虫:获取糗事百科笑话
  10. Entity Framework - Func引起的数据库全表查询
  11. 【收藏】十大Webserver漏洞扫描工具
  12. JavaScript基础——变量、语句、注释
  13. Nmap功能与常用命令
  14. python中对象、类型和元类之间的关系
  15. 洛谷 [p1439] 最长公共子序列 (NlogN)
  16. eclipse中的System.getProperty(&quot;user.dir&quot;)
  17. 白瑜庆:知乎基于Kubernetes的kafka平台的设计和实现
  18. 数据库之redis篇(1)—— redis数据库安装,简单使用
  19. 脑残式网络编程入门(五):每天都在用的Ping命令,它到底是什么?
  20. System.Runtime.InteropServices.COMException:“服务器出现意外情况。 (异常来自

热门文章

  1. node.js3
  2. MySQL5.6.32源码安装
  3. 从一个R语言案例学线性回归
  4. ZOJ-3430
  5. python中的is, ==与对象的相等判断
  6. 解决Tomcat因Redis加载慢而启动失败的问题
  7. 熟悉并了解uml的使用(一)
  8. 6.Spark streaming技术内幕 : Job动态生成原理与源码解析
  9. 转:libFuzzer Tutorial(libFuzzer教程)
  10. 阅读 CMakeLists