Android使用Java Mail API发送邮件
最近在考虑为已经有的一个应用程序增加一个用户反馈的功能,用户可以通过反馈功能将用户的意见和建议、程序出现的问题以一种更符合用户习惯的方式反馈回来。网上也有一些实现好的反馈程序的服务,包括bug的提交、程序的建议、程序使用中的问题,但是这样的服务基本上不是完全开源和免费的,并且我对程序反馈的定位还是用户可以把他的想法通过写文字的方法发送回来就可以(不需要记录崩溃时的系统状况),所以还是决定在完全了解实现机制的基础上来实现反馈功能。
采用发送邮件的方式不需要自己构建服务器,同时也符合我对反馈的管理习惯,因此决定采用在通过在应用程序内发送邮件的方式来实现反馈功能。
stackoverflow上的回答http://stackoverflow.com/a/2033124/1767800基本给出了在Android中实现在应用程序内部发送邮件的方法,在阅读该代码的时候我一直在找smtp是如何认证的。后来发现该实现方法中GmailSender直接继承了javax.mail.Authenticator类,实现了getPasswordAuthentication方法,并且通过Session.getDefaultInstance(props, this)(getDefaultInstance(Properties props, Authenticator authenticator) )语句在建立session的同时将authenticator属性写入。
为了实现在Android的应用程序内部发送邮件,其中有两点可能的修改需要注意:
1.该回答使用的是Gmail账户作为发送邮件的账户,如果采用其它的账户需要对发送邮件服务器和端口号进行单独的设置。
对于126或者163邮箱而言,只需要将properties设置的部分修改为:
Properties props = new Properties();
props.setProperty("mail.transport.protocol", "smtp");
props.setProperty("mail.host", mailhost);
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.port", "25");
参考:http://www.cnblogs.com/peakzheng/archive/2012/02/04/2338671.html
2.需要将UI线程(主线程)中的发送邮件操作转移到单独的线程进行处理
Google在honeycomb的发布版之后就对主线程中的操作进行了更加严格的要求。为了保证用户体验,在主线程中不能网络数据传输操作,因为在主线程中进行网络数据传输可能会带来主界面的长时间不响应用户的点击操作,从而带来不好的用户体验(参考)。对于轻量级的网络操作,Android系统中,通常通过AsyncTask类来实现。
按说Android在高版本的系统中对应用程序在主界面访问网络的操作都会提示android.os.NetworkOnMainThreadException错误,但是在使用Java Mail API进行应用程序内的邮件发送时,我遇到的情况是在2.3版本的模拟器上运行程序,接收方可以收到发送的邮件。同样的代码在在4.2.2版本的手机上却无法成功发送邮件,在Eclipse下的logcat界面中没有任何错误提示。stackoverflow上的回答http://stackoverflow.com/a/2033124/1767800后也有人给出了类似的评论。
但是,在将sender.sendMail()函数转移到asyncTask类中之后,在4.2.2的手机中也可以成功发送邮件了。具体实现是:
1)新建一个继承自AsyncTask的类
class SendMailTask extends AsyncTask<URL, Integer, Long> {
MailSender sender;
public SendMailTask(MailSender sender) {
// TODO Auto-generated constructor stub
this.sender=sender;
}
protected Long doInBackground(URL... urls) {
long totalSize = 0;
try {
this.sender.sendMail("This is Subject",
"This is Body",
"senderAddress",
"receiverAddress");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return totalSize;
}
protected void onProgressUpdate(Integer... progress) {
}
protected void onPostExecute(Long result) {
}
}
2)通过如下语句发送邮件
new SendMailTask(sender).execute();
通过gmail接收的邮件如下图所示

Android使用Java Mail API发送邮件的更多相关文章
- 通过Spring Mail Api发送邮件
使用Java Mail API来发送邮件也很容易实现,但是最近公司一个同事封装的邮件API实在让我无法接受,于是便打算改用Spring Mail API来发送邮件,顺便记录下这篇文章. [Spring ...
- java mail api 使用
所需要的jar包: http://pan.baidu.com/s/1qWGZRJm 如果遇到这个错误:在windows防火墙允许 javaw.exe访问网络.或者关闭防火墙 FATAL ERROR i ...
- java Mail如何发送邮件
1.应用场景:在系统需要发送与用户相关的消息时,而用户不在线,可以采取发送邮件的方式,使用户了解最新的系统情况 或者发送验证码等验证场景 2.实验环境 主要使用mail.jar和activation. ...
- java mail使用中遇到的550类型错误
前言 首先,需要说明的是,本错误来自于一个简单的基于java mail的api程序,邮件服务器是163的SMTP,即smtp.163.com. 程序 需要说明一下,下面这个程序,是来自于网络上,本人为 ...
- java mail 使用 gmail smtp 发送邮件
smtp 服务器:smtp.gmail.com 使用ssl的端口:465 用户名:username@gmail.com 密码:password** 基本配置没有问题,关键在于Google对安全性要求非 ...
- Java Mail(三):Session、Message详解
http://blog.csdn.net/ghsau/article/details/17909093 ************************************* 本文来自:高爽|Co ...
- Android Java Mail与Apache Mail发送邮件对比
原文链接: 一.邮件简介 一封邮件由很多信息构成,主要的信息如下,其他的暂时不考虑,例如抄送等: 1.收件人:收件人的邮箱地址,例如xxx@xx.com 2.收件人姓名:大部分的邮件显示时都会显 ...
- 使用Java Mail发送邮件
本笔记参考自:高爽|Coder,原文地址:http://blog.csdn.net/ghsau/article/details/17839983 JavaMail是SUN提供给开发人员在应用程序中实现 ...
- 利用java mail发送邮件(转)
JavaMail是SUN提供给开发者在应用程序中实现邮件发送和接收功能而提供的一套标准开发类库,支持经常使用的邮件协议,如SMTP.POP3.IMAP.开发者使用JavaMail编写邮件程序时,无需考 ...
随机推荐
- Atitit.git的存储结构and 追踪
Atitit.git的存储结构and 追踪 1. Add index.js 2 index1 1.1. new1 1.2. Modify1 2. Commit1 1. Add index.js 2 i ...
- 制作具有SSH、MySQL功能的Chroot
由于工作需求,需要在Linux上建立SSH.MySQL两个用户. 使这两个账户连接到跳板机后仅能执行有限的命令(SSH用户只能执行SSH命令,MySQL用户只能执行MySQL命令). MySQL账户C ...
- go语言和资料
C/C++编程相关的复杂性,特别是大一点的工程的维护,如果人员较多,规范等都是较大的负担,最近正在关注go这么语言, 准备对于并发和系统级的开发引入. Go官网 http://golang.org h ...
- 高性能JS笔记4——算法和流程控制
一.循环 for.while.do while三种循环的性能都没有多大区别.foreach 的性能较其他三种差 . 既然循环没有多大区别,注意循环内的代码控制. 减少迭代次数. 减少迭代工作量. 推荐 ...
- JDBC连接MySQL 方法 实例及资料收集
JDBC连接MySQL 方法 实例及资料收集 准备工作 首先,安装MySQL,配置用户名和密码,创建数据库. 可参见之前的文章: http://www.cnblogs.com/mengdd/p/315 ...
- Ubuntu下安装Naginx, PHP5(及PHP-FPM),MySQL
一:安装前做个简单的说明 二:安装MySQL 三:安装Nginx 四:安装PHP5 五:配置 nginx,以下是我本机的配置文件. 六:让MySQL支持PHP5 七:配置PHP-FPM 八:在/etc ...
- 1. 从系统架构到Hello World
Android起源与发展: Android操作系统最初在2003年的时候由Andy Rubin开发,主要支持手机.2005年8月由Google收购注资.2007年11月,Google与84家硬件制造商 ...
- symfony2 twig模板引擎
1.基本语法 Says something:{{ }} Does something:{% %} Comment something:{# #} {% extends "App ...
- CommonJS的模块规范
CommonJS对模块的定义十分简单,主要分为模块引用.模块定义和模块标识. 1.模块引用 var math = require('math');//这个方法接受模块标识,以此引入一个模块的API到当 ...
- 面试题整理:C#(一)
该系列持续更新,从网上以及身边收集的问题 1.可访问性级别有哪几种 public 访问不受限制.protected 访问仅限于包含类或从包含类派生的类型.internal 访问仅限于当前程序集.pro ...