如何使用安卓+qq邮箱+腾讯企业邮箱发送邮件

如何使用安卓+qq邮箱发送邮件

前言
前段时间由于项目的需要,就是在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工具类

package com.example.Email;import androidx.annotation.NonNull;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() {@Overridepublic 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() {@Overridepublic void run() {sms.sendTextMail(mailInfo);}}).start();}@NonNullprivate static MailInfo creatMail(String toAdd) {final MailInfo mailInfo = new MailInfo();mailInfo.setMailServerHost("smtp.qq.com");//发送方邮箱服务器mailInfo.setMailServerPort("587");//发送方邮箱端口号mailInfo.setValidate(true);mailInfo.setUserName("发送者邮箱地址"); // 发送者邮箱地址mailInfo.setPassword("发送者邮箱授权码");// 发送者邮箱授权码mailInfo.setFromAddress("发送者邮箱"); // 发送者邮箱mailInfo.setToAddress(toAdd); // 接收者邮箱mailInfo.setSubject("Android应用测试"); // 邮件主题mailInfo.setContent("哈哈"); // 邮件文本return mailInfo;}}

该类是获取发送邮件信息的类,只要获取发送方邮箱服务器、发送方邮箱端口号、发送者邮箱地址、发送者邮箱授权码、发送者邮箱、接收者邮箱、发送邮件的主题以及邮件文本的操作信息。

新建一个MailInfo.java实体类

package com.example.Email;import java.util.Properties;public class MailInfo {private String mailServerHost;// 发送邮件的服务器的IPprivate 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邮件发送器类

package com.example.Email;import android.util.Log;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());}// 根据邮件会话属性和密码验证器构造一个发送邮件的sessionSession 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());}// 根据邮件会话属性和密码验证器构造一个发送邮件的sessionSession 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属性表示接收者的类型为TOmailMessage.setRecipient(Message.RecipientType.TO, to);// 设置邮件消息的主题mailMessage.setSubject(mailInfo.getSubject());// 设置邮件消息发送的时间mailMessage.setSentDate(new Date());// MiniMultipart类是一个容器类,包含MimeBodyPart类型的对象Multipart mainPart = new MimeMultipart();// 创建一个包含HTML内容的MimeBodyPartBodyPart 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() {@Overrideprotected 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属性表示接收者的类型为TOmessage.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) {Log.i("Email", "创建带附件的邮件失败");e.printStackTrace();}// 返回生成的邮件return message;}
}

该类主要实现邮件发送器发送邮件的类型的类型(如以文本格式发送邮件或者以HTML格式发送邮件),还实现是否发送发送带附件的邮件功能。

最后新建一个MyAuthenticator.java邮件发送认证的类

package com.example.Email;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邮箱为例。

首先访问QQ邮箱的网址(https://mail.qq.com/ ),然后登录自己QQ邮箱账号后进入邮箱主页后进行以下操作。

点击“设置”按钮后进入邮箱设置的操作界面后在导航栏点击“帐号”按钮,如下图。

进入“账号”操作界面后往下滑找到“POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务”的设置功能。如下图。

然后把邮箱账号的“POP3/SMTP服务”和“IMAP/SMTP服务”开启了,开启成功后会自动分配一个16位字符串的授权码,如下图。该授权码一般用于代替在第三方客户端邮箱登录该邮箱账户时所用的密码,一般是为了邮箱密码的安全考虑。

配置完成后最后不要忘了点击底部的“保存更改”的按钮,否则配置信息无效。如下图。

这样就做完了。

重点是端口一定要设置为587,不能设置为465

要不然会出现错误:Could not connect to SMTP host: smtp.qq.com, port: 465, response: -1 clojure

错误描述:
465端口是为SMTPS(SMTP-over-SSL)协议服务开放的,这是SMTP协议基于SSL安全协议之上的一种变种协议,它继承了SSL安全协议的非对称加密的高度安全可靠性,可防止邮件泄露
所有要开启SSL

解决办法:
修改端口号为587

 

安卓+使用腾讯企业邮箱发送邮件

端口加服务器配置如下(端口同样都是587)不用看官方的

打开腾讯企业邮箱首页,找到设置,如下图。

找到邮箱绑定,开启安全登录,生成客户端专用密码。如下图

这个时候将上面的信息填入代码中相应位置即可

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/58302.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第三方软件要使用QQ邮箱进行发邮件相关设置

1、要在QQ邮箱的设置界面进行相关设置。 开启相应的服务器&#xff0c;然后获得相应的授权密码即可。 相关参考&#xff1a; http://service.mail.qq.com/cgi-bin/help?subtype1&&id28&&no1001256 2、对相应的服务器和接口进行设置 相关参考&#xff1a;…

python的搜题软件下载_大学搜题用什么软件最好

我们在学习的时候&#xff0c;最重要的就是能够了解到更多的知识&#xff0c;那如果说遇到了问题该怎么办呢&#xff1f;有的时候问老师自己可能没有那么大胆&#xff0c;但是问同学却不一定能够解决&#xff0c;特别是到了大学之后遇到了难题&#xff0c;到底该怎么办呢&#…

大学生搜题软件哪个好用?2020搜题软件排行榜

搜题软件哪个好?现在是网络时代,学生们的学习也紧跟时代的步伐,当遇到不会做的题目时,只要打开拍照搜题软件,拍一下即可得到题目的解答步骤,帮助学生更好的学习,是不是就很棒呢?下面就给大家分享一些可以搜题查题的软件及公众号呢?下面给大家推荐6款好用的搜题APP!具…

html搜题软件,大学搜题app哪个好_大学好的搜题软件_大学搜题免费

核心提示&#xff1a;大学搜题的软件有很多,哪些大学搜题软件是我们想要的呢,下面多特小编就跟您推荐几款比较合适的软件或者app给您参考 大学搜题的软件有很多,哪些大学搜题软件是我们想要的呢,下面多特小编就跟您推荐几款比较合适的软件或者app给您参考 大学搜题app是一款拍照…

大学生搜题软件哪个好?2020搜题软件排行榜

搜题软件哪个好?现在是网络时代,学生们的学习也紧跟时代的步伐,当遇到不会做的题目时,只要打开拍照搜题软件,拍一下即可得到题目的解答步骤,帮助学生更好的学习,是不是就很棒呢?下面就给大家分享一些可以搜题查题的软件及公众号呢?下面给大家推荐6款好用的搜题APP!具…

天天搜题 大学生在线免费的搜题网站

1.网站使用FlaskVUE3搭建&#xff0c;借助Nginx实现前后端全分离&#xff0c;题库已破千万 2.如果这篇文章的浏览量足够的话&#xff0c;我会使用Python高性能框架Tornado完整的教学大家如何编写。 3.网站已经上线&#xff0c;大家可以进行测试&#xff0c;如果有什么逻辑问题我…

最好用的免费搜题软件,一键聚合搜题!中小学、大学都支持

不经意间看看时间&#xff0c;马上又到了开学的时候了 于是便为大家准备了这样一篇 《大学免费搜题终极攻略》 &#x1f60e; ▍1 中小学搜题App 虽然这篇主要内容是想写如何解决大学搜题&#xff0c;但还是提一嘴中小学的&#x1f92a; 因为市场大&#xff0c;受众广&…

大学生最好用搜题的APP,个人开发的,吊打一切搜题软件

吊打市面大学搜题app&#xff0c;不好用直接举报我&#xff0c;谢谢&#xff5e; 【软件名称】&#xff1a;火星搜题 【软件版本】&#xff1a;1.2 【软件大小】&#xff1a;2.5m 【使用平台】&#xff1a;安卓 【是否root】:免root 【测试机型】&#xff1a;小米11 【软…

【Redis系列】Redis布隆过滤之8亿大数据集实战

序言 即便平凡的日子仿佛毫无波澜&#xff0c;但在某个特定的时刻&#xff0c;执着的努力便会显现出它的价值和意义。 文章标记颜色说明&#xff1a; 黄色&#xff1a;重要标题红色&#xff1a;用来标记结论绿色&#xff1a;用来标记一级重要蓝色&#xff1a;用来标记二级重要 …

技术支持丨如何通过 Labview 视觉软件连接度申工业相机

深圳市度申科技有限公司是专业从事工业相机自主研发、生产、营销与服务的高新技术企业。“专业设计”、“专业制造”、“专做稳定可靠的工业相机”。产品线包括&#xff1a;USB2.0、USB3.0、GIGE、万兆网和工业相机定制服务&#xff0c;从30万至4300万像素不等。产品广泛应用于…

ArcGIS基础:线段的延申和修剪操作处理

本实验操作是对于线要素进行处理&#xff0c;基于面要素边界使用高级编辑工具进行延伸和裁剪的操作处理。 先看下原始数据&#xff0c;如下所示&#xff0c;有&#xff14;条线和一个面。 数据处理之前&#xff0c;先在【菜单栏】的【自定义】下把【高级编辑】的工具条加载了…

Paschen law(帕邢/巴申定律)

Paschen law&#xff1a;百度百科有二种解释帕邢定律和巴申定律&#xff0c;在国内文献中引用也存在二种称呼混用。个人习惯称呼为帕邢定律&#xff0c;可能是第一次的印象较深也可能是这个名字更霸气。 对产品设计基带工程师&#xff0c;帕邢定律最重要的引用是推导出空气式静…

度申相机DVP2 SDK 使用指南

介绍与概述 首先非常感谢您使用深圳市度申科技有限公司的产品。DVP2 SDK是本公司自主研发的第二代工业相机产品软件开发包。本公司目前最新的工业相机产品&#xff08;U3M 系列 、U3S 系列 、GM 系列&#xff09;&#xff0c;都可使用该SDK进行应用软件开发&#xff0c;其具有…

专利网上注册申请流程及使用-个人申请过程

专利申请 也电子化了&#xff0c;so 今天就个人申请的经验&#xff0c;告知大家&#xff0c;避免走不必要的弯路。因为知识产权局官网也有&#xff0c;但是 都是10年的教程了&#xff0c;网站更新的都没说。。。so。。。正题&#xff1a; 1、1、网上注册&#xff1a;登录网址&…

计算机二级没过电网网申会被刷吗,江苏电网网申——为什么研究生学历的同学网申都过不了!...

对国家电网有所了解的同学&#xff0c;应该都知道江苏电网吧&#xff0c;该省份不管是经济水平还是工资待遇水准在全国都是数一数二的。尤其是号称“天下第一局”的苏州局&#xff0c;高额的税后工资、完善的福利待遇&#xff0c;更是吸引了大批重点院校的高材生争相填报~ 江苏…

YOLO系列算法精讲:从yolov1至yolov8的进阶之路(2万字超全整理)

写在前面&#xff1a;大家好&#xff01;我是【AI 菌】&#xff0c;算法工程师一枚&#xff0c;2021年博客之星Top12&#xff0c;公众号【AI 修炼之路】作者。专注于计算机视觉、深度学习、图像处理技术&#xff0c;热衷于分享AI、CV、DL、ML、OpenCV、Python、C等相关技术及文…

【同等学力申硕】在职研究生? 有用吗?

在如今社会竞争如此激烈的环境&#xff0c;想在大城市买一套房又无奈现状工资低&#xff0c;升职加薪有时不单取决于能力&#xff0c;还会取决于我们的学历、学位。心想变为研究生&#xff0c;去改变现状&#xff1b;有一种方式叫同等学力申硕是提供给在职人员去读研的一种方式…

首申百度联盟、Google Adsense,均败

首申百度联盟、Google Adsense&#xff0c;均败 有了网站&#xff0c;必然想尝试一下从百度和 google 接入广告。 1、百度可以通过接入广告赚钱的平台--百度联盟 注册百度联盟&#xff0c;地址&#xff1a;http://union.baidu.com/register.action &#xff0c;需要填写和验证…

大学计算机系最努力的同学都是如何学习的?

经常会被同学们问到这个问题&#xff0c;要怎么努力才能找到好工作&#xff1f; 学习好就能进好公司&#xff1f; 屁&#xff01; 被学校教育坑的一把鼻涕一把泪的老学长来回答一波。 我上大学时&#xff0c;连续三年得过国家励志奖学金&#xff0c;英语过六级&#xff0c;…

剑指Offer——银行网申内容模版

剑指Offer——银行网申内容模版 专业特长(200字以内) 熟悉Java语言&#xff0c;多线程编程&#xff0c;网络编程&#xff1b; 熟悉SQL语句&#xff0c;存储过程和函数&#xff1b; 熟悉Android原生开发&#xff0c;Hybrid APP Ionic框架开发&#xff1b; 熟悉Web前端Angul…