Android进阶(十)Android 发邮件
最近在做的APP涉及到发邮件,总结如下:
在android里进行邮件客户端开发可以有两种方式:
在邮件客户端的设计中,可以采用两种方法。
一种是调用android系统自带的邮件服务
优点:这种方法比较简单易用
缺点:发送邮件的账号必须是gmail账号
令一种方法是采用javamail功能包
优点:可以设置邮件服务器地址,不必局限于gmail邮箱
缺点:用法比较复杂
下面依次介绍这两种方式:
先看应用android自带邮件系统的关键代码
//建立Intent对象
Intent intent = new Intent();
//设置对象动作
intent.setAction(Intent.ACTION_SEND);
//设置对方邮件地址
intent.putExtra(Intent.EXTRA_EMAIL, new String[]
{ "abc@com.cn","edf@com.cn" });
//设置标题内容
intent.putExtra(Intent.EXTRA_SUBJECT, "test");
//设置邮件文本内容
intent.putExtra(Intent.EXTRA_TEXT, "test mail");
//启动一个新的ACTIVITY,"Sending mail..."是在启动这个ACTIVITY的等待时间时所显示的文字
startActivity(Intent.createChooser(intent, "Sending
mail..."));
只有上面的代码有可能还会出现异常,你运行的时候会提示一个错误:no application can perform this action会有这个错误提示,是由于你没有在模拟器上配置gmail邮箱,输入自己的gmail账号和密码,默认使用的是你的gmail账号发信。
使用javamail实现的代码
在android里使用javamail需要依赖3个包,activation.jar,additionnal.jar,mail.jar,在编程中发现,其实additionnal.jar存在与否不影响结果。
同时还要注意一个最重要的地方那就是开启你访问互联网的权限不然你一点用没有。。。。
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
对于JavaMail,最基础的功能就是邮件的发送和接收,在这里,我先讲一讲邮件的发送。
在写具体的程序前,先讲一些概念。1.邮件的发送:如果你的邮件地址是a@host.com,而你要用这个邮箱发送一封邮件到to@tohost.com,这个发送过程是怎样的呢,你以为是先连接到tohost.com这服务器上,然后把邮件发送出去吗?其实不然。最初,你需要连接到服务器host.com上,当然这个连接可能需要认证,然后是发送邮件到服务器host.com上,关闭连接。在host.com上,你所发送的邮件进入发送队列中,轮到你要发送的邮件时,host.com主机再联系tohost.com,将邮件传输到服务器tohost.com上。2.一些垃圾邮件的发送:在垃圾邮件中,可能大部分的发件人的地址都是假的,这是怎么回事呢?实际上在发送这些垃圾邮件的时候,这里的host.com有些特别,可能host.com不需要对用户进行认证,也可能发送垃圾邮件的人本来就控制着服务器host.com,然后控制着host.com向其他服务器,如tohost.com,发送邮件,而发送邮件的内容可以被控制,发件人的地址就可以随便填写。
个部分:创建连接,创建邮件体,发送邮件
JavaMail中,是使用会话(Session)来管理连接的。创建一个连接,就需要创建一个会话。在会话中,有两个重要的因素,一是会话的属性,二是会话的认证。在我们使用Hotmail等邮件工具的时候,就要设置”SMTP服务器身份验证”,也就是这里的会话的认证。
//首先,创建一个连接属性
Properties props = new Properties();
//设置smtp的服务器地址是smtp.126.com
props.put("mail.smtp.host","smtp.126.com");
//设置smtp服务器要身份验证
props.put("mail.smtp.auth","true");
PopupAuthenticator auth = new PopupAuthenticator();
// 创建会话(JavaMail中,是使用会话(Session)来管理连接的)
Session session = Session.getInstance(prop, auth);
// 创建邮件体
Message message = createmessage(session, user);
// 发送邮件-创建连接
Transport ts = null;
// 校验客服邮箱
try {
session.setDebug(true);
ts = session.getTransport("smtp");
// 此处的邮件发送方邮箱密码可知无可厚非
ts.connect(ConstantValue.MAILHOST, ConstantValue.MAILADDRESS,
ConstantValue.MAILPWD);
flag = true;
} catch (AuthenticationFailedException ae) {
ae.printStackTrace();
flag = false;
System.out.println("客服邮箱名或密码错误,请重新输入");
return SUCCESS;
} catch (MessagingException mex) {
mex.printStackTrace();
Exception ex = null;
if ((ex = mex.getNextException()) != null) {
ex.printStackTrace();
}
flag = false;
System.out.println("客服邮箱名或密码错误,请重新输入");
return SUCCESS;
}
ts.send(message);
ts.close();
}
其中涉及到创建一个身份验证。身份验证稍微复杂一点,要创建一个Authenticator的子类,并重载getPasswordAuthentication()方法,代码如下:
public class PopupAuthenticator extends Authenticator {
public PasswordAuthentication getPasswordAuthentication() {
String username = ConstantValue.MAILADDRESS;
String pwd = ConstantValue.MAILPWD;
return new PasswordAuthentication(username, pwd);
}
}
其中的类ConstantValue 如下:
public class ConstantValue {
//邮件服务器
public static String MAILSENDER = "*秋亚";
//邮件服务器
public static String MAILHOST = "smtp.163.com";
//发送邮件地址
public static String MAILADDRESS = "sunhuaqiang2014";
//发送邮件密码
public static String MAILPWD = "35****";
}
其中涉及到的createmessage()方法如下:
public Message createmessage(Session session, User user)
throws AddressException, MessagingException, UnsupportedEncodingException {
MimeMessage message = new MimeMessage(session);
//发送人地址
message.setFrom(new InternetAddress(ConstantValue.MAILADDRESS + "@163.com", ConstantValue.MAILSENDER));
//收件人地址
message.setRecipient(Message.RecipientType.TO,
new InternetAddress(user.getEmail()));
//设置邮件主题
message.setSubject("彩票网密码找回");
//设置邮件内容
String content = "恭喜您密码成功找回 您注册的用户名:" + user.getUsername() + ",您注册的密码是:"
+ user.getPassword() + ",请妥善保管!!";
message.setContent(content, "text/html;charset=UTF-8");
message.saveChanges();
return message;
}
以下几篇文章有更加完整的实现,非常好,可以参考。
http://www.javaeye.com/topic/352753
http://www.cnblogs.com/love2009/archive/2009/02/24/1397201.html
http://www.blogjava.net/TrampEagle/archive/2006/05/26/48326.html
Android进阶(十)Android 发邮件的更多相关文章
- Android进阶(十八)AndroidAPP开发问题汇总(二)
Android进阶(十八)AndroidAPP开发问题汇总(二) 端口被占用解决措施: Android使用SimpleAdapter更新ListView里面的Drawable元素: http://ww ...
- Android进阶(十九)AndroidAPP开发问题汇总(三)
Android进阶(十九)AndroidAPP开发问题汇总(三) Java解析XML的几种方式: http://inotgaoshou.iteye.com/blog/1012188 从线程返回数据的两 ...
- Android调用系统的发邮件功能
package com.example.myapi.email; import java.util.ArrayList; import java.util.List; import android.c ...
- Android进阶(十二)Fragment VS Activity
Fragment VS Activity Android是在Android 3.0 (API level 11)开始引入Fragment的. 可以把Fragment想成Activity中的模块,这 ...
- 【Android进阶】Android调用WebService的实现
最近想自己搞搞服务器,就从最简单的webservice开始吧 先上效果图 项目结构 开始贴代码,注释都有,有问题的请留言 MainActivity.java package com.example.w ...
- 【Android进阶】Android程序与JavaScript之间的简单调用
本篇将讲解一个简单的Android与JavaScript之间的简单调用的小程序 效果图 工程结构 HTMLActivity.java代码 package com.example.javatojs; i ...
- Android进阶(十一)Android系统架构讲解
如果说一个成功男人的背后会有一个默默支持的女人的话,那么一个优越稳定的平台背后必有一个成熟的系统架构所支撑着.那么,Android的系统架构是怎么样的呢?从下图我们可以从整体上有个大致的了解(图片来源 ...
- Android学习十---Android Camera
Android camera用来拍照和拍摄视频的先看一下最后实现的效果图 最后的效果图 一.准备 在你的应用程序上使用android拍照设备,需要考虑以下几个方面 1. 是否是 ...
- Android进阶(十四)Android Adapter详解
Android Adapter详解 Android是完全遵循MVC模式设计的框架,Activity是Controller,layout是View.因为layout五花八门,很多数据都不能直接绑定上去, ...
随机推荐
- kexec 内核快速启动流程分析
一.命令行 1. kexec -l $kpwd --append="$arg" 其中$kpwd =目标内核的路径 $arg =传给内核的参数,与/proc/cmdline一致时表示 ...
- Stall Reservations
Oh those picky N (1 <= N <= 50,000) cows! They are so picky that each one will only be milked ...
- 介绍Docker容器
容器是 Docker 又一核心概念. 简单的说,容器是独立运行的一个或一组应用,以及它们的运行态环境.对应的,虚拟机可以理解为模拟运行的一整套操作系统(提供了运行态环境和其他系统环境)和跑在上面的应用 ...
- [Matlab+C/C++] 读写二进制文件
introduction 因为Matlab操作简单.方便,它被应用于很多领域:音频处理,图像处理,数值计算等.尽管MATLAB容易操作,但受限于他的语言解释机制,MATLAB的执行速度通常较低.C/C ...
- Switch控件详解
Switch控件详解 原生效果 5.x 4.x 布局 <Switch android:id="@+id/setting_switch" android:layout_widt ...
- Docker学习笔记2: Docker 概述
一.什么是Docker Docker是基于Go语言实现的云开源项目. Docker 的主要目标是:"Bulid,Ship and Run Any App ,AnyWhere" , ...
- J2EE进阶(十九)FileNotFoundException: http://hibernate.org/dtd/hibernate-mapping-3.0.dtd
J2EE进阶(十九)Nested exception: java.io.FileNotFoundException: http://hibernate.org/dtd/hibernate-mappin ...
- [django] 利用多线程增加异步任务
看到django异步大家的反应应该是celery这种消息队列组件,现在用的最多的最推荐的也是这种方式.然而我这需求就是请求来了,执行一个小程序,但是又不能确定这个小程序啥时候执行完,响应又要及时,丢给 ...
- [python]mysql数据缓存到redis中 取出时候编码问题
描述: 一个web服务,原先的业务逻辑是把mysql查询的结果缓存在redis中一个小时,加快请求的响应. 现在有个问题就是根据请求的指定的编码返回对应编码的response. 首先是要修改响应的bo ...
- Java并发框架——什么是AQS框架
什么是AQS框架 1995年sun公司发布了第一个java语言版本,可以说从jdk1.1到jdk1.4期间java的使用主要是在移动应用和中小型企业应用中,在此类领域中基本不用设计大型并发场景,当然也 ...