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
类主要用于设置服务器,端口,协议等等连接配置
Authenticator
类主要用于身份验证,传递用户名和密码
MimeMessage
类用于储存一份邮件的内容
Transport
类用于连接服务器和发送邮件
3. 构造一封简单的纯文本邮件(MimeMessage类的一个实例)
public MimeMessage generateMessage(String body) throws Exception {
String from = "january@163.com";
String to = "hello@icloud.com";
//生成一个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