一個項目的需求,之前一篇博客寫過如何生成excel,生成后的excel要發送給用戶(指定郵箱)。奇葩的后臺說這個發送也不好實現,要客戶端來做。也就只能做了(又是分分鐘要來個螺旋王)。本篇博客就簡單介紹下android如何發送郵件。結果圖如下:?
?
這里我說的只是一種方法,其實發送郵件的方式有很多。在之前的那個生成excel的項目繼續擴展。沒看過之前項目的可以先看下:[android生成excel](http://blog.csdn.net/u014486880/article/details/50605659)。?
首先要導入發送郵件的相應jar包,有三個,分別是activation.jar,additional.jar和mail.jar。這些jar包能在后面的工程中找到。如圖:?
?
然后寫一個發送郵件工具類來寫發送郵件的底層代碼,先把代碼貼出來。
~~~
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的底層原理
- 仿美團商品選購下拉菜單實現