zoukankan      html  css  js  c++  java
  • JavaMail 发送邮件,以及sina、163、QQ服务器不同的解析结果(附图)

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://haolloyin.blog.51cto.com/1177454/354320

    呼…前面的准备终于为真正实用的 JavaMail 功能、操作——发送邮件打下了基础,现在我们想要把一封正文部分是 HTML 格式、并包含两个附件的复杂邮件发送给指定的收件人。

    JavaMail 中用于发送邮件的类有 Session 类和 Transport 类,当然也少不了 Message 类。它们之间的进行工作的关系和步骤如下:

    各个类的关系与操作流程:

    1、创建一个 Properties 对象,该类在 java.util 包中,以键-值对的形式设置邮件发送中需要用到的传输协议,如 SMTP 协议等;一般的 smtp 服务器都需要用户身份认证,所以这也要设置为 true ,以便向 smtp 服务器提交用户名、密码等信息;

    2、先使用 Session 类中静态的 getInstance() 或getDefaultInstance() 获得自身对象,此时调用这两个方法应该传入上面创建的 Properties 对象;

    3、再用 Session 对象调用 getTransport() 方法获得 Transport 抽象类的具体实现子类对象,如 MimeTransport 类;

    4、将 Sesson 对象作为参数创建 MimeMessage 对象,即一封邮件,前面的文章已经有所讲述;

    5、使用 MimeTransport 对象调用相关方法将 MimeMessage 对象发送出去。

    由于前面的文章已经写了创建各类邮件的代码,所以在这里就直接拿来用而不再编写了,创建邮件的代码放在本文的最后面。我们使用到了上篇文章中的 WithAttachmentMessage 类作为一封邮件,稍稍修改一下 from 和 to 就可以从不同的邮箱发送给不同的邮箱了。

    实现代码:

    1. import java.util.Properties;  
    2.  
    3. import javax.mail.Message;  
    4. import javax.mail.Session;  
    5. import javax.mail.Transport;  
    6. import javax.mail.internet.MimeMessage;  
    7.  
    8. import createMails.WithAttachmentMessage;  
    9. /**  
    10.  * 邮件发送程序  
    11.  * @author haolloyin  
    12.  */ 
    13. public class MessageSender {  
    14.  
    15.     /**  
    16.      * 创建Session对象,此时需要配置传输的协议,是否身份认证  
    17.      */ 
    18.     public Session createSession(String protocol) {  
    19.         Properties property = new Properties();  
    20.         property.setProperty("mail.transport.protocol", protocol);  
    21.         property.setProperty("mail.smtp.auth""true");  
    22.  
    23.         Session session = Session.getInstance(property);  
    24.           
    25.         // 启动JavaMail调试功能,可以返回与SMTP服务器交互的命令信息  
    26.         // 可以从控制台中看一下服务器的响应信息  
    27.         session.setDebug(true);   
    28.         return session;  
    29.     }  
    30.  
    31.     /**  
    32.      * 传入Session、MimeMessage对象,创建 Transport 对象发送邮件  
    33.      */ 
    34.     public void sendMail(Session session, MimeMessage msg) throws Exception {  
    35.           
    36.         // 设置发件人使用的SMTP服务器、用户名、密码  
    37.         String smtpServer = "smtp.sina.com";  
    38.         String user = "test_hao@sina.cn";  
    39.         String pwd = "123456";  
    40.  
    41.         // 由 Session 对象获得 Transport 对象  
    42.         Transport transport = session.getTransport();  
    43.         // 发送用户名、密码连接到指定的 smtp 服务器  
    44.         transport.connect(smtpServer, user, pwd);  
    45.  
    46.         transport.sendMessage(msg, msg.getRecipients(Message.RecipientType.TO));  
    47.         transport.close();  
    48.     }  
    49.  
    50.     // 测试:发送邮件  
    51.     public static void main(String[] args) throws Exception {  
    52.         MessageSender sender = new MessageSender();  
    53.           
    54.         // 指定使用SMTP协议来创建Session对象  
    55.         Session session = sender.createSession("smtp");  
    56.         // 使用前面文章所完成的邮件创建类获得 Message 对象  
    57.         MimeMessage mail = new WithAttachmentMessage().createMessage(session);  
    58.         sender.sendMail(session, mail);  
    59.     }  

    测试发送结果(猜想:不同的 smtp 服务器对于同一邮件会有不同的解析格式、规范):

    1、发送到 163 邮箱

    163 将我们的正文部分的HTML 文本和图片都变成附件了,真奇怪,可能是因为正文是 HTML 格式。

    MailSender01

    MailSender02

    2、发送到 sina 邮箱:

    比 163 邮箱稍好一些,附件有3个,内嵌在 HTML 正文中的图片被当作附件处理了,正文中的纯文本被解析了,可是内嵌在 HTML 中的图片却显示不了。

    MailSender03

    MailSender04

    3、发送到 QQ 邮箱:

    效果与我们预期的完全一致!附件有两个,正文文本、图片全部正确解析并显示出来。

    MailSender05

    PK结果:

    目前浅显的来看,应该是 QQ 邮箱最厉害了,此外,QQ 邮箱接收邮件的速度最快,不行可以试一试。当然,安全性什么的就不能从此处有所了解了。

    深入:

    由于在代码中开启了 JavaMail API 的调试功能,所以可以从控制台输出的响应信息中了解到更多的信息,特别是关于上面不同 smtp 服务器解析同一封邮件的过程,它可能跟我们传输、发送过去的具体过程有关。

    小结:

    现在回想起来,前面使用 telnet 程序在控制台中麻烦地手工发送纯文本邮件是多么低效。JavaMail API 将这一切与底层协作的过程、操作都封装掉了,这就是软件开发的目的吧。

    本文使用到上一篇文章中的程序代码:

    1. import java.io.FileOutputStream;  
    2. import java.util.Properties;  
    3.  
    4. import javax.activation.DataHandler;  
    5. import javax.activation.FileDataSource;  
    6. import javax.mail.Message;  
    7. import javax.mail.Session;  
    8. import javax.mail.internet.InternetAddress;  
    9. import javax.mail.internet.MimeBodyPart;  
    10. import javax.mail.internet.MimeMessage;  
    11. import javax.mail.internet.MimeMultipart;  
    12.  
    13. /**  
    14.  * 创建内含附件、图文并茂的邮件  
    15.  * @author haolloyin  
    16.  */ 
    17. public class WithAttachmentMessage {  
    18.  
    19.     /**  
    20.      * 根据传入的文件路径创建附件并返回  
    21.      */ 
    22.     public MimeBodyPart createAttachment(String fileName) throws Exception {  
    23.         MimeBodyPart attachmentPart = new MimeBodyPart();  
    24.         FileDataSource fds = new FileDataSource(fileName);  
    25.         attachmentPart.setDataHandler(new DataHandler(fds));  
    26.         attachmentPart.setFileName(fds.getName());  
    27.         return attachmentPart;  
    28.     }  
    29.  
    30.     /**  
    31.      * 根据传入的邮件正文body和文件路径创建图文并茂的正文部分  
    32.      */ 
    33.     public MimeBodyPart createContent(String body, String fileName)  
    34.             throws Exception {  
    35.         // 用于保存最终正文部分  
    36.         MimeBodyPart contentBody = new MimeBodyPart();  
    37.         // 用于组合文本和图片,"related"型的MimeMultipart对象  
    38.         MimeMultipart contentMulti = new MimeMultipart("related");  
    39.  
    40.         // 正文的文本部分  
    41.         MimeBodyPart textBody = new MimeBodyPart();  
    42.         textBody.setContent(body, "text/html;charset=gbk");  
    43.         contentMulti.addBodyPart(textBody);  
    44.  
    45.         // 正文的图片部分  
    46.         MimeBodyPart jpgBody = new MimeBodyPart();  
    47.         FileDataSource fds = new FileDataSource(fileName);  
    48.         jpgBody.setDataHandler(new DataHandler(fds));  
    49.         jpgBody.setContentID("logo_jpg");  
    50.         contentMulti.addBodyPart(jpgBody);  
    51.  
    52.         // 将上面"related"型的 MimeMultipart 对象作为邮件的正文  
    53.         contentBody.setContent(contentMulti);  
    54.         return contentBody;  
    55.     }  
    56.  
    57.     /**  
    58.      * 根据传入的 Seesion 对象创建混合型的 MIME消息  
    59.      */ 
    60.     public MimeMessage createMessage(Session session) throws Exception {  
    61.  
    62.         String from = "test_hao@sina.cn";  
    63.         String to = "test_hao@163.com";  
    64.           
    65.         String subject = "创建内含附件、图文并茂的邮件!";  
    66.         String body = "<h4>内含附件、图文并茂的邮件测试!!!</h4> </br>" 
    67.                 + "<a href = http://haolloyin.blog.51cto.com/> 蚂蚁</a></br>" 
    68.                 + "<img src = \"cid:logo_jpg\"></a>";  
    69.  
    70.         MimeMessage msg = new MimeMessage(session);  
    71.         msg.setFrom(new InternetAddress(from));  
    72.         msg.setRecipient(Message.RecipientType.TO, new InternetAddress(to));  
    73.         msg.setSubject(subject);  
    74.  
    75.         // 创建邮件的各个 MimeBodyPart 部分  
    76.         MimeBodyPart attachment01 = createAttachment("F:\\java\\Hello_JavaMail.java");  
    77.         MimeBodyPart attachment02 = createAttachment("F:\\java\\Hello_JavaMail.7z");  
    78.         MimeBodyPart content = createContent(body, "F:\\java\\logo.jpg");  
    79.  
    80.         // 将邮件中各个部分组合到一个"mixed"型的 MimeMultipart 对象  
    81.         MimeMultipart allPart = new MimeMultipart("mixed");  
    82.         allPart.addBodyPart(attachment01);  
    83.         allPart.addBodyPart(attachment02);  
    84.         allPart.addBodyPart(content);  
    85.  
    86.         // 将上面混合型的 MimeMultipart 对象作为邮件内容并保存  
    87.         msg.setContent(allPart);  
    88.         msg.saveChanges();  
    89.         return msg;  
    90.     }  
    91.  
    92.     // 测试生成邮件  
    93.     public static void main(String[] args) throws Exception {  
    94.         WithAttachmentMessage mail = new WithAttachmentMessage();  
    95.         Session session = Session.getDefaultInstance(new Properties());  
    96.         MimeMessage message = mail.createMessage(session);  
    97.         message.writeTo(new FileOutputStream("withAttachmentMail.eml"));  
    98.     }  

    我的相关文章:

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

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

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

    JavaMail:创建内含附件、图文并茂的邮件

    本文出自 “蚂蚁” 博客,请务必保留此出处http://haolloyin.blog.51cto.com/1177454/354320

  • 相关阅读:
    别人走的路-1
    抽象类跟接口的区别
    一个类实现多个接口的demo
    servlet+jdbc+javabean其实跟ssh差不多
    什么是shell
    设置cookie倒计时让让表单自动提交
    变量、基本数据类型
    编程语言、添加环境变量、变量
    Java优先队列一些问题
    JavaScript学习-JSON
  • 原文地址:https://www.cnblogs.com/moonciki/p/8145867.html
Copyright © 2011-2022 走看看