JavaMail入门:创建纯文本、HTML格式的邮件

简介:

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

1、JavaMail 架构层次图:

JavaMail03

2、JavaMail 的类层次图:

JavaMail04

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

JavaMail01

4、MimeMessage 类的具体类图:

JavaMail02

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

纯文本格式的邮件:


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

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

TextMail

 image 

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

image

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

image

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

 HTML 格式的邮件:

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


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

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

image

image

image

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

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

小结:

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

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



本文转自 xxxx66yyyy 51CTO博客,原文链接:http://blog.51cto.com/haolloyin/353849,如需转载请自行联系原作者

相关文章
|
前端开发
html 格式
【10月更文挑战第14天】html 格式
1331 4
|
编解码 前端开发 UED
HTML多媒体格式支持与优化
在HTML中,多媒体格式的支持与优化至关重要。使用`&lt;audio&gt;`、`&lt;video&gt;`和`&lt;img&gt;`标签可分别嵌入音频、视频和图像。支持的格式包括MP3、OGG、JPEG等。为优化体验,应压缩文件、采用响应式设计、使用懒加载,并考虑转码及CDN托管。此外,添加字幕和描述文件可提高辅助功能。遵循这些最佳实践,能显著提升多媒体内容的加载速度与用户满意度。
|
移动开发 前端开发 JavaScript
HTML(HyperText Markup Language,超文本标记语言)
HTML(HyperText Markup Language,超文本标记语言)
624 11
|
移动开发 前端开发 Java
|
Java BI API
spring boot 整合 itextpdf 导出 PDF,写入大文本,写入HTML代码,分析当下导出PDF的几个工具
这篇文章介绍了如何在Spring Boot项目中整合iTextPDF库来导出PDF文件,包括写入大文本和HTML代码,并分析了几种常用的Java PDF导出工具。
4690 0
spring boot 整合 itextpdf 导出 PDF,写入大文本,写入HTML代码,分析当下导出PDF的几个工具
|
XML JavaScript 前端开发
如何解析一个 HTML 文本
【10月更文挑战第23天】在实际应用中,根据具体的需求和场景,我们可以灵活选择解析方法,并结合其他相关技术来实现高效、准确的 HTML 解析。随着网页技术的不断发展,解析 HTML 文本的方法也在不断更新和完善,
|
移动开发 编解码 UED
除了 `<audio>` 和 `<video>` 标签,HTML5 还支持哪些多媒体格式?
【10月更文挑战第19天】HTML5对多种多媒体格式的支持,为网页开发者提供了丰富的选择,能够更好地满足不同类型多媒体内容在网页中的展示和交互需求,提升了网页的用户体验和多媒体应用的多样性。
|
前端开发 程序员
【前端web入门第二天】01 html语法实现列表与表格_合并单元格
本文介绍了HTML中的列表与表格的使用方法。列表包括无序列表(`&lt;ul&gt;`嵌套`&lt;li&gt;`)、有序列表(`&lt;ol&gt;`嵌套`&lt;li&gt;`)和定义列表(`&lt;dl&gt;`嵌套`&lt;dt&gt;`和`&lt;dd&gt;`)。
436 20
|
前端开发 Windows
【前端web入门第一天】02 HTML图片标签 超链接标签 音频标签 视频标签
本文档详细介绍了HTML中的图片、超链接、音频和视频标签的使用方法。首先讲解了`&lt;img&gt;`标签的基本用法及其属性,包括如何使用相对路径和绝对路径。接着介绍了`&lt;a&gt;`标签,用于创建超链接,并展示了如何设置目标页面打开方式。最后,文档还涵盖了如何在网页中嵌入音频和视频文件,包括简化写法及常用属性。
526 13
|
XML 数据格式 Python
Python技巧:将HTML实体代码转换为文本的方法
在选择方法时,考虑到实际的应用场景和需求是很重要的。通常,使用标准库的 `html`模块就足以满足大多数基本需求。对于复杂的HTML文档处理,则可能需要 `BeautifulSoup`。而在特殊场合,或者为了最大限度的控制和定制化,可以考虑正则表达式。
812 12