Java Mail發送郵件

  在平常開發過程當中,不少人都會遇到java發送郵件的需求,整理了一下,提供兩種發送郵件的方式:1.使用eml模版羣發;2.自定義主題和內容單發;html

  若是遇到鏈接失敗等發送失敗的問題,能夠在代碼中增長session.setDebug(true);  能夠查看詳細的錯誤日誌,具體代碼實現以下:  java

import java.io.InputStream;
import java.util.Date;
import java.util.List;
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.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * @Description: 發送郵件
 * @author yehaixiao
 * @date 2017年7月25日
 */
public class SendEmailTest {

    private final static Log LOG = LogFactory.getLog(SendEmailTest.class);

    private static final String MAIL_SERVER_HOST = "發件人郵箱服務器的地址";

    private static final String USER = "發件人的郵箱帳號";

    private static final String PASSWORD = "發件人的密碼";

    /**
     * 按照指定模版羣發郵件
     * 
     * @param toEmails
     * @param emlPath
     */
    public static void sendMassEml(List<String> toEmails, String emlPath) {
        if (toEmails == null || toEmails.size() == 0) {
            return;
        }
        Properties props = new Properties();
        // 使用的協議(JavaMail規範要求)
        props.setProperty("mail.transport.protocol", "smtp");
        // 發件人的郵箱的 SMTP
        props.setProperty("mail.smtp.host", MAIL_SERVER_HOST);
        // 須要請求認證
        props.setProperty("mail.smtp.auth", "true");
        Transport transport = null;
        try {
            // PS: 某些郵箱服務器要求 SMTP 鏈接須要使用 SSL 安全認證 (爲了提升安全性, 郵箱支持SSL鏈接, 也能夠本身開啓),
            // 若是沒法鏈接郵件服務器, 仔細查看控制檯打印的 log, 若是有有相似 「鏈接失敗, 要求 SSL 安全鏈接」 等錯誤,
            // 打開下面 註釋代碼, 開啓 SSL 安全鏈接。

            // SMTP 服務器的端口 (非 SSL 鏈接的端口通常默認爲 25, 能夠不添加, 若是開啓了 SSL 鏈接,
            // 須要改成對應郵箱的 SMTP 服務器的端口, 具體可查看對應郵箱服務的幫助, 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.getDefaultInstance(props);
            // 設置爲debug模式, 能夠查看詳細的發送 log
            session.setDebug(false);
            // 根據 Session 獲取郵件傳輸對象
            transport = session.getTransport();
            // 使用 郵箱帳號 和 密碼 鏈接郵件服務器, 這裏認證的郵箱必須與 message 中的發件人郵箱一致, 不然報錯
            //
            // PS_01: 成敗的判斷關鍵在此一句, 若是鏈接服務器失敗, 都會在控制檯輸出相應失敗緣由的 log,
            // 仔細查看失敗緣由, 有些郵箱服務器會返回錯誤碼或查看錯誤類型的連接, 根據給出的錯誤
            // 類型到對應郵件服務器的幫助網站上查看具體失敗緣由。
            //
            // PS_02: 鏈接失敗的緣由一般爲如下幾點, 仔細檢查代碼:
            // (1) 郵箱沒有開啓 SMTP 服務;
            // (2) 郵箱密碼錯誤, 例如某些郵箱開啓了獨立密碼;
            // (3) 郵箱服務器要求必需要使用 SSL 安全鏈接;
            // (4) 請求過於頻繁或其餘緣由, 被郵件服務器拒絕服務;
            // (5) 若是以上幾點都肯定無誤, 到郵件服務器網站查找幫助。
            //
            // PS_03: 仔細看log, 認真看log, 看懂log, 錯誤緣由都在log已說明。
            transport.connect(USER, PASSWORD);
            for (String toEmail : toEmails) {
                // 建立一封郵件
                MimeMessage message = createMimeMessageByEml(session, toEmail, emlPath);
                // 發送郵件, 發到全部的收件地址, message.getAllRecipients()
                // 獲取到的是在建立郵件對象時添加的全部收件人,
                // 抄送人, 密送人
                transport.sendMessage(message, message.getAllRecipients());
            }
            LOG.info("發送郵件成功,總數:" + toEmails.size());
        } catch (Exception e) {
            LOG.error("發送郵件失敗", e);
        } finally {
            if (transport != null) {
                try {
                    // 關閉鏈接
                    transport.close();
                } catch (MessagingException e) {
                    LOG.error("關閉通道失敗", e);
                }
            }
        }
    }

    /**
     * 建立指定eml模版郵件
     * 
     * @param session
     * @param sendMail
     * @param receiveMail
     * @param eml
     * @return
     * @throws Exception
     */
    private static MimeMessage createMimeMessageByEml(Session session, String toEmail, String eml) throws Exception {
        InputStream stream = Thread.currentThread().getContextClassLoader().getResourceAsStream(eml);
        // 建立一封本地郵件
        MimeMessage message = new MimeMessage(session, stream);
        // From: 發件人
        // InternetAddress 的三個參數分別爲: 郵箱, 顯示的暱稱(只用於顯示, 沒有特別的要求), 暱稱的字符集編碼
        message.setFrom(new InternetAddress(USER, "網易見外"));
        // To: 收件人(能夠增長多個收件人、抄送、密送)
        message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(toEmail));
        // Subject: 郵件主題
        // 設置發件時間
        message.setSentDate(new Date());
        // 保存設置
        message.saveChanges();
        stream.close();
        return message;
    }

    /**
     * 發送簡單的郵件
     * 
     * @param toEmail
     * @param subject
     * @param content
     */
    public static void sendSimpleContent(String toEmail, String subject, String content) {
        Properties props = new Properties();
        props.setProperty("mail.transport.protocol", "smtp");
        props.setProperty("mail.smtp.host", MAIL_SERVER_HOST);
        props.setProperty("mail.smtp.auth", "true");
        try {
            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.getDefaultInstance(props);
            session.setDebug(false);
            MimeMessage message = createSimpleMessage(session, toEmail, subject, content);
            Transport transport = session.getTransport();
            transport.connect(USER, PASSWORD);
            transport.sendMessage(message, message.getAllRecipients());
            transport.close();
            LOG.info("發送郵件成功,收件人:" + toEmail);
        } catch (Exception e) {
            LOG.error("發送郵件失敗", e);
        }
    }

    /**
     * 建立簡單的文本郵件
     * 
     * @param session
     * @param toEmail
     * @param subject
     * @param content
     * @return
     * @throws Exception
     */
    private static MimeMessage createSimpleMessage(Session session, String toEmail, String subject, String content)
            throws Exception {
        MimeMessage message = new MimeMessage(session);
        message.setFrom(new InternetAddress(USER));
        message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(toEmail));
        message.setSubject(subject, "UTF-8");
        message.setContent(content, "text/html;charset=UTF-8");
        message.setSentDate(new Date());
        message.saveChanges();
        return message;
    }
}
相關文章
相關標籤/搜索