通过javaMail发送邮件,可选添加多个收件人,密送,抄送,多个附件

https://blog.csdn.net/qq_35434831/article/details/79666035

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_35434831/article/details/79666035

自己通过学习多人的代码,并整理了一个简单,调用方便的通过javaMail发送邮件。只需填写发件邮箱地址,密码;收件人地址,附件,选择是否保存,设置自己发送邮件时的昵称就ok了。代码自动匹配设置smtp服务地址和端口。

发送邮件需要邮箱地址和密码,开启POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务。各大邮箱使用外部登录验证的方式不一样,有些需要使用授权码登录链接,有些只需要邮箱登录密码,这个得根据你使用的邮箱服务平台的规定了。这里我收集了下面的邮箱smtp服务地址和端口,【QQ、Foxmail、139、126、163、Google(gmail)、Exchange、Outlook、sina.cn、sina.com】这些足以够用了吧!不多说,看代码。

使用方法

 
  1. public static void main(String[] args) throws Exception {

  2. List<String> map = new ArrayList<>();

  3. map.add("123456@qq.com");

  4. map.add("456789@qq.com");

  5. map.add("hahaha123@gmail.com");

  6. new SendEmail("hahaha123@gmail.com", "密码")

  7. .setDebug(true)

  8. .setMyNickName("这是我的昵称")

  9. .addFile("C:/Users/25171/Pictures/timg.jpg")//添加附件

  10. .addFile("C:/Users/25171/Desktop/QQ图片20180317192741.jpg")

  11. // .addFile(List<String> list)//添加附件集合

  12. .setSaveEmail("C:/User/2517/Desktop/name.eml")//保存邮件

  13. .addRecipientT0("251716795@qq.com")//添加收件人地址

  14. // .addRecipientT0(map)//添加收件人地址集合

  15. // .addRecipientCC(map)//添加密送收件人地址

  16. // .addRecipientBCC(map)//添加抄送收件人地址

  17. .createMail("标题", "发送的内容", "text/html;charset=utf-8")

  18. .sendEmail(new SendEmail.Callback() {

  19. @Override

  20. public void success(String s) {

  21. System.out.println(s);//发送完成后回调接口

  22. }

  23. @Override

  24. public void error(String s, Exception e) {

  25. System.out.println(s);

  26. e.printStackTrace();//异常失败的回调接口

  27. }

  28. });

  29. }

主体工具代码

 
  1. package com.sai.mail;

  2. import javax.activation.DataHandler;

  3. import javax.activation.FileDataSource;

  4. import javax.mail.*;

  5. import javax.mail.internet.*;

  6. import java.io.FileOutputStream;

  7. import java.io.IOException;

  8. import java.io.OutputStream;

  9. import java.io.UnsupportedEncodingException;

  10. import java.util.*;

  11. public class SendEmail {

  12. public interface Callback {

  13. void success(String s);

  14. void error(String s, Exception e);

  15. }

  16. private Callback callback; //信息回调接口

  17. private Properties properties;//系统属性对象

  18. private String mailAccount; //发送邮箱地址

  19. private String mailPassword; //验证密码

  20. private Session session; //邮件会话对象

  21. private String myNickName; //昵称,发送时自己的昵称

  22. private boolean debug = false;//debug模式

  23. private boolean isSaveEmail = false;

  24. private String pathName = "exc.eml";//邮件保存时的

  25. public SendEmail(String mailAccount, String mailPassword) {

  26. this.mailAccount = mailAccount;

  27. this.mailPassword = mailPassword;

  28. }

  29. public SendEmail setSaveEmail(String pathName) {

  30. isSaveEmail = true;

  31. this.pathName = pathName;

  32. return this;

  33. }

  34. private List<String> recipientT0List = new ArrayList<>();//收件地址

  35. private List<String> recipientCCList = new ArrayList<>();//密送地址

  36. private List<String> recipientBCCList = new ArrayList<>();//抄送地址

  37. private List<String> filePath = new ArrayList<>();//附件

  38. public SendEmail setDebug(boolean sessionDebug) {

  39. debug = sessionDebug;

  40. return this;

  41. }

  42. /*** 设置多人收件人地址 */

  43. public SendEmail addRecipientT0(String address) {

  44. recipientT0List.add(address);

  45. return this;

  46. }

  47. public SendEmail addRecipientCC(String address) {

  48. recipientCCList.add(address);

  49. return this;

  50. }

  51. public SendEmail addRecipientBCC(String address) {

  52. recipientBCCList.add(address);

  53. return this;

  54. }

  55. public SendEmail addRecipientT0(List<String> address) {

  56. recipientT0List.addAll(address);

  57. return this;

  58. }

  59. public SendEmail addRecipientCC(List<String> address) {

  60. recipientCCList.addAll(address);

  61. return this;

  62. }

  63. public SendEmail addRecipientBCC(List<String> address) {

  64. recipientBCCList.addAll(address);

  65. return this;

  66. }

  67. /***添加文件***/

  68. public SendEmail addFile(String filePath) {

  69. this.filePath.add(filePath);

  70. return this;

  71. }

  72. public SendEmail addFile(List<String> list) {

  73. this.filePath.addAll(list);

  74. return this;

  75. }

  76. /****昵称设置**/

  77. public SendEmail setMyNickName(String name) {

  78. myNickName = name;

  79. return this;

  80. }

  81. private MimeMessage message;

  82. /**

  83. * @param title 主题

  84. * @param datas 内容

  85. * @param type 内容格式类型 text/html;charset=utf-8

  86. * @return s

  87. */

  88. public SendEmail createMail(String title, String datas, String type) {

  89. if (mailAccount.length() == 0 || mailAccount.equals(null)) {

  90. System.err.println("发件地址不存在!");

  91. return this;

  92. }

  93. if (myNickName == null) {

  94. myNickName = mailAccount;

  95. }

  96. getProperties();

  97. if (!sync) return this;

  98. try {

  99. message = new MimeMessage(session);

  100. // 设置发送邮件地址,param1 代表发送地址 param2 代表发送的名称(任意的) param3 代表名称编码方式

  101. message.setFrom(new InternetAddress(mailAccount, myNickName, "utf-8"));

  102. setRecipientT0(); //添加接收人地址

  103. setRecipientCC(); //添加抄送接收人地址

  104. setRecipientBCC(); //添加密送接收人地址

  105. BodyPart messageBodyPart = new MimeBodyPart(); // 创建消息部分

  106. Multipart multipart = new MimeMultipart(); // 创建多重消息

  107. messageBodyPart.setContent(datas, type); // 消息内容

  108. multipart.addBodyPart(messageBodyPart); // 设置文本消息部分

  109. addFile(multipart); //附件部分

  110. // 发送完整消息

  111. message.setContent(multipart);

  112. message.setSubject(title); // 设置邮件主题

  113. message.setSentDate(new Date()); // 设置发送时间

  114. message.saveChanges(); // 保存上面的编辑内容

  115. // 将上面创建的对象写入本地

  116. saveEmail(title);

  117. } catch (Exception e) {

  118. if (callback != null)

  119. callback.error("message error ", e);

  120. sync = false;

  121. }

  122. return this;

  123. }

  124. public void sendEmail(Callback callback) {

  125. this.callback = callback;

  126. if (!sync)

  127. return;

  128. try {

  129. Transport trans = session.getTransport();

  130. // 链接邮件服务器

  131. trans.connect(mailAccount, mailPassword);

  132. // 发送信息

  133. trans.sendMessage(message, message.getAllRecipients());

  134. // 关闭链接

  135. trans.close();

  136. if (callback != null)

  137. callback.success("发送完成");

  138. } catch (Exception e) {

  139. if (callback != null)

  140. callback.error("发送异常", e);

  141. }

  142. }

  143. private void saveEmail(String title) throws IOException, MessagingException {

  144. OutputStream out = null;

  145. if (isSaveEmail) {

  146. if (pathName.length() == 0 || pathName.equals(null)) {

  147. out = new FileOutputStream(title + ".eml");

  148. } else {

  149. String path[] = pathName.split("\\.");

  150. out = new FileOutputStream(path[0] + title + ".eml");

  151. }

  152. }

  153. message.writeTo(out);

  154. out.flush();

  155. out.close();

  156. }

  157. /*** 设置收件人地址信息*/

  158. private void setRecipientT0() throws MessagingException, UnsupportedEncodingException {

  159. if (recipientT0List.size() > 0) {

  160. InternetAddress[] sendTo = new InternetAddress[recipientT0List.size()];

  161. for (int i = 0; i < recipientT0List.size(); i++) {

  162. System.out.println("发送到:" + recipientT0List.get(i));

  163. sendTo[i] = new InternetAddress(recipientT0List.get(i), "", "UTF-8");

  164. }

  165. message.addRecipients(MimeMessage.RecipientType.TO, sendTo);

  166. }

  167. }

  168. /***设置密送地址**/

  169. private void setRecipientCC() throws MessagingException, UnsupportedEncodingException {

  170. if (recipientCCList.size() > 0) {

  171. InternetAddress[] sendTo = new InternetAddress[recipientCCList.size()];

  172. for (int i = 0; i < recipientCCList.size(); i++) {

  173. System.out.println("发送到:" + recipientCCList.get(i));

  174. sendTo[i] = new InternetAddress(recipientCCList.get(i), "", "UTF-8");

  175. }

  176. message.addRecipients(MimeMessage.RecipientType.CC, sendTo);

  177. }

  178. }

  179. /***设置抄送邮件地址**/

  180. private void setRecipientBCC() throws MessagingException, UnsupportedEncodingException {

  181. if (recipientBCCList.size() > 0) {

  182. InternetAddress[] sendTo = new InternetAddress[recipientBCCList.size()];

  183. for (int i = 0; i < recipientBCCList.size(); i++) {

  184. System.out.println("发送到:" + recipientBCCList.get(i));

  185. sendTo[i] = new InternetAddress(recipientBCCList.get(i), "", "UTF-8");

  186. }

  187. message.addRecipients(MimeMessage.RecipientType.BCC, sendTo);

  188. }

  189. }

  190. /***添加附件****/

  191. private void addFile(Multipart multipart) throws MessagingException, UnsupportedEncodingException {

  192. if (filePath.size() == 0)

  193. return;

  194. for (int i = 0; i < filePath.size(); i++) {

  195. MimeBodyPart messageBodyPart = new MimeBodyPart();

  196. // 选择出每一个附件名

  197. String pathName = filePath.get(i);

  198. System.out.println("添加附件 ====>" + pathName);

  199. // 得到数据源

  200. FileDataSource fds = new FileDataSource(pathName);

  201. // 得到附件本身并至入BodyPart

  202. messageBodyPart.setDataHandler(new DataHandler(fds));

  203. //采用这去除中文乱码

  204. messageBodyPart.setFileName(MimeUtility.encodeText(fds.getName()));

  205. multipart.addBodyPart(messageBodyPart);

  206. }

  207. }

  208. private boolean sync = true;

  209. /**

  210. * 规定设置 传输协议为smtp 根据输入的邮箱地址自动匹配smtp服务器地址与smtp服务器地址端口

  211. */

  212. private void getProperties() {

  213. String account[] = mailAccount.split("@");

  214. String mailTpye = "";

  215. try {

  216. mailTpye = account[1];

  217. } catch (Exception e) {

  218. System.err.println("不正确的邮箱地址!");

  219. sync = false;

  220. return;

  221. }

  222. String SMTPHost = "";//smtp服务器地址

  223. String SMTPPort = "";//smtp服务器地址端口

  224. switch (mailTpye) {

  225. case "qq.com":

  226. case "foxmail.com":

  227. SMTPHost = "smtp.qq.com";

  228. SMTPPort = "465";

  229. break;

  230. case "sina.com":

  231. SMTPHost = "smtp.sina.com";

  232. SMTPPort = "25";

  233. break;

  234. case "sina.cn":

  235. SMTPHost = "smtp.sina.cn";

  236. SMTPPort = "25";

  237. break;

  238. case "139.com":

  239. SMTPHost = "smtp.139.com";

  240. SMTPPort = "465";

  241. break;

  242. case "163.com":

  243. SMTPHost = "smtp.163.com";

  244. SMTPPort = "25";

  245. break;

  246. case "188.com":

  247. SMTPHost = "smtp.188.com";

  248. SMTPPort = "25";

  249. break;

  250. case "126.com":

  251. SMTPHost = "smtp.126.com";

  252. SMTPPort = "25";

  253. break;

  254. case "gmail.com":

  255. SMTPHost = "smtp.gmail.com";

  256. SMTPPort = "465";

  257. break;

  258. case "outlook.com":

  259. SMTPHost = "smtp.outlook.com";

  260. SMTPPort = "465";

  261. break;

  262. default:

  263. System.err.println("暂时不支持此账号作为服务账号发送邮件!");

  264. return;

  265. }

  266. Properties prop = new Properties();

  267. prop.setProperty("mail.transport.protocol", "smtp"); // 设置邮件传输采用的协议smtp

  268. prop.setProperty("mail.smtp.host", SMTPHost);// 设置发送人邮件服务器的smtp地址

  269. prop.setProperty("mail.smtp.auth", "true"); // 设置验证机制

  270. prop.setProperty("mail.smtp.port", SMTPPort);// SMTP 服务器的端口 (非 SSL 连接的端口一般默认为 25, 可以不添加, 如果开启了 SSL 连接,

  271. prop.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");

  272. prop.setProperty("mail.smtp.socketFactory.fallback", "false");

  273. prop.setProperty("mail.smtp.socketFactory.port", SMTPPort);

  274. properties = prop;

  275. session = Session.getInstance(properties);

  276. session.setDebug(debug);

  277. }

  278. }

完成这些需要导入的重要jar包:mail-1.4.1.jar(或者更高的版本) 和 activation 包,jdk1.8中rt.jar包含的activation 包。所以jdk1.8的就无需考虑activation 怎么下载了。

完成解析分配服务器地址和端口的主要函数(写的不怎么好):

 
  1. private void getProperties() {

  2. String account[] = mailAccount.split("@");

  3. String mailTpye = "";

  4. try {

  5. mailTpye = account[1];

  6. } catch (Exception e) {

  7. System.err.println("不正确的邮箱地址!");

  8. sync = false;

  9. return;

  10. }

  11. String SMTPHost = "";//smtp服务器地址

  12. String SMTPPort = "";//smtp服务器地址端口

  13. switch (mailTpye) {

  14. case "qq.com":

  15. case "foxmail.com":

  16. SMTPHost = "smtp.qq.com";

  17. SMTPPort = "465";

  18. break;

  19. case "sina.com":

  20. SMTPHost = "smtp.sina.com";

  21. SMTPPort = "25";

  22. break;

  23. case "sina.cn":

  24. SMTPHost = "smtp.sina.cn";

  25. SMTPPort = "25";

  26. break;

  27. case "139.com":

  28. SMTPHost = "smtp.139.com";

  29. SMTPPort = "465";

  30. break;

  31. case "163.com":

  32. SMTPHost = "smtp.163.com";

  33. SMTPPort = "25";

  34. break;

  35. case "188.com":

  36. SMTPHost = "smtp.188.com";

  37. SMTPPort = "25";

  38. break;

  39. case "126.com":

  40. SMTPHost = "smtp.126.com";

  41. SMTPPort = "25";

  42. break;

  43. case "gmail.com":

  44. SMTPHost = "smtp.gmail.com";

  45. SMTPPort = "465";

  46. break;

  47. case "outlook.com":

  48. SMTPHost = "smtp.outlook.com";

  49. SMTPPort = "465";

  50. break;

  51. default:

  52. System.err.println("暂时不支持此账号作为服务账号发送邮件!");

  53. return ;

  54. }

  55. Properties prop = new Properties();

  56. prop.setProperty("mail.transport.protocol", "smtp"); // 设置邮件传输采用的协议smtp

  57. prop.setProperty("mail.smtp.host", SMTPHost);// 设置发送人邮件服务器的smtp地址

  58. prop.setProperty("mail.smtp.auth", "true"); // 设置验证机制

  59. prop.setProperty("mail.smtp.port", SMTPPort);// SMTP 服务器的端口 (非 SSL 连接的端口一般默认为 25, 可以不添加

  60. prop.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");

  61. prop.setProperty("mail.smtp.socketFactory.fallback", "false");

  62. prop.setProperty("mail.smtp.socketFactory.port", SMTPPort);

  63. properties = prop;

  64. session = Session.getInstance(properties);

  65. session.setDebug(debug);

  66. }

最后看看效果:

通过javaMail发送邮件,可选添加多个收件人,密送,抄送,多个附件相关推荐

  1. 通过javaMail发送邮件,可选添加多个收件人,密送,抄送,多个附件,超实用

    自己通过学习多人的代码,并整理了一个简单,调用方便的通过javaMail发送邮件.只需填写发件邮箱地址,密码:收件人地址,附件,选择是否保存,设置自己发送邮件时的昵称就ok了.代码自动匹配设置smtp ...

  2. c#发送邮件(带抄送,密送,群发,附件)

    using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net ...

  3. 带附件/密送/抄送的 javaMail 邮件发送 -- java_demo(两种实现方式)

    话不多说,上代码--第一种,自己实现的,参考资料 javaMail 的邮件发送包括了抄送(CC),密送(BCC)采用springBoot 常用的邮件服务器名称.地址及SSL/非SSL协议端口号 Jav ...

  4. 利用Java的JavaMail发送邮件:企业邮箱版和个人邮箱客端版

    本文链接: http://blog.csdn.net/qq_35257397/article/details/79004987 废话不说进入正题: 1. 第一步 项目基于maven 搭建.引入pom. ...

  5. [java] JavaMail发送邮件

    转载地址:http://blog.csdn.net/xietansheng/article/details/51673073 准备工作(开启邮件代理) 发送邮件首先需要有一个邮箱账号和密码,本文以网易 ...

  6. 基于javaMail发送邮件的实现

    关于JavaMail发送验证邮件的心得:   qq邮箱默认SMTP/POP3服务是关闭的,其他邮箱是默认开启的.   qq邮箱开启SMTP/POP3服务时会要求使用授权码,并在使用第三方客户端发送   ...

  7. javaMail发送邮件读取流中的数据并作为作为附件发送邮件

    一.pom.xml中添加依赖 <dependency>             <groupId>com.sun.mail</groupId>            ...

  8. JavaMail发送邮件Demo

    JavaMail发送邮件Demo Maven依赖 <dependency><groupId>org.springframework.boot</groupId>&l ...

  9. Java + 腾讯企业邮箱 + javamail发送邮件

    搞了一上午终于搞定了腾讯云企业邮箱的发送,话说腾讯云的东西就是繁琐,但是好用,还是得认真看文档啊,不然真的摸不着北. 腾讯企业邮箱官网:http://exmail.qq.com 点击开通 你跟着步骤走 ...

最新文章

  1. C++ 类和对象(一):类的概念、类的访问控制和封装、类对象模型、this指针
  2. Android Studio使用心得
  3. Python:以鸢尾花数据为例,介绍决策树算法
  4. python抽荣耀水晶_深度分析抽取荣耀水晶的窍门,不良抽法很好用,平均100RMB一颗...
  5. 一台弹性云服务器可以挂载多块磁盘吗?
  6. 正确的加密存储密码防止被拖库(脱裤)保护用户登录安全
  7. java自己写的视频截图工具
  8. C语言中printf格式输出
  9. matlab钢琴音教程,手把手教你钢琴基本指法(有图有真相,通俗易懂,钢琴入门必备)...
  10. 【转】 HMC与VIOS对新LPAR提供存储与网络虚拟化的支持
  11. 每天记忆五个词根之四
  12. java嵌套for循环基础练习 -空心金字塔
  13. ARPANET的设计思想 (分组交换)
  14. 最新微信QQ域名防封、微信群活码系统
  15. 函数getopt(),及其参数optind
  16. 龙芯智龙开发板:驱动步进电机实战入门
  17. naarray查询 swift_VLOOKUP查询时为什么会出现NA?原来知道这6种解决方法这么重要...
  18. Android_Studio
  19. nc 监听数据_nc命令使用解析大全
  20. 欧拉函数(dayn)

热门文章

  1. 微信域名检测、防封,微信跳转技术揭秘(一)
  2. session和cookie区别,如何读cookie的值
  3. 《择天记》剧透暗藏杀机 下载txt病毒成群
  4. 京东js加密 nloginpwd 破解
  5. 10进制转换为其他进制(初学)
  6. 计算机控制在数字化播控中心的应用
  7. 中国生物农药市场营销预测与发展策略研究报告2022版
  8. Python自学笔记9:实操案例六(千年虫,购物流程)
  9. 从信息化改造到数字化转型,中国企业行至何处?
  10. 免费CdnBye Dplayer P2P HLS 加速系统接入指南