Android中 使用Javamail發送Email帶群發加附件(絕對可用!)

來源:互聯網
上載者:User

之前寫了一篇關於Android中發送Email的文章,裡面用到的是隱式的intent來啟用系統內建的郵件發送功能。

今天花了一天來自己實現這個郵件發送功能(主要是網上的代碼太坑...)

這裡用gmail作為發送方的郵箱,其他網易,新浪什麼的應該也ok,QQ貌似不行。

資源來自:javamail-android

下面是實現步驟及相關代碼。

項目添加jar包

將activation.jar,additionnal.jar,mail.jar放到項目的libs 檔案夾。然後在項目中選中這三個包,右擊->Build Path->Add to buildPath.

添加成功後項目就像這樣.

項目中添加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調用

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;@Overrideprotected 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();} }); } @Overridepublic 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>{    //後面角括弧內分別是參數(例子裡是線程休息時間),進度(publishProgress用到),傳回值 類型    @Override    protected void onPreExecute() {    //第一個執行方法    Toast.makeText(getApplicationContext(), "Begin Send!", Toast.LENGTH_SHORT).show();  super.onPreExecute();    }    @Override    protected String doInBackground(Integer... params) {    //第二個執行方法,onPreExecute()執行完後執行    // 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) {    //這個函數在doInBackground調用publishProgress時觸發,雖然調用時只有一個參數    //但是這裡取到的是一個數組,所以要用progesss[0]來取值    //第n個參數就用progress[n]來取值        super.onProgressUpdate(progress);    }    @Override    protected void onPostExecute(String r) {    //doInBackground返回時觸發,換句話說,就是doInBackground執行完後觸發    //這裡的result就是上面doInBackground執行後的傳回值,所以這裡是"執行完畢"    //setTitle(result);  super.onPostExecute(r);    }    }    }

這裡用到了AsyncTask,應為直接在UI線程中串連互連網的話,或爆 android.os.NetworkOnMainThreadException異常。


 布局檔案

主介面的布局檔案,非常簡單。

<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>

運行效果:

點擊發送之後

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.