01 先导包
https://javaee.github.io/javamail/#Samples
里面找到 for android的连接
但是后面run时,报错以下内容
javax.mail.Session com.sun.mail.imap.IMAPStore.getSession() would have incor
这只是截取一小段,网上也找不到解决办法。
但是觉得是导包出错,网上搜导包语句,使用下面的两个语句放在build.gradle的 dependencies中,正常
implementation 'com.sun.mail:android-mail:1.5.5'
implementation 'com.sun.mail:android-activation:1.5.5'
02 写类
package com.example.myapplication;
import javax.mail.Address;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.NoSuchProviderException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.text.AttributedCharacterIterator;
import java.util.Properties;
public class SendMail {
String title;
String content;
SendMail(String title, String content){
this.title = title;
this.content = content;
}
public void send_mail() throws MessagingException {
// 新建 properties对象
Properties pro = new Properties();
// 设置主机
pro.setProperty("main.host", "smtp.qq.com");
// 设置传输协议
pro.setProperty("main.transport.protocol", "smtp");
// 设置允许邮箱认证
pro.setProperty("mail.smtp.auth", "true");
// 设置认证器
SendMail.Auth auth = new SendMail.Auth();
// 获取一个会话对象
Session session = Session.getDefaultInstance(pro, auth);
// 获取连接
Transport ts = session.getTransport();
// 连接服务器
ts.connect("smtp.qq.com", "xxxxxxxxxx@qq.com", "授权码");
// 创建邮件对象
MimeMessage message = new MimeMessage(session);
// 设置发件人地址
message.setFrom(new InternetAddress("xxxxxxxxxx@qq.com"));
// 设置收件人地址
message.setRecipient(Message.RecipientType.TO, new InternetAddress("xxxxxxxxxx@qq.com"));
// 设置邮件标题
message.setSubject(title);
// 设置内容
message.setContent(content, "text/html;charset=gbk");
// 发送邮件
ts.sendMessage(message, message.getAllRecipients());
// 关闭连接
ts.close();
}
class Auth extends Authenticator {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("xxxxxxxxxx@qq.com", "授权码");
}
}
}
03 实例化,在activity中调用
SendMail sendMail = new SendMail(mail_title, mail_content);
try {
sendMail.send_mail();
Toast.makeText(MainActivity.this, "邮件发送成功", Toast.LENGTH_SHORT).show();
} catch (MessagingException e) {
e.printStackTrace();
}
注意01 配置网络
这是报错
android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1315)
配置网络访问权限
注意02 缺少其他包
按照上面的代码运行时,调用发送邮件类会报错,如下,只贴几行:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.myapplication, PID: 32340
android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1315)
at java.net.Inet6AddressImpl.lookupHostByName(Inet6AddressImpl.java:86)
at java.net.Inet6AddressImpl.lookupAllHostAddr(Inet6AddressImpl.java:74)
网上搜,和线程有关,大概意思是,网络相关操作不能放在主线程上,多线程我还没学呢。
参照这个博文解决办法
https://blog.csdn.net/zxnlmj/article/details/25887447
在onCreate中放如下代码,ok
StrictMode.ThreadPolicy policy=new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);



