Android中 使用Javamail发送Email带群发加附件(绝对可用!)

之前写了一篇关于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; 	@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("[email protected]", "*****");   			String[] toArr = {"[email protected]","[email protected]"};  			m.setTo(toArr);  			m.setFrom("[email protected]");  			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>

运行效果:



点击发送之后




你可能感兴趣的:(Android中 使用Javamail发送Email带群发加附件(绝对可用!))