最近在考虑为已经有的一个应用程序增加一个用户反馈的功能,用户可以通过反馈功能将用户的意见和建议、程序出现的问题以一种更符合用户习惯的方式反馈回来。网上也有一些实现好的反馈程序的服务,包括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发送邮件的更多相关文章

  1. 通过Spring Mail Api发送邮件

    使用Java Mail API来发送邮件也很容易实现,但是最近公司一个同事封装的邮件API实在让我无法接受,于是便打算改用Spring Mail API来发送邮件,顺便记录下这篇文章. [Spring ...

  2. java mail api 使用

    所需要的jar包: http://pan.baidu.com/s/1qWGZRJm 如果遇到这个错误:在windows防火墙允许 javaw.exe访问网络.或者关闭防火墙 FATAL ERROR i ...

  3. java Mail如何发送邮件

    1.应用场景:在系统需要发送与用户相关的消息时,而用户不在线,可以采取发送邮件的方式,使用户了解最新的系统情况 或者发送验证码等验证场景 2.实验环境 主要使用mail.jar和activation. ...

  4. java mail使用中遇到的550类型错误

    前言 首先,需要说明的是,本错误来自于一个简单的基于java mail的api程序,邮件服务器是163的SMTP,即smtp.163.com. 程序 需要说明一下,下面这个程序,是来自于网络上,本人为 ...

  5. java mail 使用 gmail smtp 发送邮件

    smtp 服务器:smtp.gmail.com 使用ssl的端口:465 用户名:username@gmail.com 密码:password** 基本配置没有问题,关键在于Google对安全性要求非 ...

  6. Java Mail(三):Session、Message详解

    http://blog.csdn.net/ghsau/article/details/17909093 ************************************* 本文来自:高爽|Co ...

  7. Android Java Mail与Apache Mail发送邮件对比

    原文链接: 一.邮件简介  一封邮件由很多信息构成,主要的信息如下,其他的暂时不考虑,例如抄送等:  1.收件人:收件人的邮箱地址,例如xxx@xx.com  2.收件人姓名:大部分的邮件显示时都会显 ...

  8. 使用Java Mail发送邮件

    本笔记参考自:高爽|Coder,原文地址:http://blog.csdn.net/ghsau/article/details/17839983 JavaMail是SUN提供给开发人员在应用程序中实现 ...

  9. 利用java mail发送邮件(转)

    JavaMail是SUN提供给开发者在应用程序中实现邮件发送和接收功能而提供的一套标准开发类库,支持经常使用的邮件协议,如SMTP.POP3.IMAP.开发者使用JavaMail编写邮件程序时,无需考 ...

随机推荐

  1. System.Web.HttpException: 无法序列化会话状态。在“StateServer”或“SQLServer”模式下,ASP.NET 将序列化会话状态对象,因此不允许使用无法序列化的对象或 MarshalByRef 对象。如果自定义会话状态存储在“Custom”模式下执行了类似的序列化,则适用同样的限制。 ---> System.Runtime.Serialization.Seria

    序列化问题:查询度娘各种答案不一  多为修改web.config找到SessionState节,将Mode 设置为 InProc   ,还有舍弃Session用cookie存储,多经试验觉得还是写一个 ...

  2. phonegap创建的ios项目推送消息出现闪退现象

    使用phonegap创建的ios项目,推送消息时,当程序在前台运行或者在后台运行状态下,推送消息过来,可以解析并且跳转: 但是在程序从后台退出的状态下,当消息推送过来的时候,点击通知栏,打开程序,程序 ...

  3. class&meta class

    http://chun.tips 当我们发送一个消息给一个NSObject对象时,这条消息会在对象的类的方法列表里查找当我们发送一个消息给一个类时,这条消息会在类的Meta Class的方法列表里查找 ...

  4. Fragment与Activity之间的通信

      我个人将Fragment与Activity间的通信比喻为JSP与Servlet间的通信,fragment中用接口的方式来进行与Activity的通信.通信的结果可以作为数据传入另一个Fragmen ...

  5. nginx 的信号控制概述

    <nginx 在ubuntu 上的启动,停止,重启>中的停止和重启命令基本都是用信号来控制的.这是一些简单的信号控制. 在Nginx服务器中,通常情况都是通过对其发送控制信号进行控制的,除 ...

  6. 判断字符串的首字母 ---------startsWith

    列: {                                            xtype : 'gridcolumn',                                ...

  7. git浅谈

    我们为什么要使用git 应用场景分析 1.使用svn,已经开发完一个需求,正在开发第二个需求,但是测试需要你立刻将你完成的第一个需求提交,请问现在你该怎么做: svn的解决方法大概是这样的:打开提交视 ...

  8. python里面出现中文的时候报错 'ascii' codec can't encode characters in position

    编码问题,在头部添加 import sys reload(sys) sys.setdefaultencoding( "utf-8" ) http://www.xuebuyuan.c ...

  9. .NET项目开发—浅谈面向接口编程、可测试性、单元测试、迭代重构(项目小结)

    阅读目录: 1.开篇介绍 2.迭代测试.重构(强制性面向接口编程,要求代码具有可测试性) 2.1.面向接口编程的两个设计误区 2.1.1.接口的依赖倒置 2.1.2.接口对实体的抽象 2.2.迭代单元 ...

  10. Servlet/JSP-05 Cookie

    一. 问题? HTTP协议是一种无状态协议,服务器本身无法识别出哪些请求是同一个浏览器发出的,浏览器的每一次请求都是独立的.现实业务中服务器有时候需要识别来自同一个浏览器的一系列请求,例如购物车,登录 ...