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

    Android悬浮窗实现 使用WindowManager WindowManager介绍 通过Context.getSystemService(Context.WINDOW_SERVICE)可以获得  ...

  2. sqlite原子提交原理

    英文地址 文章参考 简介 支持事务的数据库系统如sqlite的一个重要特性是原子提交(atomic commit).也就是在一个事务中进行的对数据库的写操作要么全部执行,要么全部不执行.看起来像是对数 ...

  3. Gradle常用命令

    使用cmd进入Android studio项目的根目录就可以执行一些gradle相关命令 gradle -v 查看版本 (如果你是第一次执行会去下载Gradle,这个过程如果不FQ非常慢) gradl ...

  4. Android 手机卫士--打包生成apk维护到服务器

    项目打包生成apk过程: 1.生成签名文件,并且指定所在位置 2.使用生成的签名文件,给工程打包生成一个apk 本文地址:http://www.cnblogs.com/wuyudong/p/59033 ...

  5. 【原】iOS:一种直接修改frame的某个属性的方法

    在iOS中view的frame属性使用地太频繁了,尤其是调UI的时候.我们知道,正常情况下我们无法对frame的某个属性(x,y,width,height等)进行单独修改,比如: someView.f ...

  6. iOS中的小知识点

    1.tableView隐藏滚动条 self.tableView.showsVerticalScrollIndicator = NO; 2.关于属性     使用assign: 对基础数据类型 (NSI ...

  7. js location对象

    location提供了与当前窗口中加载文档有关的信息.还提供了一些导航功能.它既是window对象的属性,又是document对象的属性,window.location与document.locati ...

  8. png-8 和 png-24的区别

    png是一种图片格式,是Portable Networks Graphics的缩写,做ping. png8和png24的区别如下. 1 "PNG8"是指8位索引色位图," ...

  9. yii2 GridView 下拉搜索实现案例教程

    作者:白狼 出处:http://www.manks.top/article/yii2_gridview_dropdown_search本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章 ...

  10. Java Gradle入门指南之gretty插件(安装、命令与核心特性)

        Java Web应用开发时常使用Gradle来进行项目管理,可以十分便利地解决包依赖等问题.war插件的出现,让项目部署成为一个复制粘贴的过程,那有没有办法让Java web应用的部署,就像w ...