在android里进行邮件客户端开发可以有两种方式:
在邮件客户端的设计中,可以采用两种方法。
(1) 调用android系统自带的邮件服务
优点:这种方法比较简单易用
缺点:发送邮件的账号必须是gmail账号
(2) 采用javamail功能包
优点:可以设置邮件服务器地址,不必局限于gmail邮箱
缺点:用法比较复杂
下面依次介绍这两种方式:
一.调用android系统自带的邮件服务
public void onClick(View v)
{
//创建Intent对象,并设置动作
Intent intent=new Intent(Intent.ACTION_SEND);
intent.setType("text/plain"); //模拟器上使用这行
//intent.setType("message/rfc822"); //真机上使用这行(呵呵..没试过)
//设置对方邮件地址
intent.putExtra(Intent.EXTRA_EMAIL, new String[]{receiver.getText().toString()});
//设置邮件标题内容
intent.putExtra(Intent.EXTRA_SUBJECT, subject.getText().toString());
//设置邮件文本内容
intent.putExtra(Intent.EXTRA_TEXT, content.getText().toString());
//启动一个新的Activity,并设置启动这个Activity等待时所显示的字
startActivity(Intent.createChooser(intent,getResources().getString(R.string.title)));
}
模拟器上配置gmail邮箱,输入自己的gmail账号和密码,默认使用的是你的gmail账号发信。
例子:
布局文件main.xml中的内容如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/receiver" />
<EditText
android:inputType="text"
android:id="@+id/receiver"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/subject" />
<EditText
android:inputType="text"
android:id="@+id/subject"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/content" />
<EditText
android:inputType="text"
android:id="@+id/content"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/sendEmail"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/sendEmail"/>
</LinearLayout>
SendEmailActivity.java中的内容如下:
package wei.cao.email;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
public class SendEmailActivity extends Activity {
/** Called when the activity is first created. */
private EditText receiver,subject,content;
private Button sendEmail;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
receiver=(EditText)this.findViewById(R.id.receiver);
subject=(EditText)this.findViewById(R.id.subject);
content=(EditText)this.findViewById(R.id.content);
sendEmail=(Button)this.findViewById(R.id.sendEmail);
sendEmail.setOnClickListener(new sendEmailListener());
}
class sendEmailListener implements OnClickListener
{
@Override
public void onClick(View v)
{
//创建Intent对象,并设置动作
Intent intent=new Intent(Intent.ACTION_SEND);
intent.setType("text/plain"); //模拟器上使用这行
//intent.setType("message/rfc822"); //真机上使用这行(呵呵..没试过)
//设置对方邮件地址
intent.putExtra(Intent.EXTRA_EMAIL, new String[]{receiver.getText().toString()});
//设置邮件标题内容
intent.putExtra(Intent.EXTRA_SUBJECT, subject.getText().toString());
//设置邮件文本内容
intent.putExtra(Intent.EXTRA_TEXT, content.getText().toString());
//启动一个新的Activity,并设置启动这个Activity等待时所显示的字
startActivity(Intent.createChooser(intent,getResources().getString(R.string.title)));
}
}
}
运行结果:
二.采用javamail功能包
配置步骤:
-
下载Android版本JavaMail包,additional.jar、mail.jar和activation.jar,下载地址http://code.google.com/p/javamail-android/downloads/list
-
在项目与src同一目录级别下,新建文件夹lib,将下载的3个jar包放入该文件夹
-
右键->Properties->Java Build Path->Libraries,选择Add External JARs,找到项目下lib目录的3个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,发送邮件,而发送邮件的内容可以被控制,发件人的地址就可以随便填写。
发送邮件主要包括3个部分:创建连接,创建邮件体,发送邮件
JavaMail中,是使用会话(Session)来管理连接的。创建一个连接,就需要创建一个会话。在会话中,有两个重要的因素,一是会话的属性,二是会话的认证。在我们使用Hotmail等邮件工具的时候,就要设置”SMTP服务器身份验证”,也就是这里的会话的认证。
例子:
MailSenderInfo.java中的内容:
package wei.cao.email.utils;
import java.util.Properties;
public class MailSenderInfo {
// 发送邮件的服务器的IP和端口
private String mailServerHost;
private String mailServerPort = "25";
// 邮件发送者的地址
private String fromAddress;
// 邮件接收者的地址
private String toAddress;
// 登陆邮件发送服务器的用户名和密码
private String userName;
private String password;
// 是否需要身份验证
private boolean validate = false;
// 邮件主题
private String subject;
// 邮件的文本内容
private String content;
// 邮件附件的文件名
private String[] attachFileNames;
/**
* 获得邮件会话属性
*/
public Properties getProperties(){
Properties p = new Properties();
p.put("mail.smtp.host", this.mailServerHost);
p.put("mail.smtp.port", this.mailServerPort);
p.put("mail.smtp.auth", validate ? "true" : "false");
return p;
}
public String getMailServerHost() {
return mailServerHost;
}
public void setMailServerHost(String mailServerHost) {
this.mailServerHost = mailServerHost;
}
public String getMailServerPort() {
return mailServerPort;
}
public void setMailServerPort(String mailServerPort) {
this.mailServerPort = mailServerPort;
}
public boolean isValidate() {
return validate;
}
public void setValidate(boolean validate) {
this.validate = validate;
}
public String[] getAttachFileNames() {
return attachFileNames;
}
public void setAttachFileNames(String[] fileNames) {
this.attachFileNames = fileNames;
}
public String getFromAddress() {
return fromAddress;
}
public void setFromAddress(String fromAddress) {
this.fromAddress = fromAddress;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getToAddress() {
return toAddress;
}
public void setToAddress(String toAddress) {
this.toAddress = toAddress;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getContent() {
return content;
}
public void setContent(String textContent) {
this.content = textContent;
}
}
2.SimpleMailSender.java中的内容
package wei.cao.email.utils;
import java.util.Date;
import java.util.Properties;
import javax.mail.*;
import javax.mail.internet.*;
public class SimpleMailSender {
/**
* 以文本格式发送邮件
* @param mailInfo 待发送的邮件的信息
*/
public boolean sendTextMail(MailSenderInfo mailInfo) {
// 判断是否需要身份认证
MyAuthenticator authenticator = null;
Properties pro = mailInfo.getProperties();
if (mailInfo.isValidate()) {
// 如果需要身份认证,则创建一个密码验证器
authenticator = new MyAuthenticator(mailInfo.getUserName(), mailInfo.getPassword());
}
// 根据邮件会话属性和密码验证器构造一个发送邮件的session
Session sendMailSession = Session.getDefaultInstance(pro,authenticator);
try {
// 根据session创建一个邮件消息
Message mailMessage = new MimeMessage(sendMailSession);
// 创建邮件发送者地址
Address from = new InternetAddress(mailInfo.getFromAddress());
// 设置邮件消息的发送者
mailMessage.setFrom(from);
// 创建邮件的接收者地址,并设置到邮件消息中
Address to = new InternetAddress(mailInfo.getToAddress());
mailMessage.setRecipient(Message.RecipientType.TO,to);
// 设置邮件消息的主题
mailMessage.setSubject(mailInfo.getSubject());
// 设置邮件消息发送的时间
mailMessage.setSentDate(new Date());
// 设置邮件消息的主要内容
String mailContent = mailInfo.getContent();
mailMessage.setText(mailContent);
// 发送邮件
Transport.send(mailMessage);
return true;
} catch (MessagingException ex) {
ex.printStackTrace();
}
return false;
}
/**
* 以HTML格式发送邮件
* @param mailInfo 待发送的邮件信息
*/
public static boolean sendHtmlMail(MailSenderInfo mailInfo){
// 判断是否需要身份认证
MyAuthenticator authenticator = null;
Properties pro = mailInfo.getProperties();
//如果需要身份认证,则创建一个密码验证器
if (mailInfo.isValidate()) {
authenticator = new MyAuthenticator(mailInfo.getUserName(), mailInfo.getPassword());
}
// 根据邮件会话属性和密码验证器构造一个发送邮件的session
Session sendMailSession = Session.getDefaultInstance(pro,authenticator);
try {
// 根据session创建一个邮件消息
Message mailMessage = new MimeMessage(sendMailSession);
// 创建邮件发送者地址
Address from = new InternetAddress(mailInfo.getFromAddress());
// 设置邮件消息的发送者
mailMessage.setFrom(from);
// 创建邮件的接收者地址,并设置到邮件消息中
Address to = new InternetAddress(mailInfo.getToAddress());
// Message.RecipientType.TO属性表示接收者的类型为TO
mailMessage.setRecipient(Message.RecipientType.TO,to);
// 设置邮件消息的主题
mailMessage.setSubject(mailInfo.getSubject());
// 设置邮件消息发送的时间
mailMessage.setSentDate(new Date());
// MiniMultipart类是一个容器类,包含MimeBodyPart类型的对象
Multipart mainPart = new MimeMultipart();
// 创建一个包含HTML内容的MimeBodyPart
BodyPart html = new MimeBodyPart();
// 设置HTML内容
html.setContent(mailInfo.getContent(), "text/html; charset=utf-8");
mainPart.addBodyPart(html);
// 将MiniMultipart对象设置为邮件内容
mailMessage.setContent(mainPart);
// 发送邮件
Transport.send(mailMessage);
return true;
} catch (MessagingException ex) {
ex.printStackTrace();
}
return false;
}
}
3.MyAuthenticator.java类中的内容:
package wei.cao.email.utils;
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
public class MyAuthenticator extends Authenticator {
String userName=null;
String password=null;
public MyAuthenticator(){
}
public MyAuthenticator(String username, String password) {
this.userName = username;
this.password = password;
}
protected PasswordAuthentication getPasswordAuthentication(){
return new PasswordAuthentication(userName, password);
}
}
下面给出使用上面三个类的代码:
@Override
public void onClick(View v) {
//这个类主要是设置邮件
MailSenderInfo mailInfo = new MailSenderInfo();
mailInfo.setMailServerHost("smtp.163.com");
mailInfo.setMailServerPort("25");
mailInfo.setValidate(true);
mailInfo.setUserName("han2000lei@163.com");
mailInfo.setPassword("**********");//您的邮箱密码
mailInfo.setFromAddress("han2000lei@163.com");
mailInfo.setToAddress("han2000lei@163.com");
mailInfo.setSubject("设置邮箱标题");
mailInfo.setContent("设置邮箱内容");
//这个类主要来发送邮件
SimpleMailSender sms = new SimpleMailSender();
sms.sendTextMail(mailInfo);//发送文体格式
sms.sendHtmlMail(mailInfo);//发送html格式
}
参考:
http://blog.csdn.net/yddido/article/details/6254196
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