Android开发-在Android应用里实现自动发送邮件的功能

Posted sl413

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android开发-在Android应用里实现自动发送邮件的功能相关的知识,希望对你有一定的参考价值。

前段时间由于项目的必须,就是在android应用于里的用户对系统功能必须当用户输出对系统的文本信息后,用户页面递交按钮自动把对系统的文本信息已发送到邮件的形式发送给开发者。

要构建这个功能,首先必须两个邮箱账号,一个是发送到方的邮箱地址,一个是接管方的邮箱地址。还必须发送到方的邮箱许可码(许可码一般是16位的字符串,分解后一般用作客户端的指定,下文不会谈如何在指定网页版的邮箱自动分解许可码)、发送到方的邮箱服务器(比如QQ邮箱的服务器为:smtp.qq.com)、发送到方的邮箱端口号(比如QQ邮箱的端口号为:587)。这些流程都已完成后就可以展开编码的操作者了。

在开始编码之前首先在AndroidStudio的build.gradle的dependencies模块里引进构建发送到邮箱涉及的倚赖库。

dependencies {
...
implementation ‘com.sun.mail:android-mail:1.5.5‘
implementation ‘com.sun.mail:android-activation:1.5.5‘
}
然后在AndroidStudio的表格文件AndroidManifest.xml里加到采访网络涉及权限。

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
下面就月转入编码的操作者流程。

新建一个SendMailUtil.java工具类
import android.support.annotation.NonNull;

import net.fkm.mailtest.MyApplication;
import net.fkm.mailtest.ShareUtils;

import java.io.File;

public class SendMailUtil {

public static void send(final File file, String toAdd) {
final MailInfo mailInfo = creatMail(toAdd);
final MailSender sms = new MailSender();
new Thread(new Runnable() {
@Override
public void run() {
sms.sendFileMail(mailInfo, file);
}
}).start();
}

public static void send(String toAdd) {
final MailInfo mailInfo = creatMail(toAdd);
final MailSender sms = new MailSender();
new Thread(new Runnable() {
@Override
public void run() {
sms.sendTextMail(mailInfo);
}
}).start();
}

@NonNull
private static MailInfo creatMail(String toAdd) {

String HOST = ShareUtils.getString(MyApplication.getInstance(), "HOST", "");
String PORT = ShareUtils.getString(MyApplication.getInstance(), "PORT", "");
String FROM_ADD = ShareUtils.getString(MyApplication.getInstance(), "FROM_ADD", "");
String FROM_PSW = ShareUtils.getString(MyApplication.getInstance(), "FROM_PSW", "");
final MailInfo mailInfo = new MailInfo();
mailInfo.setMailServerHost(HOST);//发送到方邮箱服务器
mailInfo.setMailServerPort(PORT);//发送到方邮箱端口号
mailInfo.setValidate(true);
mailInfo.setUserName(FROM_ADD); // 发送者邮箱地址
mailInfo.setPassword(FROM_PSW);// 发送者邮箱许可码
mailInfo.setFromAddress(FROM_ADD); // 发送者邮箱
mailInfo.setToAddress(toAdd); // 接收者邮箱
mailInfo.setSubject("Android应用于测试"); // 邮件主题
mailInfo.setContent("哈哈"); // 邮件文本
return mailInfo;
}

}
该类是提供发送到邮件信息的类,只要提供发送到方邮箱服务器、发送到方邮箱端口号、发送者邮箱地址、发送者邮箱许可码、发送者邮箱、接收者邮箱、发送到邮件的主题以及邮件文本的操作者信息。

新建一个MailInfo.java实体类
import java.util.Properties;

public class MailInfo {

private String mailServerHost;// 发送到邮件的服务器的IP
private String mailServerPort;// 发送到邮件的服务器的端口
private String fromAddress;// 邮件发送者的地址
private String toAddress; // 邮件接收者的地址
private String userName;// 登岸邮件发送到服务器的用户名
private String password;// 登岸邮件发送到服务器的密码
private boolean validate = true;// 否必须身份验证
private String subject;// 邮件主题
private String content;// 邮件的文本内容
private String[] attachFileNames;// 邮件附件的文件名

/**
* 取得邮件不会话属性
*/
public Properties getProperties() {
Properties p = new Properties();
p.put("mail.smtp.host", this.mailServerHost);
p.put("mail.smtp.port", this.mailServerPort);
p.put("mail.smtp.auth", validate ? "true" : "false");
return p;
}

public String getMailServerHost() {
return mailServerHost;
}

public void setMailServerHost(String mailServerHost) {
this.mailServerHost = mailServerHost;
}

public String getMailServerPort() {
return mailServerPort;
}

public void setMailServerPort(String mailServerPort) {
this.mailServerPort = mailServerPort;
}

public boolean isValidate() {
return validate;
}

public void setValidate(boolean validate) {
this.validate = validate;
}

public String[] getAttachFileNames() {
return attachFileNames;
}

public void setAttachFileNames(String[] fileNames) {
this.attachFileNames = fileNames;
}

public String getFromAddress() {
return fromAddress;
}

public void setFromAddress(String fromAddress) {
this.fromAddress = fromAddress;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}

public String getToAddress() {
return toAddress;
}

public void setToAddress(String toAddress) {
this.toAddress = toAddress;
}

public String getUserName() {
return userName;
}

public void setUserName(String userName) {
this.userName = userName;
}

public String getSubject() {
return subject;
}

public void setSubject(String subject) {
this.subject = subject;
}

public String getContent() {
return content;
}

public void setContent(String textContent) {
this.content = textContent;
}

}
在该类下主要对发送到邮件的一些常用对象字段的序列化过程(如:发送到邮件的服务器的IP、发送到邮件的服务器的端口、邮件发送者的地址等)。

沈阳网站制作新建一个MailSender.java邮件发送器类
import net.fkm.mailtest.L;

import java.io.File;
import java.util.Date;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Address;
import javax.mail.Authenticator;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
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;
import javax.mail.internet.MimeUtility;

/**
* 邮件发送器
*/
public class MailSender {
/**
* 以文本格式发送到邮件
*
* @param mailInfo 待发送到的邮件的信息
*/
public boolean sendTextMail(final MailInfo mailInfo) {

// 辨别否必须身份认证
MyAuthenticator authenticator = null;
Properties pro = mailInfo.getProperties();
if (mailInfo.isValidate()) {
// 如果必须身份认证,则创立一个密码检验器
authenticator = new MyAuthenticator(mailInfo.getUserName(), mailInfo.getPassword());
}
// 根据邮件不会话属性和密码检验器结构一个发送到邮件的session
Session sendMailSession = Session.getDefaultInstance(pro, authenticator);

// Session sendMailSession = Session.getInstance(pro, new Authenticator() {
// @Override
// protected PasswordAuthentication getPasswordAuthentication() {
// return new PasswordAuthentication(mailInfo.getUserName(),mailInfo.getPassword());
// }
// });

try {
// 根据session创立一个邮件消息
Message mailMessage = new MimeMessage(sendMailSession);
// 创立邮件发送者地址
Address from = new InternetAddress(mailInfo.getFromAddress());
// 设置邮件消息的发送者
mailMessage.setFrom(from);
// 创立邮件的接收者地址,并设置到邮件消息中
Address to = new InternetAddress(mailInfo.getToAddress());
mailMessage.setRecipient(Message.RecipientType.TO, to);
// 设置邮件消息的主题
mailMessage.setSubject(mailInfo.getSubject());
// 设置邮件消息发送到的时间
mailMessage.setSentDate(new Date());

// 设置邮件消息的主要内容
String mailContent = mailInfo.getContent();
mailMessage.setText(mailContent);
// 发送到邮件
Transport.send(mailMessage);
return true;
} catch (MessagingException ex) {
ex.printStackTrace();
}
return false;
}

/**
* 以html格式发送到邮件
*
* @param mailInfo 待发送到的邮件信息
*/
public static boolean sendHtmlMail(MailInfo mailInfo) {
// 辨别否必须身份认证
MyAuthenticator authenticator = null;
Properties pro = mailInfo.getProperties();
// 如果必须身份认证,则创立一个密码检验器
if (mailInfo.isValidate()) {
authenticator = new MyAuthenticator(mailInfo.getUserName(), mailInfo.getPassword());
}
// 根据邮件不会话属性和密码检验器结构一个发送到邮件的session
Session sendMailSession = Session.getDefaultInstance(pro, authenticator);
try {
// 根据session创立一个邮件消息
Message mailMessage = new MimeMessage(sendMailSession);
// 创立邮件发送者地址
Address from = new InternetAddress(mailInfo.getFromAddress());
// 设置邮件消息的发送者
mailMessage.setFrom(from);
// 创立邮件的接收者地址,并设置到邮件消息中
Address to = new InternetAddress(mailInfo.getToAddress());
// Message.RecipientType.TO属性回应接收者的类型为TO
mailMessage.setRecipient(Message.RecipientType.TO, to);
// 设置邮件消息的主题
mailMessage.setSubject(mailInfo.getSubject());
// 设置邮件消息发送到的时间
mailMessage.setSentDate(new Date());
// MiniMultipart类是一个容器类,包括MimeBodyPart类型的对象
Multipart mainPart = new MimeMultipart();
// 创立一个包括HTML内容的MimeBodyPart
BodyPart html = new MimeBodyPart();
// 设置HTML内容
html.setContent(mailInfo.getContent(), "text/html; charset=utf-8");
mainPart.addBodyPart(html);
// 将MiniMultipart对象设置为邮件内容
mailMessage.setContent(mainPart);
// 发送到邮件
Transport.send(mailMessage);
return true;
} catch (MessagingException ex) {
ex.printStackTrace();
}
return false;
}

/**
* 发送到带上附件的邮件
*
* @param info
* @return
*/
public boolean sendFileMail(MailInfo info, File file) {
Message attachmentMail = createAttachmentMail(info, file);
try {
Transport.send(attachmentMail);
return true;
} catch (MessagingException e) {
e.printStackTrace();
return false;
}

}

/**
* 创立具有附件的邮件
*
* @return
*/
private Message createAttachmentMail(final MailInfo info, File file) {
//创立邮件
MimeMessage message = null;
Properties pro = info.getProperties();
try {

Session sendMailSession = Session.getInstance(pro, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(info.getUserName(), info.getPassword());
}
});

message = new MimeMessage(sendMailSession);
// 设置邮件的基本信息
//创立邮件发送者地址
Address from = new InternetAddress(info.getFromAddress());
//设置邮件消息的发送者
message.setFrom(from);
//创立邮件的接受者地址,并设置到邮件消息中
Address to = new InternetAddress(info.getToAddress());
//设置邮件消息的接受者, Message.RecipientType.TO属性回应接收者的类型为TO
message.setRecipient(Message.RecipientType.TO, to);
//邮件标题
message.setSubject(info.getSubject());

// 创立邮件正文,为了防止邮件正文中文乱码问题,必须用于CharSet=UTF-8说明字符编码
MimeBodyPart text = new MimeBodyPart();
text.setContent(info.getContent(), "text/html;charset=UTF-8");

// 创立容器叙述数据关系
MimeMultipart mp = new MimeMultipart();
mp.addBodyPart(text);
// 创立邮件附件
MimeBodyPart attach = new MimeBodyPart();

FileDataSource ds = new FileDataSource(file);
DataHandler dh = new DataHandler(ds);
attach.setDataHandler(dh);
attach.setFileName(MimeUtility.encodeText(dh.getName()));
mp.addBodyPart(attach);
mp.setSubType("mixed");
message.setContent(mp);
message.saveChanges();

} catch (Exception e) {
L.i("创立带上附件的邮件告终");
e.printStackTrace();
}
// 回到分解的邮件
return message;
}
该类主要构建邮件发送器发送到邮件的类型的类型(如以文本格式发送到邮件或者以HTML格式发送到邮件),还构建否发送到发送到带上附件的邮件功能。

最后新建一个MyAuthenticator.java邮件发送到证书的类
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;

public class MyAuthenticator extends Authenticator {
String userName = null;
String password = null;

public MyAuthenticator() {
}

public MyAuthenticator(String username, String password) {
this.userName = username;
this.password = password;
}

protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(userName, password);
}
}
该类主要构建发送到方邮箱地址以及许可码,并构建模块的曝露以便外部的调用。

配备和查阅发送到方邮箱的服务器、端口号以及许可码
不过大家是不是找到在构建这些类的时候必须配备一些发送到方的邮箱涉及的信息,比如发送到方邮箱服务器、发送到方的邮箱端口号、发送到方的邮箱许可字节等,这些信息开发者是怎样查阅的呢?下面以QQ邮箱为事例。

 

以上是关于Android开发-在Android应用里实现自动发送邮件的功能的主要内容,如果未能解决你的问题,请参考以下文章

android里怎么实现一应用多进程?

在android的开发环境eclipse里,当我在XML里输入text时,为啥没有自动弹出android:text呀?

Android——实现欢迎界面的自动跳转(转)

android开发之应用Crash自动抓取Log_自动保存崩溃日志到本地

Android自动化测试框架必用工具

Android自动化测试之Monkey