天天看點

java通過SMTP發送QQ郵件的完全步驟

阿裡雲 ECS smtp.exmail.qq.com 25 端口不通

是以下面設定的25端口是不行的,替換成465端口并修改協定為ssl即可

阿裡雲的參考這篇部落格

http://blog.csdn.net/u013412790/article/details/
           
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import java.util.Calendar;
import java.util.Properties;

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

/**
 * @version V1.0
 * @Description: 發送郵件的工具類
 * @Modified By:Ming Created in  16:51 2017/2/6
 */
public class SendEmail {

    private static final Logger logger = LogManager.getLogger(SendEmail.class);

    private final static String smtpHost = "smtp.qq.com";//配置Email session對象
    private final static String messageType = "text/html;charset=UTF-8";//相應内容類型,編碼類型
    private final static String subject = "iYo (社聯網) 密碼修改";//主題
    private final static String fromEmail = "[email protected]";//發送郵件的郵箱
    private final static String password = "xxxxxxxxxxxxxxxx";//密碼(密碼)

    @SuppressWarnings("static-access")
    public boolean sendMessage(String to, int id) {
        try {
            String messageText = appendString(id);
            //第一步:配置javax.mail.Session對象
            Properties props = new Properties();   // 建立Properties 類用于記錄郵箱的一些屬性
            props.put("mail.smtp.host", smtpHost);  //此處填寫SMTP伺服器
            props.put("mail.smtp.starttls.enable", "true");//使用 STARTTLS安全連接配接
            props.put("mail.smtp.port", "25");             //google使用465或587端口
            props.put("mail.smtp.auth", "true");       // 表示SMTP發送郵件,必須進行身份驗證
            props.put("mail.debug", "true");
            Session mailSession = Session.getInstance(props, new MyAuthenticator(fromEmail, password));//此處填寫你的賬号和密碼(16位密碼)

            //第二步:編寫消息
            InternetAddress fromAddress = new InternetAddress(fromEmail);// 設定發件人的郵箱
            InternetAddress toAddress = new InternetAddress(to); // 設定收件人的郵箱
            MimeMessage message = new MimeMessage(mailSession);
            message.setFrom(fromAddress);
            message.addRecipient(RecipientType.TO, toAddress);
            message.setSentDate(Calendar.getInstance().getTime());
            message.setSubject(subject);   // 設定郵件标題
            message.setContent(messageText, messageType);// 設定郵件的内容體

            // 第三步:發送消息
            Transport transport = mailSession.getTransport("smtp");
            transport.connect(smtpHost, fromEmail, password);
            transport.send(message, message.getRecipients(RecipientType.TO)); // 發送郵件啦

            return true;
        } catch (MessagingException e) {
            e.printStackTrace();
            logger.error("郵件發送錯誤" + e.getMessage());
            return false;
        } catch (Exception e) {
            logger.error("郵件發送錯誤" + e.getMessage());
            return false;
        }
    }

    /**
     * @Author: Ming
     * @param: id  使用者id
     * @Description: 添加發送的短信的資訊
     * @Date: 17:12 2017/2/6
     */
    public static String appendString(int id) {
        int i;
        String t = "&nbsp";
        String messageText = "";

        for (i = ; i < ; i++) messageText += t;
        messageText += "xxxxxxxxx~<br/>";

        for (i = ; i < ; i++) messageText += t;
        messageText += "沒關系,xxxxxxxxx<br/>";

        for (i = ; i < ; i++) messageText += t;
        messageText += "工作室地點:xxxxxxxxx~<br/><br/>";

        for (i = ; i < ; i++) messageText += t;
        messageText += "請點選:http://xxxxxxxxx";
        return messageText;
    }

}
           
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;

/**
 * @version V1.0
 * @Description: 建構授權資訊,用于進行SMTP進行身份驗證
 * @Modified By:Ming Created in  10:22 2017/2/7
 */
class MyAuthenticator extends Authenticator {
    private String userName="";
    private String password="";

    public MyAuthenticator(String userName,String password){
        this.userName=userName;
        this.password=password;
    }
    protected PasswordAuthentication getPasswordAuthentication(){
        return new PasswordAuthentication(userName, password);
    }
}
           

注意:

如果出現這個錯誤:javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure 

這個是jdk導緻的,jdk裡面有一個jce的包,安全性機制導緻的通路https會報錯,官網上有替代的jar包,換掉就好了

目錄 %JAVA_HOME%\jre\lib\security裡的local_policy.jar,US_export_policy.jar

JDK7 http://www.oracle.com/technetwork/java/javase/downloads/jce--download-html

JDK8 http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-html
           

借鑒:

http://www.cnblogs.com/hxt/p/html
           

至此,郵件就應該能成功發出去啦。

本文是日常開發的随手記錄,如有問題,請博内留言以幫助我改正和完善,一起努力,一起學習,一起進步!如果覺得有幫助,記得贊一個喲。