之前我写的是个人邮箱发送,拿到甲方邮箱才知道是企业邮箱,诶呦把我搞得头都大了
在网上找了很多教程,原本想转载,可是我都找不到作者的原网页了,如果发现了请让我标注作者
企业邮箱和个人邮箱是不同的,企业邮箱不需要输入16位授权码,只需要账号密码,个人邮箱需要的是账号和16位授权码。
一,首先我们登录QQ企业邮箱看看有没有开配置
二,直接放代码(版本一 我用来发送验证码的,但是可以群发,也可以发文件)
import com.sun.mail.util.MailSSLSocketFactory;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.GeneralSecurityException;
import java.util.Date;
import java.util.Properties;
public class SendEmail {
private static String account = "登录账户";// 登录账户
private static String password = "登录密码";// 登录密码
private static String host = "smtp.exmail.qq.com";// 服务器地址
private static String port = "465";// 端口
private static String protocol = "smtp";// 协议
private static String sender = "发送人别名";
//初始化参数
public static Session initProperties() {
Properties properties = new Properties();
properties.setProperty("mail.transport.protocol", protocol);
properties.setProperty("mail.smtp.host", host);
properties.setProperty("mail.smtp.port", port);
// 使用smtp身份验证
properties.put("mail.smtp.auth", "true");
// 使用SSL,企业邮箱必需 start
// 开启安全协议
MailSSLSocketFactory mailSSLSocketFactory = null;
try {
mailSSLSocketFactory = new MailSSLSocketFactory();
mailSSLSocketFactory.setTrustAllHosts(true);
} catch (GeneralSecurityException e) {
e.printStackTrace();
}
properties.put("mail.smtp.enable", "true");
properties.put("mail.smtp.ssl.socketFactory", mailSSLSocketFactory);
properties.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
properties.put("mail.smtp.socketFactory.fallback", "false");
properties.put("mail.smtp.socketFactory.port", port);
Session session = Session.getDefaultInstance(properties, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(account, password);
}
});
// 使用SSL,企业邮箱必需 end
// TODO 显示debug信息 正式环境注释掉
session.setDebug(true);
return session;
}
// @param sender 发件人别名
// @param subject 邮件主题
//@param content 邮件内容
//@param receiverList 接收者列表,多个接收者之间用","隔开
//@param fileSrc 附件地址
public static void sendd( String subject, String content, String receiverList) {
try {
// , String fileSrc
Session session = initProperties();
MimeMessage mimeMessage = new MimeMessage(session);
mimeMessage.setFrom(new InternetAddress(account, sender));// 发件人,可以设置发件人的别名
// 收件人,多人接收
InternetAddress[] internetAddressTo = new InternetAddress().parse(receiverList);
mimeMessage.setRecipients(Message.RecipientType.TO, internetAddressTo);
// 主题
mimeMessage.setSubject(subject);
// 时间
mimeMessage.setSentDate(new Date());
// // 容器类 附件
// MimeMultipart mimeMultipart = new MimeMultipart();
// // 可以包装文本,图片,附件
// MimeBodyPart bodyPart = new MimeBodyPart();
// // 设置内容
// bodyPart.setContent(content, "text/html; charset=UTF-8");
// mimeMultipart.addBodyPart(bodyPart);
// // 添加图片&附件
// bodyPart = new MimeBodyPart();
// bodyPart.attachFile(fileSrc);
// mimeMultipart.addBodyPart(bodyPart);
// mimeMessage.setContent(mimeMultipart);
// mimeMessage.saveChanges();
// Transport.send(mimeMessage);
//设置内容
mimeMessage.setText(content);
mimeMessage.saveChanges();
//发送
Transport.send(mimeMessage);
} catch (MessagingException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
下面是版本二,是我直接发送表格的,修改成企业邮箱发送,其实就改了一句话,然后16位授权码变成密码
properties.setProperty("mail.smtp.host", "smtp.exmail.qq.com");
直接放代码吧,首先是生成表格的代码
import com.ruoyi.app.common.request.ToCookLogTwo;
import net.sf.json.JSONArray;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
public class CreatExcel {
public static ByteArrayOutputStream creatExcel(String[] title, String logs) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
//创建一个表格
Workbook workbook = new XSSFWorkbook();
// 创建一个工作薄对象
XSSFSheet sheet = (XSSFSheet) workbook.createSheet("sheet1");
//设置首行
XSSFRow row0 = sheet.createRow(0);
for(int i=0;i<title.length;i++) {
XSSFCell cell = (XSSFCell) row0.createCell(i);
cell.setCellValue(title[i]);
}
JSONArray jsonArr = JSONArray.fromObject(logs);//将前端传来的数据转换成JSONArray格式
List<ToCookLogTwo> toCookLogs = JSONArray.toList(jsonArr, ToCookLogTwo.class);//获得数组
String sd1 = "";//开始时间
String sd2 = "";//结束时间
//循环传来的数组,这样有几条数据生成几个表格
for (int i=0;i<toCookLogs.size();i++) {
//时间戳转时间
SimpleDateFormat sdf=new SimpleDateFormat("HH:mm:ss");
//yyyy-MM-dd
if(toCookLogs.get(i).getStart_time()!=null){
sd1 = sdf.format(new Date(Long.parseLong(String.valueOf(toCookLogs.get(i).getStart_time()))));
}
//时间戳转时间
if(toCookLogs.get(i).getEnd_time()!=null){
sd2 = sdf.format(new Date(Long.parseLong(String.valueOf(toCookLogs.get(i).getEnd_time()))));
}
//表格第二行是
String[] text = {sd1,sd2,toCookLogs.get(i).getType(),toCookLogs.get(i).getPractice(),toCookLogs.get(i).getMedium(), String.valueOf(toCookLogs.get(i).getTemp()),toCookLogs.get(i).getRemark()};
//设置第二行
XSSFRow row1 = sheet.createRow(i+1);
for(int j=0;j<text.length;j++) {
XSSFCell cell = (XSSFCell) row1.createCell(j);
cell.setCellValue(text[j]);
}
}
try {
workbook.write(baos); // write excel data to a byte array
baos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("创建成功 office excel");
return baos;
}
}
下面是发送邮件的代码
import net.sf.json.JSONArray;
import org.springframework.stereotype.Service;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.mail.*;
import javax.mail.internet.*;
import javax.mail.util.ByteArrayDataSource;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Properties;
@Service
public class SendEmailAndExcle {
public static boolean sendEmail(String to, ByteArrayOutputStream baos,String tit,String te) {
// 发件人电子邮箱
String from = "发件人电子邮箱";
// 获取系统属性
Properties properties = System.getProperties();
// 设置邮件服务器 ->QQ 邮件服务器
properties.setProperty("mail.smtp.host", "smtp.exmail.qq.com");
properties.put("mail.smtp.auth", "true");
properties.put("mail.smtp.port", "465");
properties.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
// 获取默认session对象
Session session = Session.getDefaultInstance(properties,new Authenticator(){
public PasswordAuthentication getPasswordAuthentication()
{
return new PasswordAuthentication("发件人邮件用户名", "密码"); //发件人邮件用户名、授权码
}
});
try{
// 创建默认的 MimeMessage 对象
MimeMessage message = new MimeMessage(session);
// Set From: 头部头字段
message.setFrom(new InternetAddress(from,"别名"));
// Set To: 头部头字段
message.addRecipient(Message.RecipientType.TO,new InternetAddress(to));
// Set Subject: 头部头字段
message.setSubject("This is the Subject Line!");
//邮件标题
message.setSubject(tit);
//邮件内容
//【因为要发送正文和邮件所以
// 1,设置邮件内容,混合模式
MimeMultipart msgMultipart = new MimeMultipart("mixed");
message.setContent(msgMultipart);
// 2,设置消息正文
MimeBodyPart content = new MimeBodyPart();
msgMultipart.addBodyPart(content);
// 3,设置正文格式
MimeMultipart bodyMultipart = new MimeMultipart("related");
content.setContent(bodyMultipart);
// 4,设置正文内容
MimeBodyPart htmlPart = new MimeBodyPart();
bodyMultipart.addBodyPart(htmlPart);
htmlPart.setContent(te, "text/html;charset=UTF-8");
//添加这些】
/*如果只发附件不要正文的话用这个*/
// Multipart multipart = new MimeMultipart();
if(baos.size()>0){
MimeBodyPart fileBody = new MimeBodyPart();
DataSource source = new ByteArrayDataSource(baos.toByteArray(), "application/msexcel");
fileBody.setDataHandler(new DataHandler(source));
// 中文乱码问题
fileBody.setFileName(MimeUtility.encodeText("log.xlsx"));
msgMultipart.addBodyPart(fileBody);
// 只发送附件的话
// multipart.addBodyPart(fileBody);
}
// 发送消息
Transport.send(message,message.getAllRecipients());
// 只发送附件的话
// Transport.send(message);
System.out.println("Sent message successfully....");
}catch (MessagingException mex) {
mex.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return false;
}
public static void send(String email, String logs, String tit, String te) {
String[] title = {"start time","end time","type","practice","medium","temp","remark"};
//生成表格
ByteArrayOutputStream baos = CreatExcel.creatExcel(title,logs);
//发送邮件 收件人邮箱,附件,邮件标题,邮件内容
SendEmailAndExcle.sendEmail(email,baos,tit,te);
}
}
在pom.xml中有这些
<!--发送邮件 -->
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
<!--发送邮件 -->
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>