Javamail[Android]發送簡單郵件

1. 導入javamail for Android

javamail for Android是javamail兼容Android的版本,在build.gradle(Module: app)dependencies塊下加入以下依賴即可使用

// javamail[2019.2.19]
implementation 'com.sun.mail:android-mail:1.6.2'
implementation 'com.sun.mail:android-activation:1.6.2'

2. 需要使用的類

Session類可以當做一個包含了所有同服務器連接的配置的類

Properties類主要用於設置服務器,端口,協議等等連接配置

Authenticatorl類主要用於身份驗證,傳遞用戶名和密碼

MimeMessage類用於儲存一份郵件的內容

Transport類用於連接服務器和發送郵件

3. 構造一封簡單的純文本郵件(MimeMessage類的一個實例)

public MimeMessage generateMessage(String body) throws Exception {
    String from = "[email protected]";
	String to = "[email protected]";
    
    //生成一個MimeMessage實例,這裏需要傳入一個Session對象(這個對象的構建在後文介紹),
    MimeMessage msg = new MimeMessage(this.session);

    //發件人,可以設置成發件郵箱地址,或者使用 “別名<郵箱地址>” 的形式
    String nickname=javax.mail.internet.MimeUtility.encodeText("Noticer");
    msg.setFrom(new InternetAddress(nickname + "<" + from + ">"));
	//設置收件人郵箱,這裏Message.RecipientType.TO表示發送方,還可以是抄送等
    msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));

    //設置郵件主題(title)
    msg.setSubject("New notice");
    //設置發件時間
    msg.setSentDate(new Date());
    //設置郵件體
    msg.setText(body);
    
    //保存消息,這一步不能少
    msg.saveChanges();
    return msg;
}

4. 配置郵件服務器

1. Properties部分

setProperty方法和put方法效果類似,不過setProperty參數都是字符串,而put參數可以是任意對象,建議一般使用setProperty

//代碼中this.xx的表示方法所在類實例的屬性變量,這裏沒有給出請自己定義
private Properties serverConfig() throws GeneralSecurityException {
    Properties props = new Properties();
    //常規配置
    props.setProperty("mail.transport.protocol", this.protocol);
    props.setProperty("mail.smtp.host", this.server);
    props.setProperty("mail.smtp.port", this.port);
    //是否啓用用戶驗證
    props.setProperty("mail.smtp.auth", "true");	
    //連接郵件服務器的超時時間,單位爲毫秒,不要設置過短
    props.setProperty("mail.smtp.timeout", this.timeout); 
    props.setProperty("mail.debug", "true");
	
    //安全性配置,使用TLS或者SSL加密連接
    switch (this.security){
        //TLS連接時的配置
        case "tls":
            props.setProperty("mail.smtp.starttls.enable", "true");
            props.setProperty("mail.smtp.ssl.trust", this.server);
            break;
        //SSL連接時的配置
        case "ssl":
            props.setProperty("mail.smtp.ssl.enable", "true");
            MailSSLSocketFactory sslFactory = null;
            sslFactory = new MailSSLSocketFactory();
            props.put("mail.smtp.ssl.socketFactory", sslFactory);
    }
    return props;
}
2. Authenticator部分

Authenticator是個抽象類,我們這裏使用匿名類的方式,實現getPasswordAuthentication方法,返回用用戶名密碼構造的PasswordAuthentication實例即可

Authenticator authenticator = new Authenticator() {
    @Override
    protected PasswordAuthentication getPasswordAuthentication() {
        String usrname = "usr";
        String password = "password";
        return new PasswordAuthentication(usrname, password);
    }
};

3. 獲取Session實例

使用Session.getDefaultInstance來獲取session實例,該方法需要傳入上面構建的PropertiesAuthenticator實例,這個session在構建MimeMessage實例時被使用

this.session = Session.getDefaultInstance(properties, authenticator);

4. 發送郵件

使用Transport.send方法發送郵件,參數爲MimeMessage實例

public void send(MimeMessage msg) throws MessagingException {
        Transport.send(msg);
}

完整的用於發送簡單郵件的類請查看MailManager

詳細的javamail api請參考Javamail API

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章