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;
        }
    }
}

加载的邮箱配置文件
Java后台以附件的形式进行邮件发送的工具类

本工具类的邮件依赖包:

<!--邮件依赖-->
<dependency>
    <groupId>javax.mail</groupId>
    <artifactId>mail</artifactId>
    <version>1.5.0-b01</version>
</dependency>