JavaMail入门:创建纯文本、HTML格式的邮件
转自: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 开发文档,下面用代码实现创建一个纯文本格式的邮件:
纯文本格式的邮件:
- import java.io.FileOutputStream;
- import java.util.Date;
- import java.util.Properties;
- import javax.mail.Message;
- import javax.mail.Session;
- import javax.mail.internet.InternetAddress;
- import javax.mail.internet.MimeMessage;
- /**
- * 创建纯文本格式的邮件,保存为Outlook 的 ".eml" 邮件格式
- * @author haolloyin
- */
- public class TextMessage {
- public static void main(String[] args) throws Exception{
- String from = "test_hao@sina.cn";
- String to = "test_hao@163.com";
- String subject = "创建一个纯文本邮件!";
- String body = "纯文本邮件测试!!!";
- // 创建该邮件应用程序所需的环境信息以及会话信息
- Session session = Session.getDefaultInstance(new Properties());
- // 根据上面的 Session 实例创建 MimeMessage 实例,即一封邮件
- MimeMessage msg = new MimeMessage(session);
- // 设置发件人地址
- msg.setFrom(new InternetAddress(from));
- // 设置收件人地址
- msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
- // 设置 E-mail 主题
- msg.setSubject(subject);
- // 设置发送时间
- msg.setSentDate(new Date());
- // 设置 E-mail 正文部分
- msg.setText(body);
- // 必须保存对该 MimeMessage 实例的更改
- msg.saveChanges();
- // 将 msg 对象中内容写入当前文件的textMail.eml文件中
- msg.writeTo(new FileOutputStream("textMail.eml"));
- }
- }
编译运行,得到 textMail.eml 文件,双击自动用 Outlook 打开,如下图:


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

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

因为邮件中的 subject 和 body 都用到了中文,所以字符集编码时 charset=GBK 。
HTML 格式的邮件:
再用同样的方式创建一封 HTML 格式的邮件,对上面的代码稍作修改即可,代码如下:
- import java.io.FileOutputStream;
- import java.util.Date;
- import java.util.Properties;
- import javax.mail.Message;
- import javax.mail.Session;
- import javax.mail.internet.InternetAddress;
- import javax.mail.internet.MimeMessage;
- /**
- * 创建 HTML 格式的邮件,保存为 Outlook 的 ".eml" 文件
- * @author haolloyin
- */
- public class HtmlMessage {
- public static void main(String[] args) throws Exception{
- String from = "test_hao@sina.cn";
- String to = "test_hao@163.com";
- String subject = "创建一个 HTML 格式邮件!";
- String body = "<h4>HTML 格式的邮件测试!!!</h4> " +
- "<a href = http://haolloyin.blog.51cto.com/> 蚂蚁</a>";
- // 创建该邮件应用程序所需的环境信息以及会话信息
- Session session = Session.getDefaultInstance(new Properties());
- // 根据上面的 Session 实例创建 MimeMessage 实例,即一封邮件
- MimeMessage msg = new MimeMessage(session);
- // 设置发件人地址
- msg.setFrom(new InternetAddress(from));
- // 设置收件人地址
- msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
- // 设置 E-mail 主题
- msg.setSubject(subject);
- // 设置发送时间
- msg.setSentDate(new Date());
- // 设置 E-mail 正文部分
- // msg.setText(body);
- msg.setContent(body, "text/html;charset = gbk");
- // 保存对该 MimeMessage 实例的更改
- msg.saveChanges();
- // 将 msg 对象中内容写入文件
- msg.writeTo(new FileOutputStream("htmlMail.eml"));
- }
- }
注意上面代码中的 msg.setContent(body, "text/html;charset = gbk"); 语句,双击生成的文件自动用 Outlook 打开,如下图:



我们注意到编码方式变成了 quoted-printable ,它与 BASE64 编码类似,都是将纯粹的二进制数据转换成可以打印的 ASCII 字符,具体的区别和用途请查阅资料。
目前的还不可以给指定的邮箱发送邮件,只是创建一封邮件而已。
小结:
1、了解 MIME 协议以及 MIME 邮件的组织结构对理解上面给出的类图很有帮助;
2、如果邮件的 subject 和 body 都不涉及中文,那么整封邮件都不会被转码,而是用最原始的 7bit 编码格式,可以试一试看一下效果。
我的相关文章:
JavaMail入门:创建纯文本、HTML格式的邮件的更多相关文章
- 创建纯文本Banner
场景: 最近再学习Spring Boot的过程中,想要自定义一个Banner,就是再工程启动是输出的那个文本图案,但是自己拼写既麻烦又不好看,所以找到一个工具,自动输出文字代表的纯文本Banner,例 ...
- [Java] JavaMail 发送带图片的 html 格式的邮件
JavaMail 发送的邮件正文和附件是相互独立的,但是内置图片需要定位图片在正文中的位置,所以内置图片和邮件正文是互相依赖的. 发送带附件的邮件可参考JavaMail 发送 html 格式.带附件的 ...
- JavaMail入门第二篇 创建邮件
JavaMail API使用javax.mail.Message类来表示一封邮件,Message类是一个抽象类,所以我们需要使用其子类javax.mail.internet.MimeMessage类来 ...
- javamail邮件Multipart支持同时发text和html混合消息,alternative纯文本与超文本共存
javamail邮件Multipart支持同时发text和html混合消息alternative纯文本与超文本共存 multipart/mixed:附件. multipart/related:内嵌资源 ...
- java 发送 mail 纯文本发送和html格式发送
一:需要引入mail maven jar包 <!--邮件发送包--> <dependency> <groupId>javax.mail</groupId> ...
- [No0000168]Excle只允许用户输入纯文本,禁止用户修改单元格样式、格式等
背景:自己的模板给别人,让他填完信息上传到系统里,但别人经常不按模板的格式来填写,导致无法程序自动化.能不能在模板上把格式锁住,只允许输入纯文本,但不能改格式? 方法: 步骤一,创建你要的模板 其中, ...
- SPOOL 命令使用实例【oracle导出纯文本格式文件】
SPOOL 命令使用实例[oracle导出纯文本格式文件] SET echo off --在用start命令执行一个sql脚本时,是否显示脚本中正在执行的SQL语句: SET ...
- C++入门经典-例8.9-抽象类,纯虚函数,创建纯虚函数
1:包含有纯虚函数的类称为抽象类,一个抽象类至少具有一个纯虚函数.抽象类只能作为基类派生出的新的子类,而不能在程序中被实例化(即不能说明抽象类的对象),但是可以使用指向抽象类的指针.在程序开发过程中并 ...
- james+javamail入门
James+Javamail构建邮件服务(一) 本文描述如何使用James搭建具备一定邮件过滤.邮件操作功能的邮件服务器,以及使用Javamail实现对James服务器邮件的收发功能. 1关于Jame ...
随机推荐
- 2015多校第6场 HDU 5355 Cake 贪心,暴力DFS
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5355 题意:给你n个尺寸大小分别为1,2,3,…,n的蛋糕,要求你分成m份,要求每份中所有蛋糕的大小之 ...
- Lambda 表达式 in java 8
Lambda 表达式 in Java 8 Lambda表达式是java 8 新增的特性 Lambda表达式主要作用:支持将代码块作为方法参数,允许使用更简洁的代码创建函数式接口的实例,是匿名内部类的一 ...
- 网站服务器压力Web性能测试(4):服务器压力Web性能测试小结
1.Apache Bench,Webbench,http_load对网站压力Web性能进行测试时,为了得到更加客观和准确的数值,应该从远程访问.局域网访问和本地等多个方面进行全方位的测试.一般用127 ...
- sql查询语句查询顺序
一 SELECT语句关键字的定义顺序 SELECT DISTINCT <select_list> FROM <left_table> <join_type> JOI ...
- Fel表达式使用过程中需要注意的问题
精度问题: 我们知道java中直接使用float和double参与的计算都可能会产生精度问题,比如0.1+0.3.1.0-0.9 等.所以一般财务系统,都会使用BigDecimal进行加减乘除. 在调 ...
- ORM数据库查询操作之基于双下划线的跨表查询
创建表结构 from django.db import models class Book(models.Model): title=models.CharField(max_length=32) ...
- Efficient Graph-Based Image Segmentation
转:http://blog.csdn.net/asongoficeandfire/article/details/8434799 Efficient Graph-Based Image Segment ...
- virtualbox测试k8s要注意的情况
想在virtualBox上测试k8s,遇到两个情况要注意.. 第一是flannel和dashborad起不起来,master都无法正常..这时可以想办法把Iptables,selinux,firewa ...
- 通过百度地图API获取经纬度以及两点间距离
package com.baidumap; import java.io.BufferedReader; import java.io.IOException; import java.io.Inpu ...
- ASP.NET MVC5(一)—— URL路由
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...