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

之前写了一篇关于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>

运行效果图:

点击发送后

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

以上是 Android使用Javamail发送Email群发加附件 的全部内容, 来源链接: utcz.com/p/241570.html

回到顶部