一个邮件工具类

 

import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Properties;

import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

import org.springside.modules.utils.PropertiesLoader;

/**
 * 
 * TODO: 创建邮件类 历史记录: Date, Author, Descriptions
 * ---------------------------------------------------------
 * 
 * @Date 2018年4月12日
 * @author ***
 * @since 1.0.0
 */
public class MimeMessageUtil {

    /**
     * 
     * TODO: 创建Email
     * 
     * @param session
     *            根据参数配置,创建会话对象(为了发送邮件准备的)
     * @param sendMail
     *            发件人
     * @param receiveList
     *            收件人集合
     * @param ccList
     *            抄送人集合
     * @param bccList
     *            密送人集合
     * @param title
     *            标题
     * @param content
     *            内容
     * @param sendUserName
     *            发件人名称
     * @return
     */
    public static MimeMessage createMimeMessage(Session session, String sendMail,
            List> receiveList, List ccList,
            List bccList, String title, String content,
            String sendUserName) {
        // 创建一封邮件
        MimeMessage message = new MimeMessage(session);
        // 内容
        StringBuffer msgsb = new StringBuffer();
        msgsb.append(content);
        // msgsb.append("尊敬的");
        // From: 发件人
        try {
            message.setFrom(new InternetAddress(sendMail, "瑞华管理系统", "UTF-8"));
            // To: 收件人(可以增加多个收件人、抄送、密送)
            InternetAddress[] sendTo = new InternetAddress[receiveList.size()];
            if (receiveList != null && !receiveList.isEmpty()) {
                // Cc: 抄送(可选)
                for (int i = 0; i < receiveList.size(); i++) {
                    sendTo[i] = new InternetAddress(receiveList.get(i).get(
                            "email"));
                    /*
                     * if(i==receiveList.size()-1){
                     * msgsb.append(receiveList.get(i).get("userName")); }else{
                     * msgsb.append(receiveList.get(i).get("userName")+"、"); }
                     */
                }
            }
            message.setRecipients(MimeMessage.RecipientType.TO, sendTo);
            if (ccList != null && !ccList.isEmpty()) {
                // Cc: 抄送(可选)
                for (int i = 0; i < ccList.size(); i++) {
                    message.setRecipient(MimeMessage.RecipientType.CC,
                            new InternetAddress(ccList.get(i), "USER_EE",
                                    "UTF-8"));
                }
            }
            if (bccList != null && !bccList.isEmpty()) {
                // Cc: 抄送(可选)
                for (int i = 0; i < bccList.size(); i++) {
                    message.setRecipient(MimeMessage.RecipientType.BCC,
                            new InternetAddress(bccList.get(i), "USER_EE",
                                    "UTF-8"));
                }
            }
            // msgsb.append("你好:

");
            // msgsb.append("您的生日到了,"+content+"已发送到您的邮箱,请登录XXX收取。
");
            // msgsb.append("系统登录网址:XXXXXX
");
            // Subject: 邮件主题(标题有广告嫌疑,避免被邮件服务器误认为是滥发广告以至返回失败,请修改标题)
            message.setSubject(title, "UTF-8");
            // Content: 邮件正文(可以使用html标签)(内容有广告嫌疑,避免被邮件服务器误认为是滥发广告以至返回失败,请修改发送内容)
            message.setContent(msgsb.toString(), "text/html;charset=UTF-8");
            // 设置发件时间
            message.setSentDate(new Date());
            // 保存设置
            message.saveChanges();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (MessagingException e) {
            e.printStackTrace();
        }
        return message;
    }

    /**
     * TODO 发送邮件
     * 
     * @param receiveList
     *            收件人集合
     * @param ccList
     *            抄送(可为null)
     * @param bccList
     *            密送(可为null)
     * @param title
     *            标题
     * @param content
     *            内容
     * @param sendUserName
     *            发件人名称
     * @return
     */
    public static String sendMail(List> receiveList,
            List ccList, List bccList, String title,
            String content, String sendUserName) {
        String flag = "0";
        String emailSMTPHost = new PropertiesLoader(
                "config/base/config.properties").getProperty("mailSMTPHost");
        String sendEmail = new PropertiesLoader("config/base/config.properties")
                .getProperty("sendEmail");
        String sendEmailPwd = new PropertiesLoader(
                "config/base/config.properties").getProperty("sendEmailPwd");
        // 创建参数配置, 用于连接邮件服务器的参数配置
        Properties props = new Properties(); // 参数配置
        props.setProperty("mail.transport.protocol", "smtp"); // 使用的协议(JavaMail规范要求)
        props.setProperty("mail.smtp.host", emailSMTPHost); // 发件人的邮箱的 SMTP
        props.setProperty("mail.smtp.auth", "true"); // 需要请求认证
        /**
         * PS: 某些邮箱服务器要求 SMTP 连接需要使用 SSL 安全认证 (为了提高安全性, 邮箱支持SSL连接, 也可以自己开启),
         * 如果无法连接邮件服务器, 仔细查看控制台打印的 log, 如果有有类似 “连接失败, 要求 SSL 安全连接” 等错误, 打开下面
         * 之间的注释代码, 开启 SSL 安全连接。 SMTP 服务器的端口 (非 SSL 连接的端口一般默认为 25, 可以不添加, 如果开启了
         * SSL 连接, 需要改为对应邮箱的 SMTP 服务器的端口, 具体可查看对应邮箱服务的帮助,
         * 测试邮件发送请看log,好好看log
         * QQ邮箱的SMTP(SLL)端口为465或587, 其他邮箱自行去查看)
         **/

        // 调试时请配置调试邮箱注释以下代码
        final String smtpPort = "465";
        props.setProperty("mail.smtp.port", smtpPort);
        props.setProperty("mail.smtp.socketFactory.class",
                "javax.net.ssl.SSLSocketFactory");
        props.setProperty("mail.smtp.socketFactory.fallback", "false");
        props.setProperty("mail.smtp.socketFactory.port", smtpPort);

        // 根据配置创建会话对象, 用于和邮件服务器交互
        Session session = Session.getInstance(props);
        session.setDebug(true); // 设置为debug模式, 可以查看详细的发送 log
        // 创建一封邮件
        MimeMessage message;
        message = createMimeMessage(session, sendEmail, receiveList, ccList,
                bccList, title, content, sendUserName);
        try {
            // 根据 Session 获取邮件传输对象
            Transport transport = session.getTransport();
            /**
             * 使用 邮箱账号 和 密码 连接邮件服务器, 这里认证的邮箱必须与 message 中的发件人邮箱一致, 否则报错
             * 成败的判断关键在此一句, 如果连接服务器失败, 都会在控制台输出相应失败原因的 log, 仔细查看失败原因,
             * 有些邮箱服务器会返回错误码或查看错误类型的链接, 根据给出的错误 类型到对应邮件服务器的帮助网站上查看具体失败原因。
             * 连接失败的原因通常为以下几点, 仔细检查代码: (1) 邮箱没有开启 SMTP 服务; (2) 邮箱密码错误,
             * 例如某些邮箱开启了独立密码;(535错误) (3) 邮箱服务器要求必须要使用 SSL 安全连接; (4) 请求过于频繁或其他原因,
             * 被邮件服务器拒绝服务; (5) 如果以上几点都确定无误, 到邮件服务器网站查找帮助。 仔细看log, 认真看log, 看懂log,
             * 错误原因都在log已说明。
             */
            transport.connect(sendEmail, sendEmailPwd);
            // 发送邮件, 发到所有的收件地址, message.getAllRecipients()
            // 获取到的是在创建邮件对象时添加的所有收件人, 抄送人, 密送人
            transport.sendMessage(message, message.getAllRecipients());
            // 关闭连接
            transport.close();
        } catch (MessagingException e) {
            e.printStackTrace();
            flag = "1";
        }

        return flag;

    }
}
 

你可能感兴趣的:(java)