第一步:在pom文件中导入对应的依赖。
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.6.2</version>
</dependency>
第二步:编写工具类,连接至SMTP服务器并创建session会话 ,并实现不同需求下发送邮件的方法。
import com.example.timertest.constant.SendMailConstant;
import org.springframework.web.multipart.MultipartFile;
import javax.activation.DataHandler;
import javax.mail.*;
import javax.mail.internet.*;
import javax.mail.util.ByteArrayDataSource;
import java.io.IOException;
import java.util.List;
import java.util.Properties;
public class MailSendUtil {
/**
* 根据邮箱服务器信息创建session对象
* @return
*/
public static Session createSession() {
// 账号信息
String username = SendMailConstant.SEND_MAIL_USER;//邮箱发送账号
String password = SendMailConstant.SEND_MAIL_CODE;//邮箱授权码
// 创建一个配置文件,并保存
Properties props = new Properties();
// SMTP服务器连接信息
// 126——smtp.126.com
// 163——smtp.163.com
props.put("mail.smtp.host", SendMailConstant.SEND_MAIL_HOST);// SMTP主机名
// 126——25
// 163——465
final String smtpPort = SendMailConstant.SEND_MAIL_PORT;
props.setProperty("mail.smtp.port", smtpPort);
props.put("mail.smtp.auth", "true");//是否需要用户认证
// 某些邮箱服务器要求 SMTP 连接需要使用 SSL 安全认证 (为了提高安全性, 邮箱支持SSL连接, 也可以自己开启),
// 如果无法连接邮件服务器, 仔细查看控制台打印的 log, 如果有有类似 “连接失败, 要求 SSL 安全连接” 等错误,开启SSL安全连接
// SMTP 服务器的端口 (非 SSL 连接的端口一般默认为 25, 可以不添加, 如果开启了 SSL 连接,
// 需要改为对应邮箱的 SMTP 服务器的端口, 具体可查看对应邮箱服务的帮助,
// QQ邮箱的SMTP(SLL)端口为465或587, 其他邮箱自行去查看)
props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
props.setProperty("mail.smtp.socketFactory.fallback", "false");
props.setProperty("mail.smtp.socketFactory.port", smtpPort);
props.put("mail.smtp.starttls.enable", "true");//启用TlS加密
Session session = Session.getInstance(props,new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
// TODO Auto-generated method stub
return new PasswordAuthentication(username,password);
}
});
// 控制台打印调试信息
session.setDebug(true);
return session;
}
/**
* 发送文本类型邮件
* @param subject 邮件主题
* @param sendMessage 邮件内容
* @param sendUser 发件人
* @param acceptUserList 收件人列表
*/
public static void textMailSend (String subject, String sendMessage, String sendUser, List<String> acceptUserList){
// 创建Session会话
Session session = createSession();
// 创建邮件对象
MimeMessage message = new MimeMessage(session);
try {
message.setSubject(subject);
//这里的sendMessage可以是一个String类型的html网页字符串,以此来设置sendMessage的换行等格式,如果直接用转义字符进行换行等操作,则不会生效(已测)
message.setContent(sendMessage,"text/html;charset=UTF-8");
message.setFrom(new InternetAddress(sendUser));//设置发件人邮箱
for (String acceptUser : acceptUserList) {
InternetAddress to = new InternetAddress(acceptUser);
message.addRecipient(Message.RecipientType.TO, to);//设置收件人邮箱
}
//发送
Transport.send(message);
} catch (MessagingException e) {
e.printStackTrace();
}
}
/**
* 发送带附件的邮件(可指定收件人和抄送人),Word,Excel,图片等都可以(具体可以上传哪些类型需自测)
* @param subject 邮件主题
* @param sendMessage 邮件内容
* @param sendUser 发件人
* @param acceptUserList 收件人列表
* @param extractsUserList 抄送人列表
* @param extractsFile 附件
*/
public static void withFileMailSend (String subject, String sendMessage, String sendUser, List<String> acceptUserList, List<String> extractsUserList, MultipartFile extractsFile){
try {
// 创建会话
Session session = createSession();
// 创建邮件
MimeMessage message = new MimeMessage(session);
message.setFrom(sendUser);//发件人邮箱
for (String acceptUser : acceptUserList) {
message.setRecipient(Message.RecipientType.TO, new InternetAddress(acceptUser));//主要收件人邮箱
}
InternetAddress[] InternetAddressArr = new InternetAddress[extractsUserList.size()];
int index = 0;
for(String extractsUser : extractsUserList){
InternetAddressArr[index] = new InternetAddress(extractsUser);
index++;
}
message.setRecipients(Message.RecipientType.CC, InternetAddressArr);//抄送人邮箱
message.setSubject(subject);
// 邮件主体
BodyPart textPart = new MimeBodyPart();
textPart.setContent(sendMessage,"text/html;charset=utf-8");
// 邮件附件
BodyPart filePart = new MimeBodyPart();
filePart.setFileName(extractsFile.getOriginalFilename());//附件显示名字.类型名
// 提交附件文件
filePart.setDataHandler(new DataHandler(new ByteArrayDataSource(extractsFile.getInputStream(),"application/octet-stream")));
Multipart multipart = new MimeMultipart();
multipart.addBodyPart(textPart);
multipart.addBodyPart(filePart);
// 将邮件装入信封
message.setContent(multipart);
Transport.send(message);
} catch (AddressException e) {
e.printStackTrace();
} catch (MessagingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
以下是如何获取邮箱授权码
![](https://img-blog.csdnimg.cn/direct/9278e4cd17c9498db45261aaccca44a9.png)
![](https://img-blog.csdnimg.cn/direct/31891072b0154d6fa6612db741ff5df4.png)
163邮箱相关连接信息SendMailConstant
public class SendMailConstant {
public static final String SEND_MAIL_USER = "xxx1@163.com";//发件人账号
public static final String SEND_MAIL_CODE = ""; //16位邮箱授权码
public static final String SEND_MAIL_HOST = "smtp.163.com"; //SMTP主机名
public static final String SEND_MAIL_PORT = "465"; //邮箱授权码
}