Android使用Javamail發(fā)送Email群發(fā)加附件
之前寫了一篇關(guān)于Android中發(fā)送Email的文章,里面用到的是隱式的intent來激活系統(tǒng)自帶的郵件發(fā)送功能。
今天花了一天來自己實(shí)現(xiàn)這個(gè)郵件發(fā)送功能。
這里用gmail作為發(fā)送方的郵箱,其他網(wǎng)易,新浪什么的應(yīng)該也ok,QQ貌似不行。
下面是實(shí)現(xiàn)步驟及相關(guān)代碼。
項(xiàng)目添加jar包
將activation.jar,additionnal.jar,mail.jar放到項(xiàng)目的libs 文件夾。然后在項(xiàng)目中選中這三個(gè)包,右擊->Build Path->Add to buildPath.
添加成功后項(xiàng)目就像這樣.
項(xiàng)目中添加Mail類
package com.example.mailtest; import java.util.Date; import java.util.Properties; import javax.activation.CommandMap; import javax.activation.DataHandler; import javax.activation.DataSource; import javax.activation.FileDataSource; import javax.activation.MailcapCommandMap; import javax.mail.BodyPart; import javax.mail.Multipart; import javax.mail.PasswordAuthentication; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; public class Mail extends javax.mail.Authenticator { private String _user; private String _pass; private String[] _to; private String _from; private String _port; private String _sport; private String _host; private String _subject; private String _body; private boolean _auth; private boolean _debuggable; private Multipart _multipart; public Mail() { _host = "smtp.gmail.com"; // default smtp server _port = "465"; // default smtp port _sport = "465"; // default socketfactory port _user = ""; // username _pass = ""; // password _from = ""; // email sent from _subject = ""; // email subject _body = ""; // email body _debuggable = false; // debug mode on or off - default off _auth = true; // smtp authentication - default on _multipart = new MimeMultipart(); // There is something wrong with MailCap, javamail can not find a handler for the multipart/mixed part, so this bit needs to be added. MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap(); mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html"); mc.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml"); mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain"); mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed"); mc.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822"); CommandMap.setDefaultCommandMap(mc); } public Mail(String user, String pass) { this(); _user = user; _pass = pass; } public void setTo(String[] toArr) { this._to = toArr; } public void setFrom(String string) { this._from = string; } public void setSubject(String string) { this._subject = string; } public boolean send() throws Exception { Properties props = _setProperties(); if(!_user.equals("") && !_pass.equals("") && _to.length > 0 && !_from.equals("") && !_subject.equals("") && !_body.equals("")) { Session session = Session.getInstance(props, this); MimeMessage msg = new MimeMessage(session); msg.setFrom(new InternetAddress(_from)); InternetAddress[] addressTo = new InternetAddress[_to.length]; for (int i = 0; i < _to.length; i++) { addressTo[i] = new InternetAddress(_to[i]); } msg.setRecipients(MimeMessage.RecipientType.TO, addressTo); msg.setSubject(_subject); msg.setSentDate(new Date()); // setup message body BodyPart messageBodyPart = new MimeBodyPart(); messageBodyPart.setText(_body); _multipart.addBodyPart(messageBodyPart); // Put parts in message msg.setContent(_multipart); // send email Transport.send(msg); return true; } else { return false; } } public void addAttachment(String filename) throws Exception { BodyPart messageBodyPart = new MimeBodyPart(); DataSource source = new FileDataSource(filename); messageBodyPart.setDataHandler(new DataHandler(source)); messageBodyPart.setFileName(filename); _multipart.addBodyPart(messageBodyPart); } @Override public PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(_user, _pass); } private Properties _setProperties() { Properties props = new Properties(); props.put("mail.smtp.host", _host); if(_debuggable) { props.put("mail.debug", "true"); } if(_auth) { props.put("mail.smtp.auth", "true"); } props.put("mail.smtp.port", _port); props.put("mail.smtp.socketFactory.port", _sport); props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); props.put("mail.smtp.socketFactory.fallback", "false"); return props; } // the getters and setters public String getBody() { return _body; } public void setBody(String _body) { this._body = _body; } // more of the getters and setters ….. }
MailActivity調(diào)用
package com.example.mailtest; import java.util.Properties; import javax.mail.Address; import javax.mail.Message; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import android.os.AsyncTask; import android.os.Bundle; import android.os.Handler; import android.app.Activity; import android.app.ProgressDialog; import android.util.Log; import android.view.Menu; import android.view.View; import android.widget.Button; import android.widget.Toast; public class MailActivity extends Activity { private Button sendBtn; private String username; private String password; private Handler sendHandler; private ProgressDialog progressDialog; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_mail); sendBtn=(Button)findViewById(R.id.btnSend); sendHandler = new Handler(); sendBtn.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { SendTask sTask = new SendTask(); sTask.execute(); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_mail, menu); return true; } class SendTask extends AsyncTask<Integer, Integer, String>{ //后面尖括號(hào)內(nèi)分別是參數(shù)(例子里是線程休息時(shí)間),進(jìn)度(publishProgress用到),返回值 類型 @Override protected void onPreExecute() { //第一個(gè)執(zhí)行方法 Toast.makeText(getApplicationContext(), "Begin Send!", Toast.LENGTH_SHORT).show(); super.onPreExecute(); } @Override protected String doInBackground(Integer... params) { //第二個(gè)執(zhí)行方法,onPreExecute()執(zhí)行完后執(zhí)行 // TODO Auto-generated method stub Mail m = new Mail("empty.shen@gmail.com", "*****"); String[] toArr = {"silangquan@gmail.com","k283228391@126.com"}; m.setTo(toArr); m.setFrom("wooo@wooo.com"); m.setSubject("JavamailTest"); m.setBody("Email body."); try { //If you want add attachment use function addAttachment. //m.addAttachment("/sdcard/filelocation"); if(m.send()) { System.out.println("Email was sent successfully."); } else { System.out.println("Email was not sent."); } } catch(Exception e) { //Toast.makeText(MailApp.this, "There was a problem sending the email.", Toast.LENGTH_LONG).show(); Log.e("MailApp", "Could not send email", e); } return ""; } @Override protected void onProgressUpdate(Integer... progress) { //這個(gè)函數(shù)在doInBackground調(diào)用publishProgress時(shí)觸發(fā),雖然調(diào)用時(shí)只有一個(gè)參數(shù) //但是這里取到的是一個(gè)數(shù)組,所以要用progesss[0]來取值 //第n個(gè)參數(shù)就用progress[n]來取值 super.onProgressUpdate(progress); } @Override protected void onPostExecute(String r) { //doInBackground返回時(shí)觸發(fā),換句話說,就是doInBackground執(zhí)行完后觸發(fā) //這里的result就是上面doInBackground執(zhí)行后的返回值,所以這里是"執(zhí)行完畢" //setTitle(result); super.onPostExecute(r); } } }
這里用到了AsyncTask,應(yīng)為直接在UI線程中連接互聯(lián)網(wǎng)的話,或爆 android.os.NetworkOnMainThreadException異常。
布局文件
主界面的布局文件,非常簡(jiǎn)單。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MailActivity" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:text="@string/hello_world" /> <Button android:id="@+id/btnSend" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:layout_marginTop="19dp" android:text="Send" /> </RelativeLayout>
運(yùn)行效果圖:
點(diǎn)擊發(fā)送后
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
利用 kotlin 的方式自定義回調(diào)事件(kotlin函數(shù)參數(shù))
這篇文章主要介紹了利用 kotlin 的方式自定義回調(diào)事件(kotlin函數(shù)參數(shù)),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-03-03Android自定義view之圍棋動(dòng)畫效果的實(shí)現(xiàn)
這篇文章主要介紹了Android自定義view之圍棋動(dòng)畫效果的實(shí)現(xiàn),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12Android DateUtil時(shí)間工具類使用方法示例解析
這篇文章主要為大家介紹了Android DateUtil時(shí)間工具類使用方法示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07Android 中ViewPager中使用WebView的注意事項(xiàng)
這篇文章主要介紹了Android 中ViewPager中使用WebView的注意事項(xiàng)的相關(guān)資料,希望通過本文大家在使用過程中遇到這樣的問題解決,需要的朋友可以參考下2017-09-09功能強(qiáng)大的登錄界面Android實(shí)現(xiàn)代碼
這篇文章主要為大家分享了功能強(qiáng)大的登錄界面Android實(shí)現(xiàn)代碼,驗(yàn)證碼制作方法,自帶一鍵刪除功能,用戶名密碼為空時(shí)抖動(dòng)提示效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10解決Android 虛擬按鍵遮住了頁(yè)面內(nèi)容的問題
今天小編就為大家分享一篇解決Android 虛擬按鍵遮住了頁(yè)面內(nèi)容的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-07-07Android 獲取內(nèi)外SD卡路徑幾種方法總結(jié)
這篇文章主要介紹了Android 獲得內(nèi)外SD卡路徑幾種方法總結(jié)的相關(guān)資料,需要的朋友可以參考下2016-12-12