当前位置 : 主页 > 手机开发 > android >

Android使用Javamail发送Email群发加附件

来源:互联网 收集:自由互联 发布时间:2021-05-17
之前写了一篇关于Android中发送Email的文章,里面用到的是隐式的intent来激活系统自带的邮件发送功能。 今天花了一天来自己实现这个邮件发送功能。 这里用gmail作为发送方的邮箱,其他

之前写了一篇关于Android中发送Email的文章,里面用到的是隐式的intent来激活系统自带的邮件发送功能。

今天花了一天来自己实现这个邮件发送功能。

这里用gmail作为发送方的邮箱,其他网易,新浪什么的应该也ok,QQ貌似不行。

下面是实现步骤及相关代码。

项目添加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;
 @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>{ 
 //后面尖括号内分别是参数(例子里是线程休息时间),进度(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>

运行效果图:

点击发送后

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持自由互联。

网友评论