一个项目的需求,之前一篇博客写过如何生成excel,生成后的excel要发送给用户(指定邮箱)。奇葩的后台说这个发送也不好实现,要客户端来做。也就只能做了(又是分分钟要来个螺旋王)。本篇博客就简单介绍下android如何发送邮件。结果图如下:
![](https://box.kancloud.cn/2016-04-08_570771b78d0a2.jpg)
这里我说的只是一种方法,其实发送邮件的方式有很多。在之前的那个生成excel的项目继续扩展。没看过之前项目的可以先看下:[android生成excel](http://blog.csdn.net/u014486880/article/details/50605659)。
首先要导入发送邮件的相应jar包,有三个,分别是activation.jar,additional.jar和mail.jar。这些jar包能在后面的工程中找到。如图:
![](https://box.kancloud.cn/2016-04-08_570771b7a24f0.jpg)
然后写一个发送邮件工具类来写发送邮件的底层代码,先把代码贴出来。
~~~
public class EmailUtil {
class MyAuthenticator extends javax.mail.Authenticator {
private String strUser;
private String strPwd;
public MyAuthenticator(String user, String password) {
this.strUser = user;
this.strPwd = password;
}
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(strUser, strPwd);
}
}
public void sendMail(String toMail, String fromMail, String server,
String username, String password, String title, String body,
String attachment) throws Exception {
Properties props = System.getProperties();// Get system properties
//添加邮箱地址。
props.put("mail.smtp.host", server);// Setup mail server
props.put("mail.smtp.auth", "true");
//添加邮箱权限
MyAuthenticator myauth = new MyAuthenticator(username, password);// Get
Session session = Session.getDefaultInstance(props, myauth);
MimeMessage message = new MimeMessage(session); // Define message
//设置目的邮箱
message.setFrom(new InternetAddress(fromMail)); // Set the from address
message.addRecipient(Message.RecipientType.TO, new InternetAddress(
toMail));// Set
//设置邮件的标题
message.setSubject(title);// Set the subject
// message.setText(MimeUtility.encodeWord(body));// Set the content
MimeMultipart allMultipart = new MimeMultipart("mixed");
MimeBodyPart attachPart = new MimeBodyPart();
//添加附件
FileDataSource fds = new FileDataSource(attachment);
attachPart.setDataHandler(new DataHandler(fds));//附件
attachPart.setFileName(MimeUtility.encodeWord(fds.getName()));
MimeBodyPart textBodyPart = new MimeBodyPart();
//添加邮件内容
textBodyPart.setText(body);
allMultipart.addBodyPart(attachPart);
allMultipart.addBodyPart(textBodyPart);
message.setContent(allMultipart);
message.saveChanges();
Transport.send(message);//发送邮件
}
}
~~~
toMail:是发送目的的邮箱。
fromMail:是用于发送的邮箱。
server:固定写为”smtp.mxhichina.com”。这是阿里云企业邮箱地址。
account:指用于发送邮件的邮箱账号。
password:指用于发送邮件的邮箱密码。
title,body:不用说,就是邮件的题目和内容。
attachment:表示上传的附件在手机中的路径。
代码都加了注释,还是比较清楚的。重点看下添加附件部分,因为内容有两部分,有文字内容和附近,所以要用MimeMultipart 来实现两部分的添加。MimeBodyPart生于添加一部分的内容,setText方法用于添加方字内容。setFileName用于添加附件内容,具体的看代码。
接下来就是发送邮件的业务层代码了。看下MainActivity代码:
~~~
public class MainActivity extends Activity {
Button btn,btn1;
List<Order> orders = new ArrayList<Order>();
String path;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
int length = Const.OrderInfo.orderOne.length;
for(int i = 0;i < length;i++){
Order order = new Order( Const.OrderInfo.orderOne[i][0], Const.OrderInfo.orderOne[i][1], Const.OrderInfo.orderOne[i][2], Const.OrderInfo.orderOne[i][3]);
orders.add(order);
}
btn = (Button)super.findViewById(R.id.btn);
btn1 = (Button)super.findViewById(R.id.btn1);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
String fileName = "excel_"+new Date().toString();
path = "/MailDemo/" + fileName ;
try {
ExcelUtil.writeExcel(MainActivity.this,
orders, path);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
btn1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
String pathString = getExternalFilesDir(null).getPath()+path;
sendMail("635596741@qq.com", "订单",
"邮件由系统自动发送,请不要回复!", pathString+ ".xls");
Toast.makeText(MainActivity.this, "邮件发送成功", Toast.LENGTH_SHORT).show();
}
});
}
public void sendMail(final String toMail, final String title,
final String body, final String path){
new Thread(new Runnable() {
public void run() {
EmailUtil emailUtil = new EmailUtil();
try {
String account = "xxxx@123.com(your mail)";
String password = "xxx(your password)";
emailUtil.sendMail(toMail, account, "smtp.mxhichina.com",
account, password, title, body, path);
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
}
~~~
重点看下sendMail方法,其实很简单,就是把对应的参数往里传,分别传入你的邮箱密码、你要发送的目的邮件、邮件的内容题目及附件路径。但是注意要开启一个线程来发邮件,因为发邮件的时间可能比较长,在主线程中发的话可以会导致NAR。这里还有一点要注意的是传入附件的路径要和excel生成的路径一致,才能找到文件。如果是批量发送邮件,就要考虑使用线程池,但如果是批量发的话,一般都是在后台进行处理。
到此发送邮件的功能就实现了。还是比较简单实用的。
**[项目下载](https://github.com/reallin/Android_Mail)**
- 前言
- Android底部tab与标题栏相结合
- Android免费获取短信验证码
- android中Handler的源码分析
- 详解Fragment的传值问题
- 详谈gson解析
- android新控件之toolbar,floatingActionButton,SnackBar,CollapsingToolbarLayout
- android自定义控件
- 浅谈android的线程池
- Android的消息处理机制,AsyncTask源码解析
- IPC——android进程间通信
- CoCos2d_android入门所需知道的一切
- Cocos2d_android你所需要知道的一切(下)
- Activity你需要知道的一切
- Activity启动过程源码分析
- Data Binding Guide——google官方文档翻译(上)
- Data Binding Guide——google官方文档翻译(下)
- android TextView实现跑马灯效果
- android中生成excel
- Volley源码解析
- LayoutInflater源码解析
- android发送邮件
- android测试工具MonkeyRunner--google官网翻译
- android View绘制源码分析
- Android中Window添加View的底层原理
- 仿美团商品选购下拉菜单实现