转自: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程序手工接收邮件及其过程

JavaMail入门:创建纯文本、HTML格式的邮件的更多相关文章

  1. 创建纯文本Banner

    场景: 最近再学习Spring Boot的过程中,想要自定义一个Banner,就是再工程启动是输出的那个文本图案,但是自己拼写既麻烦又不好看,所以找到一个工具,自动输出文字代表的纯文本Banner,例 ...

  2. [Java] JavaMail 发送带图片的 html 格式的邮件

    JavaMail 发送的邮件正文和附件是相互独立的,但是内置图片需要定位图片在正文中的位置,所以内置图片和邮件正文是互相依赖的. 发送带附件的邮件可参考JavaMail 发送 html 格式.带附件的 ...

  3. JavaMail入门第二篇 创建邮件

    JavaMail API使用javax.mail.Message类来表示一封邮件,Message类是一个抽象类,所以我们需要使用其子类javax.mail.internet.MimeMessage类来 ...

  4. javamail邮件Multipart支持同时发text和html混合消息,alternative纯文本与超文本共存

    javamail邮件Multipart支持同时发text和html混合消息alternative纯文本与超文本共存 multipart/mixed:附件. multipart/related:内嵌资源 ...

  5. java 发送 mail 纯文本发送和html格式发送

    一:需要引入mail maven jar包 <!--邮件发送包--> <dependency> <groupId>javax.mail</groupId> ...

  6. [No0000168]Excle只允许用户输入纯文本,禁止用户修改单元格样式、格式等

    背景:自己的模板给别人,让他填完信息上传到系统里,但别人经常不按模板的格式来填写,导致无法程序自动化.能不能在模板上把格式锁住,只允许输入纯文本,但不能改格式? 方法: 步骤一,创建你要的模板 其中, ...

  7. SPOOL 命令使用实例【oracle导出纯文本格式文件】

    SPOOL 命令使用实例[oracle导出纯文本格式文件] SET echo off              --在用start命令执行一个sql脚本时,是否显示脚本中正在执行的SQL语句: SET ...

  8. C++入门经典-例8.9-抽象类,纯虚函数,创建纯虚函数

    1:包含有纯虚函数的类称为抽象类,一个抽象类至少具有一个纯虚函数.抽象类只能作为基类派生出的新的子类,而不能在程序中被实例化(即不能说明抽象类的对象),但是可以使用指向抽象类的指针.在程序开发过程中并 ...

  9. james+javamail入门

    James+Javamail构建邮件服务(一) 本文描述如何使用James搭建具备一定邮件过滤.邮件操作功能的邮件服务器,以及使用Javamail实现对James服务器邮件的收发功能. 1关于Jame ...

随机推荐

  1. C json实战引擎 三 , 最后实现部分辅助函数

    引言 大学读的是一个很时髦的专业, 学了四年的游戏竞技. 可惜没学好. 但认真过, 比做什么都认真. 见证了  ...... 打的所有游戏人物中 分享一位最喜爱 的 “I've been alone ...

  2. memcached结合php以及memcache共享session

    //安装php的memcache扩展 一.使用php自带的pecl安装程序 [root@localhost src]# /usr/local/php/bin/pecl install memcache ...

  3. zookeeper安装和搭建集群方式(window)

    1.   概述 ZooKeeper是Hadoop的正式子项目,它是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护.名字服务.分布式同步.组服务等.ZooKeeper的目标就是封装好复杂 ...

  4. hive的窗口函数1

    Hive中提供了越来越多的分析函数,用于完成负责的统计分析.抽时间将所有的分析窗口函数理一遍,将陆续发布.今天先看几个基础的,SUM.AVG.MIN.MAX.用于实现分组内所有和连续累积的统计. 1. ...

  5. 【转载】python 特殊函数 dunder function

    python的特殊方法:另外一种称谓是 dunder function, 就是 under-under function的简写,就是指那些前后都带双下划线的函数. 转自这里: https://blog ...

  6. CentOS7.5删除旧的内核

    [root@localhost ~]# uname -r3.10.0-862.3.2.el7.x86_64 [root@localhost ~]# rpm -qa | grep kernelkerne ...

  7. idea中使用FindBugs-IDEA插件

    下载 - 安装 - 重启idea即可: 项目右键或者文件右键即可看到  FindBugs 选项. 选择某个选项直接检测即可.检测结果如下图: 这里的Correctness是重点关注对象.这里面的错误往 ...

  8. Python与SQLite日期时间函数的使法

    SQLite的时间函数跟Python的时间函数有些许差别,所以稍做记录,供自己以后查询. 网上有将SQLite官方WIKI内容翻译成中文的文章,大家有兴趣可以搜索一下,我这里单纯记录一下个人比较常用的 ...

  9. Python使用boto3操作AWS S3中踩过的坑

    最近在AWS上开发部署应用. 看了这篇关于AWS中国区填坑的文章,结合自己使用AWS的经历,补充两个我自己填的坑. http://www.jianshu.com/p/0d0fd39a40c9?utm_ ...

  10. Web应用主动侦测工具Skipfish

    Web应用主动侦测工具Skipfish   Skipfish是Kali Linux附带的一个主动Web应用侦测工具.该工具会首先尽可能获取所有网站路径,进行访问,然后根据返回的内容,检测是否存在漏洞. ...