最近在做的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. 虚拟机搭建Zookeeper服务器集群完整笔记

    虚拟机搭建Zookeeper服务器集群完整笔记 本笔记主要记录自己搭建Zookeeper服务器的全过程,默认已经安装部署好Centos7. 一.虚拟机下Centos无法联网解决方案 1.首先调整虚拟机 ...

  2. MySQL数据类型DECIMAL用法

    MySQL DECIMAL数据类型用于在数据库中存储精确的数值.我们经常将DECIMAL数据类型用于保留准确精确度的列,例如会计系统中的货币数据. 要定义数据类型为DECIMAL的列,请使用以下语法: ...

  3. compress函数用法详解

    compress函数: 主要用来删除字符串中的特定字符. 1.compress函数的基本形式compress(<source><, chars><, modifiers& ...

  4. js动态加载js css文件,可以配置文件后辍,防止浏览器缓存

    js的引用,在浏览器,或微信上访问经常会遇到文件改了,但就是没有更新的问题,使用此函数可以轻松解决缓存问题只需要把js的引用方式改为使用此函数加载即可 源码如下: /** * js动态加载js css ...

  5. java里String类为何被设计为final

    前些天面试遇到一个非常难的关于String的问题,"String为何被设计为不可变的"?类似的问题也有"String为何被设计为final?"个人认为还是前面一 ...

  6. python笔记十(列表生成式、字典生成式、生成器、生成器的并行)

    一.列表生成式 列表生成式就是python设置的可以用来可以生成列表的. 如要生成一个0-9的列表我们可以通过以下代码实现: >>> list(range(10)) [0, 1, 2 ...

  7. ACM Bone Collector

      Many years ago , in Teddy's hometown there was a man who was called "Bone Collector". Th ...

  8. POSIX 消息队列相关问题

    一.查看和删除消息队列要想看到创建的posix消息队列,需要在root用户下执行以下操作:# mkdir /dev/mqueue# mount -t mqueue none /dev/mqueue删除 ...

  9. Android系统对话框

    Android系统对话框 效果图 2个按钮的对话框 3个按钮的对话框 自定义View的对话框 单选对话框 多选对话框 列表框 Code XML <?xml version="1.0&q ...

  10. Sqoop-1.4.6 Merge源码分析与改造使其支持多个merge-key

    Sqoop中提供了一个用于合并数据集的工具sqoop-merge.官方文档中的描述可以参考我的另一篇博客Sqoop-1.4.5用户手册. Merge的基本原理是,需要指定新数据集和老数据集的路径,根据 ...