Android邮件发送实现

您所在的位置:网站首页 tim如何发邮箱 Android邮件发送实现

Android邮件发送实现

2023-09-18 01:41| 来源: 网络整理| 查看: 265

这里邮件的实现方式使用的是 JavaMail for Andorid,用到的包主要有android-mail和android-activation,具体详情可以参考:https://javaee.github.io/javamail/#JavaMail_for_Android,这里使用的Android studio进行开发,首先是进行配置:

repositories { jcenter() maven { url "https://maven.java.net/content/groups/public/" } } android { packagingOptions { pickFirst 'META-INF/LICENSE.txt' // picks the JavaMail license file } } dependencies { // use whatever the current version is... compile 'com.sun.mail:android-mail:1.6.0' compile 'com.sun.mail:android-activation:1.6.0' }

 这里是根据官网进行配置的,但配置完这个后,我的编译结果是会报错的,所以对上面的配置进行了一些修改:

第一点修改:

packagingOptions { pickFirst 'META-INF/*' // picks the JavaMail license file }

第二点修改,在dependencies中添加:

configurations { all*.exclude group: 'javax.activation', module: 'activation'}

第三点修改,我在3.1.3编译不过,这里我改为3.0.0可以编过:

dependencies { classpath 'com.android.tools.build:gradle:3.0.0' }

在这样配置后,编译就没问题了,接下类就是怎么去实现邮件的发送了,这里先来一段官网的小样列,感兴趣的可以自己去看看,地址:https://javaee.github.io/javamail/docs/api/:

Properties props = new Properties(); props.put("mail.smtp.host", "my-mail-server"); Session session = Session.getInstance(props, null); try { MimeMessage msg = new MimeMessage(session); msg.setFrom("[email protected]"); msg.setRecipients(Message.RecipientType.TO, "[email protected]"); msg.setSubject("JavaMail hello world example"); msg.setSentDate(new Date()); msg.setText("Hello, world!\n"); Transport.send(msg, "[email protected]", "my-password"); } catch (MessagingException mex) { System.out.println("send failed, exception: " + mex); }

这就是官网的一个小demo,对于刚开始接触的人,里面的这些配置可能会让你不明所以,会有各种坑在等你,下面将对这些参数进行说明:

1、首先就是: props.put("mail.smtp.host", "my-mail-server");一开始我看到这的时候,这什么东西,完全看不懂,其实这里就是要你配置你是从哪个邮箱发出去的,put方法中的键是你不需要变的,这里举两例,如果你是已QQ发出去,那么这里"my-mail-server"就得改为:smtp.163.com,如果是是163邮箱,那么就是:smtp.163.com,最终代码就改为:props.put("mail.smtp.host", "my-mail-server");如果你是其他邮箱,那你就百度:xx邮箱的smtp设置;

2、msg.setFrom("[email protected]");这里就是你是从哪个邮箱发出去的;

3、msg.setRecipients(Message.RecipientType.TO, "[email protected]");这里是设置收件人的邮箱;

4、msg.setSubject("JavaMail hello world example");    设置邮件的主题;                 msg.setSentDate(new Date());                                  设置有邮件的日期;                 msg.setText("Hello, world!\n");                                   设置邮件的内容;

5、Transport.send(msg, "[email protected]", "my-password");这里需要注意这个my-password,这里传的并不是你邮箱的密码,而是你邮箱的授权码,这里以163邮箱为例:

 这里可以先点掉 :POP3/SMTP服务  后在点上,之后跟着提示走就可以自己设置授权码了。qq邮箱也是需要这样设置得到授权码的,这里就不在说了。

最后这里在贴上我自己修改后的代码:

private void sendMailMy(){ Properties props = new Properties(); props.put("mail.smtp.host", "smtp.163.com"); Session session = Session.getInstance(props, null); try { MimeMessage msg = new MimeMessage(session); msg.setFrom("[email protected]"); msg.setRecipients(Message.RecipientType.TO, "[email protected]"); msg.setSubject("标题"); msg.setSentDate(new Date()); msg.setText("你好!\n这里是来自ubt的信息"); Transport.send(msg, "[email protected]", "授权码"); } catch (MessagingException mex) { System.out.println("send failed, exception: " + mex); } }

这里是从我的163邮箱发给了我的qq邮箱,有没有觉得so easy。

但是,这种方式只是发了文本内容,并没有发送附件,而且看起来不舒服,下面就来封装一下,主要分为四个类: 

第一个类是对消息体(Message)的封装,如果你还想设置消息中的其他内容,都可以在这里添加属性,这只是样例:

public class MailSenderInfo { private String mailServerHost; private String mailServerPort = "25"; private String fromAddress; private String toAddress; private String userName; private String password; private boolean validate = false; 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; } }

第二个是对权限的封装,也就是我们发送邮箱的账号和密码(授权码):

public class MailAuthenticator extends Authenticator { String userName=null; String password=null; public MailAuthenticator(){ } public MailAuthenticator(String username, String password) { this.userName = username; this.password = password; } // 这个方法在Authenticator内部会调用 protected PasswordAuthentication getPasswordAuthentication(){ return new PasswordAuthentication(userName, password); } }

 第三个就是封装一个简易的发送器了,通过这个将邮件发送出去,这里封装了三个方法,第一个是发送纯文本;第二个是发送文本和附件;第三个是以HTML格式发送,可根据需求自行添加:

public class SimpleMailSender { /** * 以文本格式发送邮件 * * @param mailInfo 待发送的邮件的信息 */ public boolean sendTextMail(MailSenderInfo mailInfo) { // 判断是否需要身份认证 MailAuthenticator authenticator = null; Properties pro = mailInfo.getProperties(); if (mailInfo.isValidate()) { // 如果需要身份认证,则创建一个密码验证器 authenticator = new MailAuthenticator(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()); 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; } /** * 以文本格式发送邮件并添加附加 * * @param mailInfo 待发送的邮件的信息 */ public boolean sendTextAndFileMail(MailSenderInfo mailInfo,String[] filePath) { // 判断是否需要身份认证 MailAuthenticator authenticator = null; Properties pro = mailInfo.getProperties(); if (mailInfo.isValidate()) { // 如果需要身份认证,则创建一个密码验证器 authenticator = new MailAuthenticator(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()); mailMessage.setRecipient(Message.RecipientType.TO, to); // 设置邮件消息的主题 mailMessage.setSubject(mailInfo.getSubject()); // 设置邮件消息发送的时间 mailMessage.setSentDate(new Date()); // 添加附件体 BodyPart messageBodyPart = new MimeBodyPart(); // 设置邮件消息的主要内容 messageBodyPart.setContent(mailInfo.getContent(), "text/html;charset=utf-8"); MimeMultipart multipart = new MimeMultipart(); multipart.addBodyPart(messageBodyPart); for (int i = 0; i < filePath.length; i++) { MimeBodyPart bodyPart = new MimeBodyPart(); try { //绑定附件路径 bodyPart.attachFile(filePath[i]); } catch (IOException e) { e.printStackTrace(); } multipart.addBodyPart(bodyPart); } mailMessage.setContent(multipart); // 发送邮件 Transport.send(mailMessage); return true; } catch (MessagingException ex) { ex.printStackTrace(); } return false; } /** * 以HTML格式发送邮件 * * @param mailInfo 待发送的邮件信息 */ public static boolean sendHtmlMail(MailSenderInfo mailInfo) { // 判断是否需要身份认证 MailAuthenticator authenticator = null; Properties pro = mailInfo.getProperties(); //如果需要身份认证,则创建一个密码验证器 if (mailInfo.isValidate()) { authenticator = new MailAuthenticator(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; } }

    最后就是将上面三个类需要的信息配置一下就可以发送,这里在抽出一个类:

public class EmailUtil { private static final String TAG = "EmailUtil"; /** * @param title 邮件的标题 * @param msuggestions 邮件的文本内容 * @param toAddress 收件人的地址 如:[email protected] */ public static void autoSendMail(String title,String msuggestions,String toAddress) { MailSenderInfo mailInfo = new MailSenderInfo(); mailInfo.setMailServerHost("smtp.163.com");//smtp地址 mailInfo.setMailServerPort("25"); mailInfo.setValidate(true); mailInfo.setUserName("[email protected]");// 发送方邮件地址 mailInfo.setPassword("发送邮箱授权码");// 邮箱POP3/SMTP服务授权码 mailInfo.setFromAddress("[email protected]");// 发送方邮件地址 mailInfo.setToAddress(toAddress);//接受方邮件地址 mailInfo.setSubject(title);//设置邮箱标题 mailInfo.setContent(msuggestions); // 这个类主要来发送邮件 SimpleMailSender sms = new SimpleMailSender(); sms.sendTextMail(mailInfo);// 发送文体格式 Log.d(TAG, "autoSendMail: msuggestions: "+msuggestions); } /** * @param title 邮件的标题 * @param msuggestions 邮件的文本内容 * @param toAddress 收件人的地址 如:[email protected] * @param filePath 附件的路径 */ public static void autoSendFileMail(String title,String msuggestions,String toAddress,String[] filePath) { MailSenderInfo mailInfo = new MailSenderInfo(); mailInfo.setMailServerHost("smtp.163.com");//smtp地址 mailInfo.setMailServerPort("25"); mailInfo.setValidate(true); mailInfo.setUserName("[email protected]");// 发送方邮件地址 mailInfo.setPassword("发送邮箱授权码");// 邮箱POP3/SMTP服务授权码 mailInfo.setFromAddress("[email protected]");// 发送方邮件地址 mailInfo.setToAddress(toAddress);//接受方邮件地址 mailInfo.setSubject(title);//设置邮箱标题 mailInfo.setContent(msuggestions); // 这个类主要来发送邮件 SimpleMailSender sms = new SimpleMailSender(); sms.sendTextAndFileMail(mailInfo,filePath);// 发送文体格式 Log.d(TAG, "autoSendMail: msuggestions: "+msuggestions); } }

这里我是把发送的邮箱定死了,该配的参数也都在这里配好了,其他需要定制的参数传进来就好了,这样就大体完成了,如果有其他需求的可以自行修改,这里提供的只是一个模板。

参考文章:https://www.jianshu.com/p/305baada101b



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3