zoukankan      html  css  js  c++  java
  • 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 架构层次图:

    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 编码格式,可以试一试看一下效果。

    我的相关文章:

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

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

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

  • 相关阅读:
    AtCoder Grand Contest 033
    Luogu P6620 [省选联考 2020 A 卷] 组合数问题
    Luogu P6631 [ZJOI2020] 序列
    Luogu P6630 [ZJOI2020] 传统艺能
    Luogu P6633 [ZJOI2020] 抽卡
    Luogu P6623 [省选联考 2020 A 卷] 树
    AtCoder Grand Contest 034
    Luogu P5445 [APIO2019] 路灯
    LOJ #6059. 「2017 山东一轮集训 Day1」Sum
    Luogu P3721 [AH2017/HNOI2017]单旋
  • 原文地址:https://www.cnblogs.com/x_wukong/p/4432420.html
Copyright © 2011-2022 走看看