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實例,該方法需要傳入上面構建的Properties
和Authenticator
實例,這個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