最近在做的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 发邮件的更多相关文章

  1. Android进阶(十八)AndroidAPP开发问题汇总(二)

    Android进阶(十八)AndroidAPP开发问题汇总(二) 端口被占用解决措施: Android使用SimpleAdapter更新ListView里面的Drawable元素: http://ww ...

  2. Android进阶(十九)AndroidAPP开发问题汇总(三)

    Android进阶(十九)AndroidAPP开发问题汇总(三) Java解析XML的几种方式: http://inotgaoshou.iteye.com/blog/1012188 从线程返回数据的两 ...

  3. Android调用系统的发邮件功能

    package com.example.myapi.email; import java.util.ArrayList; import java.util.List; import android.c ...

  4. Android进阶(十二)Fragment VS Activity

    Fragment  VS  Activity Android是在Android 3.0 (API level 11)开始引入Fragment的. 可以把Fragment想成Activity中的模块,这 ...

  5. 【Android进阶】Android调用WebService的实现

    最近想自己搞搞服务器,就从最简单的webservice开始吧 先上效果图 项目结构 开始贴代码,注释都有,有问题的请留言 MainActivity.java package com.example.w ...

  6. 【Android进阶】Android程序与JavaScript之间的简单调用

    本篇将讲解一个简单的Android与JavaScript之间的简单调用的小程序 效果图 工程结构 HTMLActivity.java代码 package com.example.javatojs; i ...

  7. Android进阶(十一)Android系统架构讲解

    如果说一个成功男人的背后会有一个默默支持的女人的话,那么一个优越稳定的平台背后必有一个成熟的系统架构所支撑着.那么,Android的系统架构是怎么样的呢?从下图我们可以从整体上有个大致的了解(图片来源 ...

  8. Android学习十---Android Camera

    Android camera用来拍照和拍摄视频的先看一下最后实现的效果图             最后的效果图 一.准备 在你的应用程序上使用android拍照设备,需要考虑以下几个方面 1. 是否是 ...

  9. Android进阶(十四)Android Adapter详解

    Android Adapter详解 Android是完全遵循MVC模式设计的框架,Activity是Controller,layout是View.因为layout五花八门,很多数据都不能直接绑定上去, ...

随机推荐

  1. WPF TextBlock 判断 isTextTrimmed 文本是否超出

    WPF TextBlock 设置TextTrimming情况下 判断 isTextTrimmed(Text 文本是否超出 是否出现了省略号) private bool HasTextTrimmed(T ...

  2. ACM 数塔

    在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少?  已经告诉你了,这是个DP的题 ...

  3. Node.js C/C++ 插件

    插件 Addons 是动态链接的共享对象.他提供了 C/C++ 类库能力.这些API比较复杂,他包以下几个类库: V8 JavaScript, C++ 类库.用来和 JavaScript 交互,比如创 ...

  4. 基于Python预测股价

    ▌实现预测的Stocker工具 Stocker是一款用于探索股票情况的Python工具.一旦我们安装了所需的库(查看文档),我们可以在脚本的同一文件夹中启动一个Jupyter Notebook,并导入 ...

  5. Bootstrap3 表格-条纹状表格

    通过 .table-striped 类可以给 之内的每一行增加斑马条纹样式. 跨浏览器兼容性 条纹状表格是依赖 :nth-child CSS 选择器实现的,而这一功能不被 Internet Explo ...

  6. 【Java集合系列】---总体框架

    个的组合,这些数据项可能共享某些特征,需要以某种操作方式一起进行操作,一般来说,这些数据项的类型都是相同的,或者基类相同(若使用的语言支持继承),列表或数组通常不认为是集合,因为其大小固定,但是事实上 ...

  7. Swift基础之CoreData的使用

    以前使用过OC版本的CoreData应该很好理解Swift方式,所以这里简单的展示一下,增删改查的方法使用,同时给大家说一下创建步骤,方便大家的使用,转载请注明出处,谢谢~ 步骤一:创建一个Swift ...

  8. Mybatis源码分析--关联表查询及延迟加载(一)

    Mybatis提供了关联查询映射的功能. 一.一对一关联

  9. Native Hibernate与Hibernate JPA

    本文作者:苏生米沿 本文地址:http://blog.csdn.net/sushengmiyan/article/details/50182005 翻译来源:http://stackoverflow. ...

  10. GCT学习总结

    GCT的一个综合的考试性质,时间紧,题量大,这个时候需要我们快速.准确的答题,把自己的能力展现在其中,十一期间和同学们一起学习.讨论,大家都提高很大,各科谈一下自己的心得 数学: 数学相对来说还是不难 ...