实际开发中电子邮件的应用非常广泛,比如注册激活邮件,邮件找回密码,自动批量发送活动信息等。本文介绍如何通过 Java 代码来创建支持附件、支持多收件人、多抄送人、多密送人的复杂电子邮件,并连接邮件服务器发送邮件。

电子邮件协议
常用的电子邮件协议包括 SMTP,POP3,IMAP,其中邮件的创建和发送只需要用到 SMTP协议,所以代码也只涉SMTP协议,SMTP 是 Simple Mail Transfer Protocol 的简称,即简单邮件传输协议。
JavaMail
Java 官方也提供了对电子邮件协议封装的 Java 类库JavaMail,自行官网下载。

mvn项目的话,添加依赖如下:

<!-- JavaMail邮件发送 -->
<dependency><groupId>javax.mail</groupId><artifactId>mail</artifactId><version>1.5.0-b01</version>
</dependency>

创建一封电子邮件的步骤:
1. 创建一个邮件对象(MimeMessage)并链接到邮件服务器;
2. 设置发件人、收件人(可多个收件人、抄送人、密送人)、邮件的主题(标题)、正文(内容)、显示的发送时间;
3. 发送。

准备工作:

发送邮件首先需要有一个邮箱账号和密码,本文以qq邮箱为例,邮箱账号必须要开启 SMTP 服务,在浏览器网页登录邮箱后一般在邮箱的“设置”选项中可以开启,并记下授权码,如下所示(其他邮箱大同小异):

实现代码如下:

实体类EmailBean.java:

package com.liberal.common.bean.email;import com.liberal.common.bean.email.EmailUser;import java.util.List;/*** @author weny.yang* @ClassName: EmailBean* @Description:邮件实体* @date Nov 2, 2020*/
public class EmailBean {private String smtpHost;// 发件人邮箱的 SMTP 服务器地址private EmailUser fromUser;// 发件人private List<EmailUser> recipientType_TO;//(必填) 收件人,可以配置多个private List<EmailUser> recipientType_CC;//(可选) 抄送人,可以配置多个private List<EmailUser> recipientType_BCC;//(可选) 密送人,可以配置多个,其他人无法知道密送人收到邮件private String emailTitle;// 邮件主题private String emailContent;// 邮件内容private List<String> annexPaths;// 附件路径public EmailBean() {super();}public EmailBean(String smtpHost, EmailUser fromUser, List<EmailUser> recipientType_TO, List<EmailUser> recipientType_CC,List<EmailUser> recipientType_BCC, String emailTitle, String emailContent, List<String> annexPaths) {super();this.smtpHost = smtpHost;this.fromUser = fromUser;this.recipientType_TO = recipientType_TO;this.recipientType_CC = recipientType_CC;this.recipientType_BCC = recipientType_BCC;this.emailTitle = emailTitle;this.emailContent = emailContent;this.annexPaths = annexPaths;}public String getSmtpHost() {return smtpHost;}public void setSmtpHost(String smtpHost) {this.smtpHost = smtpHost;}public EmailUser getFromUser() {return fromUser;}public void setFromUser(EmailUser fromUser) {this.fromUser = fromUser;}public List<EmailUser> getRecipientType_TO() {return recipientType_TO;}public void setRecipientType_TO(List<EmailUser> recipientType_TO) {this.recipientType_TO = recipientType_TO;}public List<EmailUser> getRecipientType_CC() {return recipientType_CC;}public void setRecipientType_CC(List<EmailUser> recipientType_CC) {this.recipientType_CC = recipientType_CC;}public List<EmailUser> getRecipientType_BCC() {return recipientType_BCC;}public void setRecipientType_BCC(List<EmailUser> recipientType_BCC) {this.recipientType_BCC = recipientType_BCC;}public String getEmailTitle() {return emailTitle;}public void setEmailTitle(String emailTitle) {this.emailTitle = emailTitle;}public String getEmailContent() {return emailContent;}public void setEmailContent(String emailContent) {this.emailContent = emailContent;}public List<String> getAnnexPaths() {return annexPaths;}public void setAnnexPaths(List<String> annexPaths) {this.annexPaths = annexPaths;}public String toString() {return "{smtpHost=" + smtpHost + ",fromUser=" + fromUser + ",recipientType_TO=" + recipientType_TO+ ",recipientType_CC=" + recipientType_CC + ",recipientType_BCC=" + recipientType_BCC + ",emailTitle="+ emailTitle + ",emailContent=" + emailContent + ",annexPaths = " + annexPaths + "}";}
}

实体类EmailUser.java:

package com.liberal.common.bean.email;/*** @author weny.yang* @ClassName: User* @Description:发件人/收件人/抄送人/密送人* @date 2020年11月10日*/
public class EmailUser {private String name;// 昵称private String address;// 邮箱地址private String authCode;// 授权码(发件人需要,收件人/抄送人/密送人不需要)/*** 构造函数 User.发件人*/public EmailUser(String name, String address, String authCode) {super();this.name = name;this.address = address;this.authCode = authCode;}/*** 构造函数 User.收件人/抄送人/密送人*/public EmailUser(String address) {super();this.address = address;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public String getAuthCode() {return authCode;}public void setAuthCode(String authCode) {this.authCode = authCode;}public String toString() {return "{name=" + name + ",address=" + address + "}";}}

工具类:

package com.liberal.common.utils.email;import java.io.File;
import java.util.Date;
import java.util.List;
import java.util.Properties;import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;import com.liberal.common.bean.email.EmailBean;
import com.liberal.common.bean.email.EmailUser;
import lombok.extern.slf4j.Slf4j;import com.sun.mail.util.MailSSLSocketFactory;/*** @author weny.yang* @ClassName: EmailUtil* @Description:复杂邮件发送工具,支持附件* @date 2020年11月9日*/
@Slf4j
public class EmailUtil {/*** @Title: sendEmail* @Description:发送复杂邮件* @author weny.yang*/public static void sendEmail(EmailBean bean) {Transport transport = null;try {log.info("发送邮件开始[" + bean.getEmailTitle() + "]");Properties prop = new Properties();prop.setProperty("mail.host", bean.getSmtpHost()); // 邮件服务器prop.setProperty("mail.transport.protocol", "smtp"); // 邮件发送协议prop.setProperty("mail.smtp.auth", "true"); // 需要验证用户名密码// SSL加密MailSSLSocketFactory sf = new MailSSLSocketFactory();sf.setTrustAllHosts(true);prop.put("mail.smtp.ssl.enable", "true");prop.put("mail.smtp.ssl.socketFactory", sf);// 1、创建应用程序所需的环境会话 session 对象Session session = Session.getDefaultInstance(prop, new Authenticator() {@Overrideprotected PasswordAuthentication getPasswordAuthentication() {// 发件人的邮箱地址和授权码return new PasswordAuthentication(bean.getFromUser().getAddress(), bean.getFromUser().getAuthCode());}});// 2、获取 transport 对象transport = session.getTransport();// 3、连接邮箱服务器transport.connect(bean.getSmtpHost(), bean.getFromUser().getAddress(), bean.getFromUser().getAuthCode());// 4、创建复杂邮件MimeMessage mimeMessage = creatComplexEmail(session, bean);// 5、发送邮件transport.sendMessage(mimeMessage, mimeMessage.getAllRecipients());log.info("发送邮件完成[" + bean.getEmailTitle() + "]");} catch (Exception e) {log.error("邮件发送异常", e);} finally {try {if (null != transport) {// 6、关闭连接transport.close();}} catch (MessagingException e) {log.error("资源释放异常", e);}}}/*** @Title: complexEmail* @Description:创建复杂邮件* @author weny.yang*/private static MimeMessage creatComplexEmail(Session session, EmailBean bean) throws Exception {// 消息信息MimeMessage message = new MimeMessage(session);// 发件人message.setFrom(new InternetAddress(bean.getFromUser().getAddress(), bean.getFromUser().getName(), "UTF-8"));// 收件人List<EmailUser> toList = bean.getRecipientType_TO();if (toList != null && toList.size() > 0) {for (EmailUser user : toList) {message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(user.getAddress(), user.getName(), "UTF-8"));}}// 抄送人List<EmailUser> ccList = bean.getRecipientType_CC();if (ccList != null && ccList.size() > 0) {for (EmailUser user : ccList) {message.setRecipient(MimeMessage.RecipientType.CC, new InternetAddress(user.getAddress(), user.getName(), "UTF-8"));}}// 密送人List<EmailUser> bccList = bean.getRecipientType_BCC();if (bccList != null && bccList.size() > 0) {for (EmailUser user : bccList) {message.setRecipient(MimeMessage.RecipientType.BCC, new InternetAddress(user.getAddress(), user.getName(), "UTF-8"));}}// 邮件标题message.setSubject(bean.getEmailTitle());// 邮件文本MimeBodyPart text = new MimeBodyPart();text.setContent(bean.getEmailContent(), "text/html;charset=utf-8");// 支持html标签解析,展示自定义格式// 组装邮件MimeMultipart allFile = new MimeMultipart();// 添加文本allFile.addBodyPart(text);// 添加附件List<String> annexPaths = bean.getAnnexPaths();if (annexPaths != null && annexPaths.size() > 0) {for (String path : annexPaths) {MimeBodyPart appendix = new MimeBodyPart();DataHandler dataHandler = new DataHandler(new FileDataSource(path));appendix.setDataHandler(dataHandler);appendix.setFileName(new File(path).getName());allFile.addBodyPart(appendix);//设置附件}}allFile.setSubType("mixed"); //正文和附件都存在邮件中,所有类型设置为mixed// 放到Message消息中message.setContent(allFile);// 显示的发件时间message.setSentDate(new Date());message.saveChanges();//保存修改return message;}
}

运行效果:

Java实现复杂邮件发送(支持附件、支持多收件人、多抄送人、多密送人)相关推荐

  1. 邮件发送类,支持HTML格式,支持优先级设置

    www.chinacs.net  2002-5-9  中文C#技术站 邮件发送类,支持HTML格式,支持优先级设置.通过SOCKET类实现的 using System; using System.Te ...

  2. java实现邮件发送_基于JavaMail的Java实现简单邮件发送功能

    电子邮件的应用非常广泛,例如在某网站注册了一个账户,自动发送一封欢迎邮件,通过邮件找回密码,自动批量发送活动信息等.但这些应用不可能和我们自己平时发邮件一样,先打开浏览器,登录邮箱,创建邮件再发送.本 ...

  3. Java实现QQ邮件发送

    QQ邮件发送 可以发送文本,图片,附件,同时可以将它们进行拼接发送. 功能代码被分成了4个方法,每个方法分别代表不同的发送方式,选择自己需要的方法即可. **实现发送邮件之前,先准备好QQ授权码.** ...

  4. Java实现QQ邮件发送客户端程序设计

    目录 一.前言:QQ邮件发送程序 二.封装SMTP操作 三.实现多线程接收 四.QQ邮件客户端界面设计 1.连接按钮 2.发送按钮 五.QQ邮件发送效果演示 六.总结 一.前言:QQ邮件发送程序 !! ...

  5. 基于python的图形化邮件发送程序(支持添加附件)

    2019独角兽企业重金招聘Python工程师标准>>> 开发环境:centos7 基于:python3.5 调用库:tkinter smtplib email linux中类outl ...

  6. java mail 抄送多用户_javaMail邮件发送功能(多收件人,多抄送人,多密送人,多附件)...

    先看源码,再来理解,可以直接使用! JavaMailWithAttachment.java: private MimeMessage message; private Session session; ...

  7. Java实现QQ邮件发送原理和实现

    电子邮件 在网络中实现邮件发送和接收的功能,就必须要有专门的邮件服务器(使用SMTP协议).我们发送一封邮件,先要经过各层路由,交换机,基站,然后存到该邮件服务器,(不同的邮件有不同的邮件服务器,比如 ...

  8. 邮件发送超大附件有哪些问题?怎么解决?

    合作伙伴第5次催促时,10G的CAD图纸才传了67%: 又一次,写好邮件上传附件时,被通知文件太大无法上传: 邮件发送出去的会议资料,永远不知道谁没有查看,还要电话通知一遍 -- 工作中,你肯定遇到过 ...

  9. javaMail邮件发送功能(多收件人,多抄送人,多密送人,多附件)

    先看源码,再来理解,可以直接使用! JavaMailWithAttachment.java: <span style="font-family: Arial, Helvetica, s ...

  10. python邮件发送csv附件_Python2.7 smtplib发送带附件邮件报错STARTTLS解决方法

    最近在SIOMP系统中添加一项功能时,即自动发送带附件邮件到指定邮箱时,发现在发送时报错:错误信息:STARTTLS extension not supported by server.很是奇怪,但发 ...

最新文章

  1. xpwin7下的CMD命令
  2. Spring Boot 搭载属于你的网站框架(一)
  3. step by step设置postgresql用户密码并配置远程连接
  4. java 状态机_Yarn的状态机机制
  5. const int *p与int *const p的区别
  6. 如何在工作中更好的学习
  7. 自定义AlertDialog控件的使用(AndroidStudio)
  8. 线段树 HDU 3397
  9. SpringSecurity半成品笔记
  10. 今晚8点,dotnet课堂全新起航,张善友/陈计节/刘腾飞我们一起来聊聊abp的故事...
  11. PassGAN阅读笔记
  12. 一看就懂:阿里云 OSS
  13. Linux-1-概述
  14. Reverse Polish notation(逆波兰式)
  15. 透彻理解高斯过程Gaussian Process (GP)
  16. Pytorch系列之——nn网络层
  17. 一起从零学Kotlin-20170730
  18. 快手校招算法题 无重复字符的最长子串
  19. C#总是报未能加载文件或程序集
  20. global的作用以及使用方法

热门文章

  1. [样本分析] Ramnit感染型病毒
  2. struts2 中 Actionsupport类的作用
  3. C语言小程序打印楼梯图案
  4. Android游戏引擎汇总,android开发模拟器
  5. android studio 2048游戏
  6. (实验)使用Protel 99se绘制2114存储器芯片(详细)
  7. 第二篇:基于小米手机的,第三方recovery教学
  8. java语法和python语法的一些区别
  9. CAN与CAN FD通信之间存在的问题
  10. 学画画怎么画三点透视图