Java后台以附件的形式进行邮件发送的工具类
本人接触的项目中,有很多是有关于进行邮件发送进行预购,通知,通告,报告之类的,所以难免会发很多邮件,但是一个功能写一个方法实在是太繁琐了,所以这是适用于以word/excel的形式,进行邮件发送的方式
package com.geenk.market.common.util.email;//(包路径)
import com.geenk.market.common.util.StringUtil;//(自己的工具类)
//日志
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
//邮件有关的包
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.mail.*;
import javax.mail.internet.*;
import javax.mail.util.ByteArrayDataSource;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.Properties;
/**
* @author huaiyan
* @Description 本工具类是将word/excel等格式的文档作为附件进行邮件发送
* @ClassName WordToEmailUtil
* @create 2019-02-28 15:27
*/
public class WordToEmailUtil {
//发送人的登录用户名
private static String userName;
//发送人的登录密码
private static String pass;
//发件人的邮箱地址
private static String from;
//服务器地址--主机
private static String host;
//端口
private static String port;
//协议
private static String protocol;
public static final Logger logger = LoggerFactory.getLogger(WordToEmailUtil.class);
static {
Properties prop = new Properties();
try {
prop.load(WordToEmailUtil.class.getResourceAsStream("/mailConfig.properties"));
} catch (IOException e) {
logger.info("加载邮箱配置文件失败", e);
}
userName = prop.getProperty("e.account");
pass = prop.getProperty("e.pass");
from = prop.getProperty("e.from");
host = prop.getProperty("e.host");
port = prop.getProperty("e.port");
protocol = prop.getProperty("e.protocol");
}
//用户名密码验证,需要实现抽象类Authenticator的抽象方法PasswordAuthentication
static class MyAuthenricator extends Authenticator {
String u = null;
String p = null;
public MyAuthenricator(String u, String p) {
this.u = u;
this.p = p;
}
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(u, p);
}
}
/**
* @param inputStream 文件流,即处理好的输入流文件
* @param subject 邮件主题
* @param htmlContent 邮件正文内容
* @param to 发给谁 (接收人和抄送人都在系统变量里直接配置了,多个的话以‘,’分隔)
* @param cc 抄送给谁?
* @param fujian 附件的名字加后缀,例:我的文件.xls 或者 例子: 我的文件.doc 等等格式文件!!!
*/
public static boolean sendEmailToSomeOne(InputStream inputStream, String subject, String htmlContent, String to, String cc, String fujian) {
boolean flag = false;
try {
logger.info("WordToEmailUtil.sendEmailToSomeOne info={}","开始调用工具类WordToEmailUtil,开始发送邮件!");
long currentTimeMillis = System.currentTimeMillis();
//加载配置文件
Properties properties = new Properties();
//设置主机地址
properties.setProperty("mail.smtp.host", host);
//设置邮件协议
properties.setProperty("mail.transport.protocol", protocol);
//进行认证
properties.setProperty("mail.smtp.auth", "true");
// 端口识别
properties.setProperty("mail.smtp.port", port);
//ssl是否启用
//使用SSL,企业邮箱必需!
properties.setProperty("mail.smtp.ssl.enable", "true");
//防止报 Could not connect to SMTP host这种错
properties.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
//创建session
Session session = Session.getDefaultInstance(properties, new MyAuthenricator(userName, pass));
//开启Session的debug模式,这样就可以查看到程序发送Email的运行状态,false表示在控制台不可看,true代表在控制台可看
session.setDebug(true);
//创建邮件对象
MimeMessage message = new MimeMessage(session);
//邮件的主标题
if (!StringUtil.isEmpty(subject)) {
message.setSubject(subject);
} else {
message.setSubject("这是邮件主题!");
}
//邮件发送日期
message.setSentDate(new Date());
//指明邮件的发件人
message.setFrom(new InternetAddress(userName));
//多个收件人,收件人是不能为空,为空的话,邮件不进行发送!直接返回false
boolean toSomeOne = isSplit(to, message);
if (!toSomeOne) {
logger.info("WordToEmailUtil.sendEmailToSomeOne info={}","收件人邮箱为空,邮件被动终止!");
return flag;
}
//多个抄送人,与接收人一样的逻辑!
isSplit(cc, message);
Multipart multipart = new MimeMultipart();
//添加邮件正文
BodyPart contentBodyPart = new MimeBodyPart();
if (!StringUtil.isEmpty(htmlContent)) {
//防止乱码
contentBodyPart.setContent(htmlContent, "text/html;charset=UTF-8");
} else {
contentBodyPart.setContent("这是邮件正文内容!", "text/html;charset=UTF-8");
}
//将正文添加到邮件中
multipart.addBodyPart(contentBodyPart);
//inputStream,这是数据源,.doc文件转成流发送,Excel也可以进行
if (!StringUtil.isEmpty(inputStream)) {
DataSource datasource = new ByteArrayDataSource(inputStream, "application/msexcel");
//设置第一个附件的数据,如果有多个附件,这里对数据源进行遍历处理即可!
MimeBodyPart attch = new MimeBodyPart();
attch.setDataHandler(new DataHandler(datasource));
//文件是否进行重命名,--要加上相应文件的后缀,以附件形式进行发送!
String fileName = fujian;
//防止乱码,这里进行编码!
attch.setFileName(MimeUtility.encodeText(fileName));
//将附件添加上去
multipart.addBodyPart(attch);
message.setContent(multipart);
//最后进行邮件发送,Transport每次发送成功程序都会帮忙关闭,不需要手动close
Transport.send(message, message.getAllRecipients());
logger.info("WordToEmailUtil.sendEmailToSomeOne info={}", "以" + fileName + "作为附件,邮件成功发送到对方!");
long timeMillis = System.currentTimeMillis();
float times = (float)(timeMillis - currentTimeMillis)/1000;
flag = true;
logger.info("WordToEmailUtil.sendEmailToSomeOne info={}","发送邮件完毕,耗时 "+times);
} else {
//说明附件为空,那就不是这个方法了!!!
logger.info("WordToEmailUtil.sendEmailToSomeOne info={}", "数据源文件为空,加载附件失败,发送邮件被动终止!");
return flag;
}
} catch (Exception e) {
logger.error("WordToEmailUtil.sendEmailToSomeOne error={}", "系统异常,数据源或者其他必须参数为空!");
logger.error("WordToEmailUtil.sendEmailToSomeOne error={}", "系统异常,发送邮件被动终止!");
e.printStackTrace();
} finally {
try {
if (inputStream != null) {
inputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
logger.info("WordToEmailUtil.sendEmailToSomeOne info={}","调用工具类WordToEmailUtil结束,发送邮件完毕");
return flag;
}
/**
* 对系统传过来的接收人或者抄送人进行判断是否多个
* @param SomeOne 接收人或抄送人
* @param message 信息流
* @return
* @throws MessagingException
*/
private static boolean isSplit(String SomeOne, MimeMessage message) throws MessagingException {
if (!StringUtil.isEmpty(SomeOne)) {
if (SomeOne.contains(",")) {
String[] splits = SomeOne.split(",");
// 构建一个群发地址数组
InternetAddress[] adr = new InternetAddress[splits.length];
for (int i = 0; i < splits.length; i++) {
adr[i] = new InternetAddress(splits[i]);
}
// Message的setRecipients方法支持群发。。
// 注意:setRecipients方法是复数和点 到点不一样
message.setRecipients(Message.RecipientType.CC, adr);
return true;
} else {
//说明只有一个接收人或者抄送人
message.setRecipient(Message.RecipientType.CC, new InternetAddress(SomeOne));
return true;
}
}else {
//收件人或抄送人为空
return false;
}
}
}
加载的邮箱配置文件
本工具类的邮件依赖包:
<!--邮件依赖-->
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.5.0-b01</version>
</dependency>