https://www.cnblogs.com/xdp-gacl/p/4216311.html

一、RFC882文档简单说明

  RFC882文档规定了如何编写一封简单的邮件(纯文本邮件),一封简单的邮件包含邮件头和邮件体两个部分,邮件头和邮件体之间使用空行分隔。

  邮件头包含的内容有:

  1. from字段   --用于指明发件人
  2. to字段       --用于指明收件人
  3. subject字段  --用于说明邮件主题
  4. cc字段      -- 抄送,将邮件发送给收件人的同时抄送给另一个收件人,收件人可以看到邮件抄送给了谁
  5. bcc字段    -- 密送,将邮件发送给收件人的同时将邮件秘密发送给另一个收件人,收件人无法看到邮件密送给了谁

  邮件体指的就是邮件的具体内容。

二、MIME协议简单介绍

  在我们的实际开发当中,一封邮件既可能包含图片,又可能包含有附件,在这样的情况下,RFC882文档规定的邮件格式就无法满足要求了。

  MIME协议是对RFC822文档的升级和补充,它描述了如何生产一封复杂的邮件。通常我们把MIME协议描述的邮件称之为MIME邮件MIME协议描述的数据称之为MIME消息。
  对于一封复杂邮件,如果包含了多个不同的数据,MIME协议规定了要使用分隔线对多段数据进行分隔,并使用Content-Type头字段对数据的类型、以及多个数据之间的关系进行描述。

三、使用JavaMail创建邮件和发送邮件

  JavaMail创建的邮件是基于MIME协议的。因此可以使用JavaMail创建出包含图片,包含附件的复杂邮件。

3.1、JavaMail API的简单介绍

3.2、创建邮件发送测试项目

3.3、发送一封只包含文本的简单邮件

  1. package me.gacl.main;
  2.  
  3. import java.util.Properties;
  4. import javax.mail.Message;
  5. import javax.mail.Session;
  6. import javax.mail.Transport;
  7. import javax.mail.internet.InternetAddress;
  8. import javax.mail.internet.MimeMessage;
  9.  
  10. /**
  11. * @ClassName: Sendmail
  12. * @Description: 发送Email
  13. * @author: 孤傲苍狼
  14. * @date: 2015-1-12 下午9:42:56
  15. *
  16. */
  17. public class Sendmail {
  18.  
  19. /**
  20. * @param args
  21. * @throws Exception
  22. */
  23. public static void main(String[] args) throws Exception {
  24.  
  25. Properties prop = new Properties();
  26. prop.setProperty("mail.host", "smtp.sohu.com");
  27. prop.setProperty("mail.transport.protocol", "smtp");
  28. prop.setProperty("mail.smtp.auth", "true");
  29. //使用JavaMail发送邮件的5个步骤
  30. //1、创建session
  31. Session session = Session.getInstance(prop);
  32. //开启Session的debug模式,这样就可以查看到程序发送Email的运行状态
  33. session.setDebug(true);
  34. //2、通过session得到transport对象
  35. Transport ts = session.getTransport();
  36. //3、使用邮箱的用户名和密码连上邮件服务器,发送邮件时,发件人需要提交邮箱的用户名和密码给smtp服务器,用户名和密码都通过验证之后才能够正常发送邮件给收件人。
  37. ts.connect("smtp.sohu.com", "gacl", "邮箱密码");
  38. //4、创建邮件
  39. Message message = createSimpleMail(session);
  40. //5、发送邮件
  41. ts.sendMessage(message, message.getAllRecipients());
  42. ts.close();
  43. }
  44.  
  45. /**
  46. * @Method: createSimpleMail
  47. * @Description: 创建一封只包含文本的邮件
  48. * @Anthor:孤傲苍狼
  49. *
  50. * @param session
  51. * @return
  52. * @throws Exception
  53. */
  54. public static MimeMessage createSimpleMail(Session session)
  55. throws Exception {
  56. //创建邮件对象
  57. MimeMessage message = new MimeMessage(session);
  58. //指明邮件的发件人
  59. message.setFrom(new InternetAddress("gacl@sohu.com"));
  60. //指明邮件的收件人,现在发件人和收件人是一样的,那就是自己给自己发
  61. message.setRecipient(Message.RecipientType.TO, new InternetAddress("gacl@sohu.com"));
  62. //邮件的标题
  63. message.setSubject("只包含文本的简单邮件");
  64. //邮件的文本内容
  65. message.setContent("你好啊!", "text/html;charset=UTF-8");
  66. //返回创建好的邮件对象
  67. return message;
  68. }
  69. }

  

3.4、发送包含内嵌图片的邮件

  1. package me.gacl.main;
  2.  
  3. import java.io.FileOutputStream;
  4. import java.util.Properties;
  5.  
  6. import javax.activation.DataHandler;
  7. import javax.activation.FileDataSource;
  8. import javax.mail.Message;
  9. import javax.mail.Session;
  10. import javax.mail.Transport;
  11. import javax.mail.internet.InternetAddress;
  12. import javax.mail.internet.MimeBodyPart;
  13. import javax.mail.internet.MimeMessage;
  14. import javax.mail.internet.MimeMultipart;
  15.  
  16. /**
  17. * @ClassName: Sendmail
  18. * @Description: 发送Email
  19. * @author: 孤傲苍狼
  20. * @date: 2015-1-12 下午9:42:56
  21. *
  22. */
  23. public class Sendmail {
  24.  
  25. /**
  26. * @param args
  27. * @throws Exception
  28. */
  29. public static void main(String[] args) throws Exception {
  30.  
  31. Properties prop = new Properties();
  32. prop.setProperty("mail.host", "smtp.sohu.com");
  33. prop.setProperty("mail.transport.protocol", "smtp");
  34. prop.setProperty("mail.smtp.auth", "true");
  35. //使用JavaMail发送邮件的5个步骤
  36. //1、创建session
  37. Session session = Session.getInstance(prop);
  38. //开启Session的debug模式,这样就可以查看到程序发送Email的运行状态
  39. session.setDebug(true);
  40. //2、通过session得到transport对象
  41. Transport ts = session.getTransport();
  42. //3、连上邮件服务器,需要发件人提供邮箱的用户名和密码进行验证
  43. ts.connect("smtp.sohu.com", "gacl", "邮箱密码");
  44. //4、创建邮件
  45. Message message = createImageMail(session);
  46. //5、发送邮件
  47. ts.sendMessage(message, message.getAllRecipients());
  48. ts.close();
  49. }
  50.  
  51. /**
  52. * @Method: createImageMail
  53. * @Description: 生成一封邮件正文带图片的邮件
  54. * @Anthor:孤傲苍狼
  55. *
  56. * @param session
  57. * @return
  58. * @throws Exception
  59. */
  60. public static MimeMessage createImageMail(Session session) throws Exception {
  61. //创建邮件
  62. MimeMessage message = new MimeMessage(session);
  63. // 设置邮件的基本信息
  64. //发件人
  65. message.setFrom(new InternetAddress("gacl@sohu.com"));
  66. //收件人
  67. message.setRecipient(Message.RecipientType.TO, new InternetAddress("xdp_gacl@sina.cn"));
  68. //邮件标题
  69. message.setSubject("带图片的邮件");
  70.  
  71. // 准备邮件数据
  72. // 准备邮件正文数据
  73. MimeBodyPart text = new MimeBodyPart();
  74. text.setContent("这是一封邮件正文带图片<img src='cid:xxx.jpg'>的邮件", "text/html;charset=UTF-8");
  75. // 准备图片数据
  76. MimeBodyPart image = new MimeBodyPart();
  77. DataHandler dh = new DataHandler(new FileDataSource("src\\1.jpg"));
  78. image.setDataHandler(dh);
  79. image.setContentID("xxx.jpg");
  80. // 描述数据关系
  81. MimeMultipart mm = new MimeMultipart();
  82. mm.addBodyPart(text);
  83. mm.addBodyPart(image);
  84. mm.setSubType("related");
  85.  
  86. message.setContent(mm);
  87. message.saveChanges();
  88. //将创建好的邮件写入到E盘以文件的形式进行保存
  89. message.writeTo(new FileOutputStream("E:\\ImageMail.eml"));
  90. //返回创建好的邮件
  91. return message;
  92. }
  93. }

  

3.5、发送包含附件的邮件

  1. package me.gacl.main;
  2.  
  3. import java.io.FileOutputStream;
  4. import java.util.Properties;
  5.  
  6. import javax.activation.DataHandler;
  7. import javax.activation.FileDataSource;
  8. import javax.mail.Message;
  9. import javax.mail.Session;
  10. import javax.mail.Transport;
  11. import javax.mail.internet.InternetAddress;
  12. import javax.mail.internet.MimeBodyPart;
  13. import javax.mail.internet.MimeMessage;
  14. import javax.mail.internet.MimeMultipart;
  15.  
  16. /**
  17. * @ClassName: Sendmail
  18. * @Description: 发送Email
  19. * @author: 孤傲苍狼
  20. * @date: 2015-1-12 下午9:42:56
  21. *
  22. */
  23. public class Sendmail {
  24.  
  25. /**
  26. * @param args
  27. * @throws Exception
  28. */
  29. public static void main(String[] args) throws Exception {
  30.  
  31. Properties prop = new Properties();
  32. prop.setProperty("mail.host", "smtp.sohu.com");
  33. prop.setProperty("mail.transport.protocol", "smtp");
  34. prop.setProperty("mail.smtp.auth", "true");
  35. //使用JavaMail发送邮件的5个步骤
  36. //1、创建session
  37. Session session = Session.getInstance(prop);
  38. //开启Session的debug模式,这样就可以查看到程序发送Email的运行状态
  39. session.setDebug(true);
  40. //2、通过session得到transport对象
  41. Transport ts = session.getTransport();
  42. //3、连上邮件服务器
  43. ts.connect("smtp.sohu.com", "gacl", "邮箱密码");
  44. //4、创建邮件
  45. Message message = createAttachMail(session);
  46. //5、发送邮件
  47. ts.sendMessage(message, message.getAllRecipients());
  48. ts.close();
  49. }
  50.  
  51. /**
  52. * @Method: createAttachMail
  53. * @Description: 创建一封带附件的邮件
  54. * @Anthor:孤傲苍狼
  55. *
  56. * @param session
  57. * @return
  58. * @throws Exception
  59. */
  60. public static MimeMessage createAttachMail(Session session) throws Exception{
  61. MimeMessage message = new MimeMessage(session);
  62.  
  63. //设置邮件的基本信息
  64. //发件人
  65. message.setFrom(new InternetAddress("gacl@sohu.com"));
  66. //收件人
  67. message.setRecipient(Message.RecipientType.TO, new InternetAddress("xdp_gacl@sina.cn"));
  68. //邮件标题
  69. message.setSubject("JavaMail邮件发送测试");
  70.  
  71. //创建邮件正文,为了避免邮件正文中文乱码问题,需要使用charset=UTF-8指明字符编码
  72. MimeBodyPart text = new MimeBodyPart();
  73. text.setContent("使用JavaMail创建的带附件的邮件", "text/html;charset=UTF-8");
  74.  
  75. //创建邮件附件
  76. MimeBodyPart attach = new MimeBodyPart();
  77. DataHandler dh = new DataHandler(new FileDataSource("src\\2.jpg"));
  78. attach.setDataHandler(dh);
  79. attach.setFileName(dh.getName()); //
  80.  
  81. //创建容器描述数据关系
  82. MimeMultipart mp = new MimeMultipart();
  83. mp.addBodyPart(text);
  84. mp.addBodyPart(attach);
  85. mp.setSubType("mixed");
  86.  
  87. message.setContent(mp);
  88. message.saveChanges();
  89. //将创建的Email写入到E盘存储
  90. message.writeTo(new FileOutputStream("E:\\attachMail.eml"));
  91. //返回生成的邮件
  92. return message;
  93. }
  94. }

  

3.6、发送包含内嵌图片和附件的复杂邮件

  1. package me.gacl.main;
  2.  
  3. import java.io.FileOutputStream;
  4. import java.util.Properties;
  5. import javax.activation.DataHandler;
  6. import javax.activation.FileDataSource;
  7. import javax.mail.Message;
  8. import javax.mail.Session;
  9. import javax.mail.Transport;
  10. import javax.mail.internet.InternetAddress;
  11. import javax.mail.internet.MimeBodyPart;
  12. import javax.mail.internet.MimeMessage;
  13. import javax.mail.internet.MimeMultipart;
  14. import javax.mail.internet.MimeUtility;
  15.  
  16. /**
  17. * @ClassName: Sendmail
  18. * @Description: 发送Email
  19. * @author: 孤傲苍狼
  20. * @date: 2015-1-12 下午9:42:56
  21. *
  22. */
  23. public class Sendmail {
  24.  
  25. /**
  26. * @param args
  27. * @throws Exception
  28. */
  29. public static void main(String[] args) throws Exception {
  30.  
  31. Properties prop = new Properties();
  32. prop.setProperty("mail.host", "smtp.sohu.com");
  33. prop.setProperty("mail.transport.protocol", "smtp");
  34. prop.setProperty("mail.smtp.auth", "true");
  35. //使用JavaMail发送邮件的5个步骤
  36. //1、创建session
  37. Session session = Session.getInstance(prop);
  38. //开启Session的debug模式,这样就可以查看到程序发送Email的运行状态
  39. session.setDebug(true);
  40. //2、通过session得到transport对象
  41. Transport ts = session.getTransport();
  42. //3、连上邮件服务器
  43. ts.connect("smtp.sohu.com", "gacl", "邮箱密码");
  44. //4、创建邮件
  45. Message message = createMixedMail(session);
  46. //5、发送邮件
  47. ts.sendMessage(message, message.getAllRecipients());
  48. ts.close();
  49. }
  50.  
  51. /**
  52. * @Method: createMixedMail
  53. * @Description: 生成一封带附件和带图片的邮件
  54. * @Anthor:孤傲苍狼
  55. *
  56. * @param session
  57. * @return
  58. * @throws Exception
  59. */
  60. public static MimeMessage createMixedMail(Session session) throws Exception {
  61. //创建邮件
  62. MimeMessage message = new MimeMessage(session);
  63.  
  64. //设置邮件的基本信息
  65. message.setFrom(new InternetAddress("gacl@sohu.com"));
  66. message.setRecipient(Message.RecipientType.TO, new InternetAddress("xdp_gacl@sina.cn"));
  67. message.setSubject("带附件和带图片的的邮件");
  68.  
  69. //正文
  70. MimeBodyPart text = new MimeBodyPart();
  71. text.setContent("xxx这是女的xxxx<br/><img src='cid:aaa.jpg'>","text/html;charset=UTF-8");
  72.  
  73. //图片
  74. MimeBodyPart image = new MimeBodyPart();
  75. image.setDataHandler(new DataHandler(new FileDataSource("src\\3.jpg")));
  76. image.setContentID("aaa.jpg");
  77.  
  78. //附件1
  79. MimeBodyPart attach = new MimeBodyPart();
  80. DataHandler dh = new DataHandler(new FileDataSource("src\\4.zip"));
  81. attach.setDataHandler(dh);
  82. attach.setFileName(dh.getName());
  83.  
  84. //附件2
  85. MimeBodyPart attach2 = new MimeBodyPart();
  86. DataHandler dh2 = new DataHandler(new FileDataSource("src\\波子.zip"));
  87. attach2.setDataHandler(dh2);
  88. attach2.setFileName(MimeUtility.encodeText(dh2.getName()));
  89.  
  90. //描述关系:正文和图片
  91. MimeMultipart mp1 = new MimeMultipart();
  92. mp1.addBodyPart(text);
  93. mp1.addBodyPart(image);
  94. mp1.setSubType("related");
  95.  
  96. //描述关系:正文和附件
  97. MimeMultipart mp2 = new MimeMultipart();
  98. mp2.addBodyPart(attach);
  99. mp2.addBodyPart(attach2);
  100.  
  101. //代表正文的bodypart
  102. MimeBodyPart content = new MimeBodyPart();
  103. content.setContent(mp1);
  104. mp2.addBodyPart(content);
  105. mp2.setSubType("mixed");
  106.  
  107. message.setContent(mp2);
  108. message.saveChanges();
  109.  
  110. message.writeTo(new FileOutputStream("E:\\MixedMail.eml"));
  111. //返回创建好的的邮件
  112. return message;
  113. }
  114. }

  

以上就是使用JavaMail的API创建邮件和发送邮件的全部内容。

如果想发送带html模板的内容,请结合Freemarker来使用。
https://www.cnblogs.com/achengmu/p/10790789.html

  1. String content = htmlToPdfFreeMarkerServer.freeMarkerRender(null, "pdfmodel/flight_delay_content.html");
  1. Properties prop = new Properties();
  2. prop.setProperty("mail.host", "mail.xxxx.com.cn");
  3. prop.setProperty("mail.transport.protocol", "smtp");
  4. prop.setProperty("mail.smtp.auth", "true");
  5. //使用JavaMail发送邮件的5个步骤
  6. //1、创建session
  7. Session session = Session.getInstance(prop);
  8. //开启Session的debug模式,这样就可以查看到程序发送Email的运行状态
  9. session.setDebug(true);
  10. //2、通过session得到transport对象
  11. Transport ts = session.getTransport();
  12. //3、连上邮件服务器
  13. ts.connect("mail.xxxx.com.cn", "tvweb@xxxx.com.cn", "xxxxx");
  14. //4、创建邮件
  15. Message message = null;
  16. String subject = "xxxxx证明";
  17.  
  18. //读取模板内容, null表示不需要替换任何变量
  19. String content = htmlToPdfFreeMarkerServer.freeMarkerRender(null, "pdfmodel/flight_delay_content.html");
  20.  
  21. message = SendMail.createSimpleMail(
  22. "tvweb@tibetairlines.com.cn",
  23. toMail,
  24. subject,
  25. content,
  26. session);

  

java发送邮件javamail, freemarker读取html模板内容的更多相关文章

  1. Java代码一行一行读取txt的内容

    public static void main(String[] args) { // 文件夹路径 String path = "E:\\eclipse work\\ImageUtil\\s ...

  2. java 实现poi方式读取word文件内容

    1.下载poi的jar包 下载地址:https://www.apache.org/dyn/closer.lua/poi/release/bin/poi-bin-3.17-20170915.tar.gz ...

  3. java的poi技术下载Excel模板上传Excel读取Excel中内容(SSM框架)

    使用到的jar包 JSP: client.jsp <%@ page language="java" contentType="text/html; charset= ...

  4. poi读取excel模板,填充内容并导出,支持导出2007支持公式自动计算

    /** * 版权所有(C) 2016 * @author www.xiongge.club * @date 2016-12-7 上午10:03:29 */ package xlsx; /** * @C ...

  5. poi读取Excel模板并修改模板内容与动态的增加行

    有时候我们可能遇到相当复杂的excel,比如表头的合并等操作,一种简单的方式就是直接代码合并(浪费时间),另一种就是写好模板,动态的向模板中增加行和修改指定单元格数据. 1.一个简单的根据模板shee ...

  6. Java之利用Freemarker模板引擎实现代码生成器,提高效率

    https://blog.csdn.net/huangwenyi1010/article/details/71249258  java模板引擎freemarker代码生成器 更多 个人分类: 一步一步 ...

  7. java中的文件读取和文件写出:如何从一个文件中获取内容以及如何向一个文件中写入内容

    import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.Fi ...

  8. 五种方式让你在java中读取properties文件内容不再是难题

    一.背景 最近,在项目开发的过程中,遇到需要在properties文件中定义一些自定义的变量,以供java程序动态的读取,修改变量,不再需要修改代码的问题.就借此机会把Spring+SpringMVC ...

  9. java读取txt文件内容

    package read; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; public ...

随机推荐

  1. eclipse下载SpringBoot插件及创建SpringBoot项目

    一.eclipse在线下载SpringBoot插件 1.help->eclipse marketplace->popular-选择spring tool suite(STS)进行下载 ​ ...

  2. 函数的学习1——定义函数&传递实参——参考Python编程从入门到实践

    定义函数 def greet_user(): print("Hello") greet_user() # PEP8 函数和类的定义后空两行 1. 向函数传递参数 def greet ...

  3. 12 IO流(九)——装饰流 BufferedInputStream/OutputStream

    我们按功能可以将IO流分为节点流与处理流 节点流:可以直接从数据源或目的地读写数据 处理流(装饰流):不直接连接到数据源或目的地,是其他流(必须包含节点流)进行封装.目的主要是简化操作和提高性能. B ...

  4. Java 总结篇2

    第02章:数据类型和运算符 一.概述: 1.数据类型:int.float.char.boolean 2.运算符:算术运算符.赋值运算符.关系运算符.逻辑运算符.位运算符(了解即可).条件运算符 3.基 ...

  5. Mybatis @Many注解一对多关联映射

    @Many注解:fetchType属性用于配置是否延迟加载

  6. (四)pdf的构成之文件体(树图)

    pdf的文件体类似于一个大树 有个根对象(catalog),该对象中保存着PDF的很多基本信息,并通过间接引用,辐射到所有的间接对象. (下图是大概的树形状)

  7. Spring Boot@Component注解下的类无法@Autowired的问题

    title: Spring Boot@Component注解下的类无法@Autowired的问题 date: 2019-06-26 08:30:03 categories: Spring Boot t ...

  8. 【转载】终于有人把“TCC分布式事务”的实现原理讲明白了

    之前网上看到很多写分布式事务的文章,不过大多都是将分布式事务各种技术方案简单介绍一下.很多朋友看了还是不知道分布式事务到底怎么回事,在项目里到底如何使用. 所以这篇文章,就用大白话+手工绘图,并结合一 ...

  9. Windows MySql增量备份、完整备份采坑之路

    1.前言 这周公司交给我一个任务,负责项目Mysql数据库的备份,因为项目上线后数据是一个大问题,出了什么问题数据才是最大的问题,备份这时候就显得尤为重要, 公司项目的思路是:在项目系统设置内可以勾选 ...

  10. python之(TensorFlow)深度学习

    一.深度学习(DL, Deep Learning)是机器学习(ML, Machine Learning)领域中一个新的研究方向,它被引入机器学习使其更接近于最初的目标——人工智能(AI, Artifi ...