最近在考虑为已经有的一个应用程序增长一个用户反馈的功能,用户能够经过反馈功能将用户的意见和建议、程序出现的问题以一种更符合用户习惯的方式反馈回来。网上也有一些实现好的反馈程序的服务,包括bug的提交、程序的建议、程序使用中的问题,可是这样的服务基本上不是彻底开源和免费的,而且我对程序反馈的定位仍是用户能够把他的想法经过写文字的方法发送回来就能够(不须要记录崩溃时的系统情况),因此仍是决定在彻底了解实现机制的基础上来实现反馈功能。html
采用发送邮件的方式不须要本身构建服务器,同时也符合我对反馈的管理习惯,所以决定采用在经过在应用程序内发送邮件的方式来实现反馈功能。java
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
为了实如今Android的应用程序内部发送邮件,其中有两点可能的修改须要注意:api
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.htmlsession
2.须要将UI线程(主线程)中的发送邮件操做转移到单独的线程进行处理oracle
Google在honeycomb的发布版以后就对主线程中的操做进行了更加严格的要求。为了保证用户体验,在主线程中不能网络数据传输操做,由于在主线程中进行网络数据传输可能会带来主界面的长时间不响应用户的点击操做,从而带来很差的用户体验(参考)。对于轻量级的网络操做,Android系统中,一般经过AsyncTask类来实现。app
按说Android在高版本的系统中对应用程序在主界面访问网络的操做都会提示android.os.NetworkOnMainThreadException错误,可是在使用Java Mail API进行应用程序内的邮件发送时,我遇到的状况是在2.3版本的模拟器上运行程序,接收方能够收到发送的邮件。一样的代码在在4.2.2版本的手机上却没法成功发送邮件,在Eclipse下的logcat界面中没有任何错误提示。stackoverflow上的回答http://stackoverflow.com/a/2033124/1767800后也有人给出了相似的评论。async
可是,在将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接收的邮件以下图所示