总结一个简单的java发送邮件的demo,转载自 https://www.cnblogs.com/roak/p/16261702.html,部分代码作了修正。
1.pom.xml
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.6.2</version>
</dependency>
2.代码
2.1 email实体类
@Data
public class EmailDto {
/**
* SMTP主机名
*/
private String serverName;
/**
* 主机端口号
*/
private String port;
/**
* 用户名
*/
private String userName;
/**
* 密码
*/
private String password;
private String senderName;
/**
* 发件人
*/
private String emailAddress;
/**
* 邮件主题
*/
private String subject;
/**
* 收件人(多个收件人之间以;隔开)
*/
private String to;
/**
* 抄送人(多个抄送人之间以;隔开)
*/
private String cC;
/**
* 邮件正文
*/
private String content;
@Override
public String toString() {
return JSONObject.toJSONString(this);
}
}
2.2邮件发送
public class MailUtils {
/**
* 发送邮件(不带附件)
* @param emailDto email配置信息
*/
public static void sendMailWithoutFile(EmailDto emailDto) {
sendMail(emailDto, new JSONArray());
}
/**
* 发送邮件(带附件)
* @param emailDto email配置信息
* @param filePath 本地附件地址
*/
public static void sendMail(EmailDto emailDto, JSONArray filePath) {
Transport transport = null;
try {
Properties prop = new Properties();
prop.setProperty("mail.host", emailDto.getServerName()); //邮箱发送
prop.setProperty("mail.transport.protocol", "smtp"); // 邮件发送协议
prop.setProperty("mail.smtp.auth", "true"); // 需要验证用户名密码
//1、创建定义整个应用程序所需的环境信息的 Session 对象
Session session = Session.getDefaultInstance(prop, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
//传入发件人的姓名和授权码
return new PasswordAuthentication(emailDto.getUserName(), emailDto.getPassword());
}
});
//2、通过session获取transport对象
transport = session.getTransport();
//3、通过transport对象邮箱用户名和授权码连接邮箱服务器
transport.connect(emailDto.getServerName(), emailDto.getUserName(), emailDto.getPassword());
//4、创建邮件,传入session对象
MimeMessage mimeMessage = getMimeMessage(session, emailDto, filePath);
//5、发送邮件
transport.sendMessage(mimeMessage, mimeMessage.getAllRecipients());
} catch (Exception e) {
e.printStackTrace();
} finally {
if (transport != null) {
try {
transport.close();
} catch (MessagingException e) {
e.printStackTrace();
}
}
}
}
/**
* 组装发送信息
* @param session session
* @param emailDto 邮件配置信息
* @param filesPath 本地地址
* @return MimeMessage
* @throws Exception Exception
*/
private static MimeMessage getMimeMessage(Session session, EmailDto emailDto, JSONArray filesPath) throws Exception {
//消息的固定信息
MimeMessage mimeMessage = new MimeMessage(session);
//发件人
mimeMessage.setFrom(new InternetAddress(emailDto.getEmailAddress()));
//收件人
if (StringUtils.isNotBlank(emailDto.getTo())) {
String[] tos = emailDto.getTo().split(";");
InternetAddress[] toAddrs = new InternetAddress[tos.length];
for (int i = 0; i < tos.length; i++) {
toAddrs[i] = new InternetAddress(tos[i]);
}
mimeMessage.setRecipients(Message.RecipientType.TO, toAddrs);
}else{
throw new ServiceException("收件人不能为空!");
}
//抄送人
if (StringUtils.isNotBlank(emailDto.getCC())) {
String[] ccs = emailDto.getCC().split(";");
InternetAddress[] ccAddrs = new InternetAddress[ccs.length];
for (int i = 0; i < ccs.length; i++) {
ccAddrs[i] = new InternetAddress(ccs[i]);
}
mimeMessage.setRecipients(Message.RecipientType.CC, ccAddrs);
}
//邮件标题
mimeMessage.setSubject(StringUtils.isNotBlank(emailDto.getSubject().trim()) ? emailDto.getSubject() : "无主题");
MimeMultipart multipart = new MimeMultipart();
//附件
for (Object pathObj : filesPath) {
MimeBodyPart attachPart = new MimeBodyPart();
File file = new File((String) pathObj);
attachPart.setDataHandler(new DataHandler(new FileDataSource(file)));
//避免中文乱码的处理
attachPart.setFileName(MimeUtility.encodeWord(file.getName()));
multipart.addBodyPart(attachPart);//附件
}
//正文
MimeBodyPart contentPart = new MimeBodyPart();
contentPart.setContent(emailDto.getContent(), "text/html;charset=utf-8");
multipart.addBodyPart(contentPart);
multipart.setSubType("mixed"); //正文和附件都存在邮件中,所有类型设置为mixed
//放到Message消息中
mimeMessage.setContent(multipart);
mimeMessage.saveChanges();//保存修改
return mimeMessage;
}
}
2.3 测试代码(以163邮箱为例)
public static void main(String[] args) {
EmailDto emailDto = new EmailDto();
//邮件服务器,不同邮箱对应修改
emailDto.setSenderName("smtp.163.com");
emailDto.setPassword("25");
//发件人邮箱
emailDto.setUserName("xxx@163.com");
//激活POP3/SMTP服务的授权码,具体获取方式参考 https://zhuanlan.zhihu.com/p/551399559?utm_id=0
emailDto.setPassword("xxx");
emailDto.setEmailAddress("xxx@163.com");
emailDto.setTo("xxx;");
emailDto.setCC("xxx;xxx;");
emailDto.setSubject("testSubject.....");
emailDto.setContent("testContent....." );
//普通邮件发送(不带附件)
MailUtils.sendMailWithoutFile(emailDto);
}