当前位置: 首页 > 编程笔记 >

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

琴英华
2023-03-14
本文向大家介绍Android使用Javamail发送Email群发加附件,包括了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>

运行效果图:

点击发送后

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

 类似资料:
  • 虽然Python通过 smtplib 库使得发送email变得很简单,Scrapy仍然提供了自己的实现。 该功能十分易用,同时由于采用了 Twisted非阻塞式(non-blocking)IO ,其避免了对爬虫的非阻塞式IO的影响。 另外,其也提供了简单的API来发送附件。 通过一些 settings 设置,您可以很简单的进行配置。 简单例子 有两种方法可以创建邮件发送器(mail sender)

  • 配置示例 output { email { to => "admin@website.com,root@website.com" cc => "other@website.com" via => "smtp" subject => "Warning: %{title}" options => {

  • 我试图在javamail API的帮助下发送两个附件,但发件人正在接收附件作为转发消息传递给发件人的邮件。我也看不到邮件中的正文。我正在向outlook的电子邮件客户端发送邮件。它类似的附件在同一封邮件中以独立邮件的形式出现,当我点击邮件中的独立邮件时,它会显示附件。就像我在同一封邮件中打开了另一封邮件一样。谁能检查一下我做错了什么吗 下面是代码 我只想让发件人在一个窗口中接收附件。

  • 本文向大家介绍基于java使用JavaMail发送邮件,包括了基于java使用JavaMail发送邮件的使用技巧和注意事项,需要的朋友参考一下 一、邮件的相关概念 邮件协议。主要包括: SMTP协议:Simple Mail Transfer Protocol,即简单邮件传输协议,用于发送电子邮件 POP3协议:Post Office Protocol 3,即邮局协议的第三个版本,用于接收邮件 IM

  • 这是我发送邮件的代码 我在tomcat的lib文件夹中添加了和。我将eclipse与Tomcat7、JRE7和Struts2一起使用。通过Java发送邮件时出现以下控制台错误:

  • 主要内容:创建动作:,创建主页页:,创建视图:,配置文件:本章将教你如何使用Struts2 的应用程序发送电子邮件。对于此练习中,需要下载并安装将mail.jar 从 JavaMail API1.4.4,并将 mail.jar文件放置在WEB-INFlib文件夹,然后继续遵循的标准步骤创建动作,视图和配置文件。 创建动作: 下一步是创建一个Action方法,发送电子邮件。让我们创建一个新类称为 Emailer.java 以下内容。 可以看到在上面的源代码