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>

运行效果图:

点击发送后

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

(0)

相关推荐

  • Android 自动判断是电话,网址,EMAIL方法之Linkify的使用

    当我们在一个EditText输入电话或者网址还是Email的时候,让Android自动判断,当我们输入的是电话,我们点击输入内容将调用打电话程序,当我们输入是网址点击将打开浏览器程序.而Linkify很好的解决了这个问题 步骤: 1.布局UI 复制代码 代码如下: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_pare

  • Android 校验email是否合法实现代码

    Android 校验email是否合法 这个其实跟JAVA中是一样的.例子: String regEx = "^(([\\w-]+\\.)+[\\w-]+|([a-zA-Z]{1}|[\\w-]{2,}))@" +"((([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])\\.([0-1]?" +"[0-9]{1,2}|25[0-5]|2[0-4][0-9])\\." +"([0-1]?[0-9]{1,2}|25

  • Android开发中怎样调用系统Email发送邮件(多种调用方式)

    我们都知道,在Android中调用其他程序进行相关处理,几乎都是使用的Intent,所以,Email也不例外. 在Android中,调用Email有三种类型的Intent: Intent.ACTION_SENDTO 无附件的发送 Intent.ACTION_SEND 带附件的发送 Intent.ACTION_SEND_MULTIPLE 带有多附件的发送 当然,所谓的调用Email,只是说Email可以接收Intent并做这些事情,可能也有其他的应用程序实现了相关功能,所以在执行的时候,会出现选择

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

    之前写了一篇关于Android中发送Email的文章,里面用到的是隐式的intent来激活系统自带的邮件发送功能. 今天花了一天来自己实现这个邮件发送功能. 这里用gmail作为发送方的邮箱,其他网易,新浪什么的应该也ok,QQ貌似不行. 下面是实现步骤及相关代码. 项目添加jar包 将activation.jar,additionnal.jar,mail.jar放到项目的libs 文件夹.然后在项目中选中这三个包,右击->Build Path->Add to buildPath. 添加成功后

  • Java程序中使用JavaMail发送带图片和附件的邮件

    我们常常在邮件中添加附件,以达到传输较大文件的目的.而上一篇文章只是将本机的一张图片内嵌到邮件的 HTML 格式的正文当中,这样的邮件显得不够丰富多彩.我们想要一封正文部分图文并茂,而游客附带若干附件的邮件. 下面是代码结构中3个重要的方法: MimeBodyPart createAttachment(String fileName) 方法用于创建附件并返回: MimeBodyPart createContent(String body, String fileName) 方法用于创建正文部分并

  • JavaMail发送(带图片和附件)和接收邮件实现详解(四)

    好了,进入这个系列教程最主要的步骤了,前面邮件的理论知识我们都了解了,那么这篇博客我们将用代码完成邮件的发送.这在实际项目中应用的非常广泛,比如注册需要发送邮件进行账号激活,再比如OA项目中利用邮件进行任务提醒等等.我们这里所讲的就是利用 JavaMail 完成邮件的发送和接收功能. PS:本篇博客源码下载链接:https://github.com/YSOcean/cnblogs 1.JavaMail 介绍 JavaMail 是sun公司(现以被甲骨文收购)为方便Java开发人员在应用程序中实现

  • java中javamail发送带附件的邮件实现方法

    本文实例讲述了java中javamail发送带附件的邮件实现方法.分享给大家供大家参考.具体分析如下: JavaMail,顾名思义,提供给开发者处理电子邮件相关的编程接口.它是Sun发布的用来处理email的API.它可以方便地执行一些常用的邮件传输,JavaMail是可选包,因此如果需要使用的话你需要首先从java官网上下载.目前最新版本是JavaMail1.5.0,下面我们来看看javamail发送带附件的邮件实例 mail.java 代码: 复制代码 代码如下: package mail;

  • Python发送email的3种方法

    python发送email还是比较简单的,可以通过登录邮件服务来发送,linux下也可以使用调用sendmail命令来发送,还可以使用本地或者是远程的smtp服务来发送邮件,不管是单个,群发,还是抄送都比较容易实现. 先把几个最简单的发送邮件方式记录下,像html邮件,附件等也是支持的,需要时查文档即可 1.登录邮件服务 复制代码 代码如下: #!/usr/bin/env python  # -*- coding: utf-8 -*-  #python2.7x  #send_simple_ema

  • Python实现发送email的几种常用方法

    学过Python的人都知道,实用Python实现发送email的功能还是比较简单的,可以通过登录邮件服务来发送,linux下也可以使用调用sendmail命令来发送,还可以使用本地或者是远程的smtp服务来发送邮件,不管是单个,群发,还是抄送都比较容易实现. 本文就把几个最简单的发送邮件方式记录下来,像html邮件,附件等也是支持的,读者在需要时可以参考查询一下.具体方法如下: 1.登录邮件服务 具体代码如下: #!/usr/bin/env python # -*- coding: utf-8

  • 详解Python发送email的三种方式

    Python发送email的三种方式,分别为使用登录邮件服务器.使用smtp服务.调用sendmail命令来发送三种方法 Python发送email比较简单,可以通过登录邮件服务来发送,linux下也可以使用调用sendmail命令来发送,还可以使用本地或者是远程的smtp服务来发送邮件,不管是单个,群发,还是抄送都比较容易实现.本米扑博客先介绍几个最简单的发送邮件方式记录下,像html邮件,附件等也是支持的,需要时查文档即可. 一.登录邮件服务器 通过smtp登录第三方smtp邮箱发送邮件,支

  • 利用JavaMail发送HTML模板邮件

    本文实例为大家分享了用JavaMail发送HTML模板邮件的具体代码,供大家参考,具体内容如下 依赖 <dependency>     <groupId>org.jsoup</groupId>     <artifactId>jsoup</artifactId>     <version>1.10.3</version> </dependency> <dependency>     <grou

  • java发送email一般步骤(实例讲解)

    java发送email一般步骤 一.引入javamail的jar包: 二.创建一个测试类,实现将要发送的邮件内容写入到计算机本地,查看是否能够将内容写入: public static void main(String[] args) throws Exception { // 1. 创建一封邮件 Properties props = new Properties(); // 用于连接邮件服务器的参数配置(发送邮件时才需要用到) Session session= Session.getDefaul

  • Zend Framework框架之Zend_Mail实现发送Email邮件验证功能及解决标题乱码的方法

    本文实例讲述了Zend Framework框架之Zend_Mail实现发送Email邮件验证功能及解决标题乱码的方法.分享给大家供大家参考,具体如下: Zend Framework 里Zend_Mail这个组件用起来还是很方便的..它提供了通用化的编写与发送文本内容的邮件,当然它也兼容MIME标准的多个多个段的邮件消息的功能.Zend_Mail里通过默认的Zend_Mail_Transport_SendMail传输或能过Zend_Mail_Transport_Smtp来发送我们的电子邮件. Ze

随机推荐