最近在做的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. 继承自 DevExpress 17.2 的自定义控件如何在工具箱显示

    最近把DevExpress版本从13.1升级到了17.2,结果发现继承自DevExpress的自定义控件居然在工具箱中消失了,弄了两天还是没有任何头绪,部分自定义Dev控件可以正常出现,但大部分自定义 ...

  2. ubuntu 命令行下格式化U盘,磁盘分区

    命令行格式化磁盘一般是:先卸载,后格式化. 先说格式化U盘的方法,格式化磁盘某个分区是同样的道理. 一般情况下U盘会挂载在/meida/<username>/<disk>目录下 ...

  3. 多表insert操作详解

    --1.无条件的多表insert all ; ; ; --没有条件,向多个目标表全量插入,必须有all insert all --不指定emp_1后面的列,也不指定values,那么emp_1中的所有 ...

  4. ABP文档笔记 - 数据过滤

    预定义的过滤 ISoftDelete 软删除过滤用来在查询数据库时,自动过滤(从结果中抽取)已删除的实体.如果一个实体可以被软删除,它必须实现ISoftDelete接口,该接口只定义了一个IsDele ...

  5. POJ 2135 最小费用最大流

    题目链接 Farm Tour Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 18961   Accepted: 7326 D ...

  6. PTA中如何出Java题目?

    PTA中如何出Java题目? 很多第一次出题的老师,不知道Java在PTA中是如何处理输入的.写一篇文章供大家参考.比如以下这样的一个题目: 从控制台读入两个数,然后将其相加输出. 对于该题可以有如下 ...

  7. Bootstrap3 表格-带边框的表格

    添加 .table-bordered 类为表格和其中的每个单元格增加边框. <table class="table table-bordered"> ... </ ...

  8. 【完整的App项目】颖火虫笔记v2

    好久没写博客了,一方面是因为最近确实很忙,另一方面自己在改进颖火虫笔记这款App,在前面说过该App主要是模仿的印象笔记,(还不知道的,请看:http://blog.csdn.net/htq__/ar ...

  9. Ajax+Struts2实现验证码验证功能

    ---------------------------------------------------------------------------------------------------- ...

  10. J2EE进阶(十八)基于留言板分析SSH工作流程

    J2EE进阶(十八)基于留言板分析SSH工作流程   留言板采用SSH(Struts1.2 + Spring3.0 + Hibernate3.0)架构.   工作流程(以用户登录为例):   首先是用 ...