一、常见错误:
有一点一定要注意:就是一般的邮件服务器都会需要这样或者那样的验证,所以验证信息是必不可少的,体现在创建session的时候第二个参数
用户名密码或授权码形式的认证
重写Authenticator中的 getPasswordAuthentication 方法,把发送服务器用户密码传入,再生成session
Authenticator auth = new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(mail.getFrom(), mail.getPassword());
}
};
Session session = Session.getInstance(properties,auth);
二、pom依赖
javax.mail
mail
1.4.7
三、实体类
package cn.pkulaw.fblx.util.email;
/**
* @Author: WXM
* @Description:
* @Date: create in 2021/2/1 15:13
*/
public class MailEntity {
//发送方
private String from;
//接受方
private String to;
//邮件服务器
private String addr;
//授权码(授权码验证时需要)
private String auth;
//发送服务器端口号(非必须)
private Integer port;
//主题
private String subject;
//文本内容
private String text;
//附件路径
private String filePath;
//附件文件名
private String fileName;
//附件文件类型
private String fileType;
//附件文件
private byte[] file ;
public String getFileType() {
return fileType;
}
public void setFileType(String fileType) {
this.fileType = fileType;
}
public byte[] getFile() {
return file;
}
public void setFile(byte[] file) {
this.file = file;
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public Integer getPort() {
return port;
}
public void setPort(Integer port) {
this.port = port;
}
public String getAuth() {
return auth;
}
public void setAuth(String auth) {
this.auth = auth;
}
public String getFrom() {
return from;
}
public void setFrom(String from) {
this.from = from;
}
public String getTo() {
return to;
}
public void setTo(String to) {
this.to = to;
}
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public String getFilePath() {
return filePath;
}
public void setFilePath(String filePath) {
this.filePath = filePath;
}
}
三、email简单工具类
package cn.pkulaw.fblx.util.email;
import org.apache.tomcat.util.security.MD5Encoder;
import sun.security.provider.MD5;
import javax.activation.DataHandler;
import javax.activation.DataSource;
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 javax.mail.util.ByteArrayDataSource;
import java.io.*;
import java.nio.charset.Charset;
import java.util.Properties;
/**
* @Author: WXM
* @Description:
* @Date: create in 2021/2/1 13:25
*/
public class EmailUtils {
//利用带用户名密码或授权码 授权的邮箱服务器 发送简单的email
public static void sendSimWithAuth(MailEntity mail){
Properties properties = System.getProperties();
properties.setProperty("mail.smtp.host", mail.getAddr());
properties.put("mail.smtp.auth", "true");
if(null!=mail.getPort()){
properties.put("mail.smtp.port",mail.getPort());
}
Session session = Session.getDefaultInstance(properties, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(mail.getFrom(),mail.getAuth());
}
});
try {
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(mail.getFrom()));
message.addRecipient(Message.RecipientType.TO,new InternetAddress(mail.getTo()));
message.setSubject(mail.getSubject());
message.setText(mail.getText());
Transport.send(message);
} catch (MessagingException e) {
e.printStackTrace();
}
}
//利用带用户名密码或授权码 授权的邮箱服务器 发送带附件的email
public static void sendLocalServerWithAuth(MailEntity mail){
Properties properties = System.getProperties();
properties.setProperty("mail.smtp.host", mail.getAddr());
properties.setProperty("mail.smtp.auth", "true");
properties.setProperty("mail.smtp.starttls.enable", "true");
if(null!=mail.getPort()){
properties.put("mail.smtp.port",mail.getPort());
}
Authenticator auth = new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(mail.getFrom(), mail.getAuth());
}
};
Session session = Session.getInstance(properties,auth);
session.setDebug(true);
try {
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(mail.getFrom()));
message.addRecipient(Message.RecipientType.TO,new InternetAddress(mail.getTo()));
message.setSubject(mail.getSubject());
// 创建消息部分
BodyPart messageBodyPart = new MimeBodyPart();
// 消息
messageBodyPart.setText(mail.getText());
// 创建多重消息
Multipart multipart = new MimeMultipart();
// 设置文本消息部分
multipart.addBodyPart(messageBodyPart);
// 附件部分
messageBodyPart = new MimeBodyPart();
//设置附件文件名+文件类型
String filename = mail.getFileName();
messageBodyPart.setFileName(filename);
//设置附加实体
ByteArrayInputStream bais = new ByteArrayInputStream(mail.getFile());
DataSource source = new ByteArrayDataSource(bais,mail.getFileType());
messageBodyPart.setDataHandler(new DataHandler(source));
multipart.addBodyPart(messageBodyPart);
// 发送完整消息
message.setContent(multipart);
Transport.send(message);
} catch (Exception e) {
e.printStackTrace();
}
}
}
四、测试类
@Test
public void test10(){
//获取有标题列的excel对象
String[] title = {"编号","Gid","标题","发文字号","发布部门","发布时间","数据状态","后台","库别","匹配类型"};
XSSFWorkbook workBook = ExcelUtils.getExcelWithTitle(title);
MailEntity me = new MailEntity();
me.setFrom("[email protected]");
me.setTo("[email protected]");
me.setAddr("smtp.qq.com");
me.setAuth("xxx");
me.setSubject("test1");
me.setText("test1");
me.setFileName("test1.xlsx");
me.setFileType("application/excel");
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
workBook.write(baos);
byte[] bytes = baos.toByteArray();
me.setFile(bytes);
} catch (IOException e) {
e.printStackTrace();
}
EmailUtils.sendQQServerWithAuth(me);
}
@Test
public void test13(){
//获取有标题列的excel对象
String[] title = {"编号","Gid","标题","发文字号","发布部门","发布时间","数据状态","后台","库别","匹配类型"};
XSSFWorkbook workBook = ExcelUtils.getExcelWithTitle(title);
MailEntity me = new MailEntity();
me.setFrom("[email protected]");
me.setTo("[email protected]");
me.setAddr("smtp.xxx.com");
me.setAuth("xxx");
me.setSubject("test1");
me.setText("test1");
me.setFileName("test1.xlsx");
me.setFileType("application/excel");
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
workBook.write(baos);
byte[] bytes = baos.toByteArray();
me.setFile(bytes);
} catch (IOException e) {
e.printStackTrace();
}
EmailUtils.sendLocalServerWithAuth(me);
}