1.android studio版本
最近从官网下载的最近版本android studio,和官网文档中提示的配置文档有点差别,记录一下,以后会用到
2.jar下载
从网上找的javaEmail所需的jar包,同时还需要其他关联两个jar包,但需要翻墙下载,需要可从百度网盘下载
3.功能开发
具体开发过程可以自行百度相关代码,这里不是重点,主要是记录jar包
4.邮箱开启登录权限
值得注意的是,需要开启对应邮箱的POP3/SMTP/IMAP服务,qq以及163邮箱都有对应的教程
5.账号信息设置核心代码
//关键导入
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Address;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
public class EmailSender{
private static final TAG = "EmailSender";
// 发送邮件
public static void SendEmail(String subject, String content, String[] files)
{
// 邮件换成真实的邮箱地址即可
SendEmail(new String[]{"1234@qq.com", "2345@163.com"}, new String[]{"3456@qq.com", "4567@163.com"}, subject, content, files)
}
// 发送邮件,通过线程进行发送
public static void SendEmail(String[] to, String[] copyto, String subject, String content, String[] files)
{
new Thread(){
public void run(){
SendEmailByJavaEmail(to,copyto,subject,content,files);
}
}.start();
}
/**
* 发送邮件
*
* 邮件接收地址,可多个
* 抄送地址,可多个
* 主题/标题
* 附件,可多个
*/
private static void SendEmailByJavaEmail(String[] to, String[] copyto, String subject, String content, String[] files)
{
if(to == null || to.length == 0)
{
Log.e(TAG,"SendEmailByJavaEmail: 发送地址为null");
return;
}
for(String url : to){
if(!checkEmailURL(url)){
Log.e(TAG,"SendEmailByJavaEmail: 发送地址格式错误! \nUrl:" + url);
return;
}
}
if(copyto != null && copyto.length > 0)
{
for(String url : copyto){
if(!checkEmailURL(url)){
Log.e(TAG,"SendEmailByJavaEmail: 抄送地址格式错误! \nUrl:" + url);
return;
}
}
}
Properties prop = new Properties();
// 发送邮件的服务器的IP
prop.put("mail.smtp.host", "smtp.163.com");
// 发送邮件的服务器的端口
prop.put("mail.smtp.port", "25");
// 发送邮件的服务器的协议
prop.put("mail.transport.protocol", "smtp");
// 发送邮件的服务器的协议
prop.put("mail.smtp.auth", "true");
// 根据邮件会话属性和密码验证器构造一个发送邮件的session
Session sendMailSession = Session.getInstance(prop);
// 开启Session的debug模式, 这样就可以查看到程序发送Email的运行状态
sendMailSession.setDebug(true);
MimeMultipart multipart = new MimeMultipart();
try{
// 通过session得到transport对象,以便连接邮箱并发送
Transport transport = sendMailSession.getTransport();
// 使用邮箱的用户名和密码连上邮件服务器
// yourself@163.com: 可以使用邮箱,如果连接失败的话换成与邮箱绑定的手机号码
// code: 开启POP3/SMTP/IMAP服务时自动生成的验证码(也可以使用密码试试,建议不要使用密码,不安全)
transport.connect("smtp.163.com", "yourself@163.com", "code");
// 根据session创建一条邮件信息
Message mailMessage = new MimeMessage(sendMailSession);
// 创建邮件发送者地址
// yourself@163.com: 163邮箱默认有俩个邮箱地址,一个是:数字 + @163.com,另一个是:m+数字+_1@163.com,两个都试试
Address fromAddress = new InternetAddress("yourself@163.com");
// 设置邮件消息的发送者
mailMessage.setFrom(fromAddress);
// 设置邮件接收地址
Address[] toList = new Address[to.length];
for (int i = 0; i < to.length; i++) {
toList[i] = new InternetAddress(to[i]);
}
mailMessage.setRecipients(Message.RecipientType.TO,toList);
// 抄送地址设置
if(copyto != null && copyto.length > 0){
Address[] copytoList = new Address[copyto.length];
for (int i = 0; i < copyto.length; i++) {
copytoList[i] = new InternetAddress(copyto[i]);
}
mailMessage.setRecipients(Message.RecipientType.CC,copytoList);
}
// 设置主题/标题
mailMessage.setSubject(subject);
// 设置邮件内容
MimeBodyPart bodyPart = new MimeBodyPart();
bodyPart.setContent(content, "text/html;charset=gbk");
multipart.addBodyPart(bodyPart);
// 附件设置, 需要获取到存储的相对路径,未测试
if(files != null && files.length > 0){
for(String file : files){
bodyPart = new MimeBodyPart();
DataHandler dh = new DataHandler(new FileDataSource(Environment.getExternalStorageDirectory().getPath() + "/" + file));
bodyPart.setDataHandler(dh);
bodyPart.setFileName((new Date()).toString());
multipart.addBodyPart(bodyPart);
}
multipart.setSubType("mixed");
}
mailMessage.setContent(multipart);
mailMessage.saveChanges();
// // add handlers for main MIME types
// MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap();
// mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html");
// mc.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml");
// mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain");
// mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed");
// mc.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822");
// CommandMap.setDefaultCommandMap(mc);
// 发送邮件
transport.sendMessage(mailMessage, mailMessage.getAllRecipients());
// 关闭连接
transport.close();
}
catch (Exception e) {
e.printStackTrace();
}
}
// 检查邮件地址是否合法
public static boolean checkEmailURL(String url)
{
String contact = url.trim();
if(contact == "")
return false;
String matchStr = "\\b^['_a-z0-9-\\+]"
+ "+(\\.['_a-z0-9-\\+]+)*@[a-z0-9-]+"
+ "(\\.[a-z0-9-]+)*\\.([a-z]{2}|aero|arpa|asia"
+ "|biz|com|coop|edu|gov|info|int|jobs|mil|mobi|museum|"
+ "name|nato|net|org|pro|tel|travel|xxx)$\\b";
return contact.matches(matchStr);
}
}
AndroidManifest添加权限
<!-- 网络访问 -->
<uses-permission android:name="android.permission.INTERNET" />
后记
- 需要注意的是, transport.connect这个方法账号和密码的设置
- 第二参数为自己邮箱账号,163邮箱使用手机号注册的,邮箱地址为: 手机号@qq.com,但日志提示不是绑定的账号连接不上,各种调整都连不上,后来改用用注册手机号,居然连接成功了
- 三个参数为验证码,需要开启POP3/SMTP/IMAP服务,可以百度如何开启
- 发送地址也有点绕, 163邮箱的默认有两个邮箱,主邮箱为: m手机号_1@163.com,另一个邮箱: 手机号@qq.com,不知道那个是主邮箱,可以测试一下就知道,至于qq可能就没这么麻烦吧
- 结束
本文含有隐藏内容,请 开通VIP 后查看