`

JavaMail:邮件发送以及sina、163、QQ服务器不同的解析结果

 
阅读更多
呼…前面的准备终于为真正实用的 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. importjava.util.Properties;
  2. importjavax.mail.Message;
  3. importjavax.mail.Session;
  4. importjavax.mail.Transport;
  5. importjavax.mail.internet.MimeMessage;
  6. importcreateMails.WithAttachmentMessage;
  7. /**
  8. *邮件发送程序
  9. *@authorhaolloyin
  10. */
  11. publicclassMessageSender{
  12. /**
  13. *创建Session对象,此时需要配置传输的协议,是否身份认证
  14. */
  15. publicSessioncreateSession(Stringprotocol){
  16. Propertiesproperty=newProperties();
  17. property.setProperty("mail.transport.protocol",protocol);
  18. property.setProperty("mail.smtp.auth","true");
  19. Sessionsession=Session.getInstance(property);
  20. //启动JavaMail调试功能,可以返回与SMTP服务器交互的命令信息
  21. //可以从控制台中看一下服务器的响应信息
  22. session.setDebug(true);
  23. returnsession;
  24. }
  25. /**
  26. *传入Session、MimeMessage对象,创建Transport对象发送邮件
  27. */
  28. publicvoidsendMail(Sessionsession,MimeMessagemsg)throwsException{
  29. //设置发件人使用的SMTP服务器、用户名、密码
  30. StringsmtpServer="smtp.sina.com";
  31. Stringuser="test_hao@sina.cn";
  32. Stringpwd="123456";
  33. //由Session对象获得Transport对象
  34. Transporttransport=session.getTransport();
  35. //发送用户名、密码连接到指定的smtp服务器
  36. transport.connect(smtpServer,user,pwd);
  37. transport.sendMessage(msg,msg.getRecipients(Message.RecipientType.TO));
  38. transport.close();
  39. }
  40. //测试:发送邮件
  41. publicstaticvoidmain(String[]args)throwsException{
  42. MessageSendersender=newMessageSender();
  43. //指定使用SMTP协议来创建Session对象
  44. Sessionsession=sender.createSession("smtp");
  45. //使用前面文章所完成的邮件创建类获得Message对象
  46. MimeMessagemail=newWithAttachmentMessage().createMessage(session);
  47. sender.sendMail(session,mail);
  48. }
  49. }

测试发送结果(猜想:不同的 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. importjava.io.FileOutputStream;
  2. importjava.util.Properties;
  3. importjavax.activation.DataHandler;
  4. importjavax.activation.FileDataSource;
  5. importjavax.mail.Message;
  6. importjavax.mail.Session;
  7. importjavax.mail.internet.InternetAddress;
  8. importjavax.mail.internet.MimeBodyPart;
  9. importjavax.mail.internet.MimeMessage;
  10. importjavax.mail.internet.MimeMultipart;
  11. /**
  12. *创建内含附件、图文并茂的邮件
  13. *@authorhaolloyin
  14. */
  15. publicclassWithAttachmentMessage{
  16. /**
  17. *根据传入的文件路径创建附件并返回
  18. */
  19. publicMimeBodyPartcreateAttachment(StringfileName)throwsException{
  20. MimeBodyPartattachmentPart=newMimeBodyPart();
  21. FileDataSourcefds=newFileDataSource(fileName);
  22. attachmentPart.setDataHandler(newDataHandler(fds));
  23. attachmentPart.setFileName(fds.getName());
  24. returnattachmentPart;
  25. }
  26. /**
  27. *根据传入的邮件正文body和文件路径创建图文并茂的正文部分
  28. */
  29. publicMimeBodyPartcreateContent(Stringbody,StringfileName)
  30. throwsException{
  31. //用于保存最终正文部分
  32. MimeBodyPartcontentBody=newMimeBodyPart();
  33. //用于组合文本和图片,"related"型的MimeMultipart对象
  34. MimeMultipartcontentMulti=newMimeMultipart("related");
  35. //正文的文本部分
  36. MimeBodyParttextBody=newMimeBodyPart();
  37. textBody.setContent(body,"text/html;charset=gbk");
  38. contentMulti.addBodyPart(textBody);
  39. //正文的图片部分
  40. MimeBodyPartjpgBody=newMimeBodyPart();
  41. FileDataSourcefds=newFileDataSource(fileName);
  42. jpgBody.setDataHandler(newDataHandler(fds));
  43. jpgBody.setContentID("logo_jpg");
  44. contentMulti.addBodyPart(jpgBody);
  45. //将上面"related"型的MimeMultipart对象作为邮件的正文
  46. contentBody.setContent(contentMulti);
  47. returncontentBody;
  48. }
  49. /**
  50. *根据传入的Seesion对象创建混合型的MIME消息
  51. */
  52. publicMimeMessagecreateMessage(Sessionsession)throwsException{
  53. Stringfrom="test_hao@sina.cn";
  54. Stringto="test_hao@163.com";
  55. Stringsubject="创建内含附件、图文并茂的邮件!";
  56. Stringbody="<h4>内含附件、图文并茂的邮件测试!!!</h4></br>"
  57. +"<ahref=http://haolloyin.blog.51cto.com/>蚂蚁</a></br>"
  58. +"<imgsrc=\"cid:logo_jpg\"></a>";
  59. MimeMessagemsg=newMimeMessage(session);
  60. msg.setFrom(newInternetAddress(from));
  61. msg.setRecipient(Message.RecipientType.TO,newInternetAddress(to));
  62. msg.setSubject(subject);
  63. //创建邮件的各个MimeBodyPart部分
  64. MimeBodyPartattachment01=createAttachment("F:\\java\\Hello_JavaMail.java");
  65. MimeBodyPartattachment02=createAttachment("F:\\java\\Hello_JavaMail.7z");
  66. MimeBodyPartcontent=createContent(body,"F:\\java\\logo.jpg");
  67. //将邮件中各个部分组合到一个"mixed"型的MimeMultipart对象
  68. MimeMultipartallPart=newMimeMultipart("mixed");
  69. allPart.addBodyPart(attachment01);
  70. allPart.addBodyPart(attachment02);
  71. allPart.addBodyPart(content);
  72. //将上面混合型的MimeMultipart对象作为邮件内容并保存
  73. msg.setContent(allPart);
  74. msg.saveChanges();
  75. returnmsg;
  76. }
  77. //测试生成邮件
  78. publicstaticvoidmain(String[]args)throwsException{
  79. WithAttachmentMessagemail=newWithAttachmentMessage();
  80. Sessionsession=Session.getDefaultInstance(newProperties());
  81. MimeMessagemessage=mail.createMessage(session);
  82. message.writeTo(newFileOutputStream("withAttachmentMail.eml"));
  83. }
  84. }
分享到:
评论

相关推荐

    javaMail发送邮件 发送成功 收不到邮件 或收到邮件无主题无收件人乱码

    在使用JavaMail进行邮件发送的过程中,可能会遇到以下几种常见问题:发送成功但收件方未收到邮件、邮件收到后无主题或无收件人信息以及邮件内容出现乱码等情况。本文将详细探讨这些问题的原因及相应的解决方案。 ##...

    关于用javamail发送邮件时,由于邮件服务器要SSL,解决办法

    在尝试使用JavaMail发送邮件时,如果邮件服务器要求使用SSL(Secure Socket Layer)或TLS(Transport Layer Security)协议来确保通信安全,开发者可能会遇到一些挑战。本文将深入探讨如何解决这一问题,主要基于...

    javamail实现邮件的发送(使用QQ,163)

    javamail实现的邮件发送功能,内含完整代码和jar包,邮件服务协议smtp,pop3,用javamail发送邮件,支持QQ,163邮件发送。相同邮件(QQ邮箱给QQ邮箱)和不同邮件(QQ邮箱给163邮箱)是不一样的。

    JavaMail发送邮件的例子

    下面我们将深入探讨JavaMail的基本概念、如何使用JavaMail发送邮件以及在Struts2框架中的实现方式。 JavaMail API主要包括以下组件: 1. `javax.mail.Session`:是JavaMail的核心,负责配置邮件服务器的信息,如...

    使用JAVAMail代发邮件

    这个类称为 MailInfo,包含了邮件的各种信息,例如邮件服务器的主机名和端口号、邮件发送者的地址、邮件接收者的地址、邮件主题、邮件内容、邮件附件等。 在 MailInfo 类中,我们定义了多个成员变量,用于存储邮件...

    常规JavaMail 邮件发送实用类

    在Java编程领域,JavaMail API是一个非常重要的工具,它允许开发者通过编程方式发送电子邮件。"常规JavaMail 邮件发送实用类"标题所指的,通常是一个自定义的Java类,封装了JavaMail API的基本操作,使得邮件发送变...

    用javaMail发送邮件

    开发者可以通过这些接口来设置邮件服务器信息,创建邮件内容,以及发送邮件。 `activation.jar` 则是JavaBeans Activation Framework(JAF)的一部分,主要用于处理MIME类型的对象。在邮件系统中,邮件内容可能包含...

    javamail发送邮件.zip

    这个“javamail发送邮件.zip”压缩包显然包含了一个示例项目,演示如何使用JavaMail API发送包含正文文本、图片以及附件的邮件。以下是对这个主题的详细解释: 1. **JavaMail API**: JavaMail API 是一组接口和类...

    javamail 回执邮件资料

    JavaMail 是一个开源的 Java 库,用于处理电子邮件的发送和接收。它提供了与 SMTP、POP3 和 IMAP 协议交互的接口,是开发基于 Java 的电子邮件应用的基础。回执邮件是邮件服务中的一项功能,它允许发件人在发送邮件...

    javamail实现邮箱与邮箱发送邮件

    本示例将重点介绍如何使用JavaMail库来实现163邮箱向腾讯邮件发送邮件的流程。 首先,确保你的项目中已经包含了JavaMail所需的依赖。通常,这可以通过在Maven或Gradle的构建文件中添加对应的依赖完成。例如,如果你...

    james和javamail实现邮件收发(带发送附件)

    JavaMail API支持MIME(多用途互联网邮件扩展)格式,这使得我们能够处理包括文本、图片、音频、视频以及各种其他类型在内的复杂邮件内容,包括附件。 下面是一个简化的JavaMail发送邮件的过程: 1. **配置邮件...

    javaMail 发邮件

    JavaMail 是一个强大的开源库,专门用于在Java应用程序中发送和接收电子邮件。它提供了丰富的API,使得开发者可以方便地处理SMTP、POP3和IMAP等邮件协议。在JavaMail中,我们可以实现各种复杂的邮件功能,如添加附件...

    自己写的一个基于Javamail的邮件发送客户端

    下面我们将详细探讨 JavaMail 的核心概念以及如何实现邮件发送客户端。 1. **JavaMail API**: JavaMail 提供了一组接口和类,用于处理邮件服务器的通信。它支持 SMTP(简单邮件传输协议)用于发送邮件,POP3(邮局...

    JavaMail邮件发送Deom

    在JavaMail中,JAF用于解析和处理邮件中的不同内容类型,如文本、图片、附件等。 mail.jar则是JavaMail的主要库,包含了处理SMTP(简单邮件传输协议)、POP3(邮局协议)和IMAP(因特网消息访问协议)等邮件服务所...

    基于Javamail的邮件收发系统.zip

    基于Javamail的邮件收发系统.zip基于Javamail的邮件收发系统.zip基于Javamail的邮件收发系统.zip基于Javamail的邮件收发系统.zip基于Javamail的邮件收发系统.zip基于Javamail的邮件收发系统.zip基于Javamail的邮件...

    JavaMail发送邮件(文本、html、附件)

    这个标题"JavaMail发送邮件(文本、html、附件)"涵盖了使用JavaMail API发送不同格式邮件的核心功能。下面将详细介绍如何利用JavaMail发送文本、HTML和包含附件的邮件,以及在实际应用中需要注意的配置步骤。 1. *...

    javamail 邮件解析、接收、发送程序

    很好的邮件处理代码,1.5版本,作为build path放在eclipse里面,就可以用啦! oracle官方推的,很好!jdk1.6版本以上用起来很方便。

    javamail实现邮件发送(支持多接收人、多附件)

    本教程将详细讲解如何使用 JavaMail 实现邮件发送功能,包括支持多个接收人、抄送人以及添加多个附件。 首先,确保你已经添加了 JavaMail 的依赖库到你的项目中。如果是 Maven 项目,可以在 pom.xml 文件中添加以下...

    Android 使用javamail发送邮件

    总的来说,"Android使用javamail发送邮件"这个主题涵盖了Android平台上利用JavaMail API实现邮件发送的基本流程和注意事项,包括设置SMTP服务器、构建邮件消息、处理附件以及可能的安全性和用户体验优化。...

    Javamail 简单邮件发送

    本文将深入探讨如何使用JavaMail进行简单邮件发送,以及其支持的配置和附件功能。 首先,发送邮件的基本流程涉及到以下几个步骤: 1. **配置邮件会话**:JavaMail API中的`Properties`类用于存储邮件服务器的相关...

Global site tag (gtag.js) - Google Analytics