文档章节

Android中使用apache commons-net发送后台邮件的方法

since1986
 since1986
发布于 2014/04/24 10:52
字数 433
阅读 578
收藏 7

上一篇文章中我介绍了使用Javamail-android在android中发送后台邮件的方法,但是,这个Javamail-android并不是一个靠谱的开源组织发布的,而且是修改过的Javaee,总觉得用起来别扭,所以我就一直搜寻一种更靠谱的解决方案。总算功夫不负有心人,看到了这两篇文章:Sending email without user interaction in AndroidSending a mail in Java (and Android) with Apache Commons Net SMTP : STARTTLS, SSL,在这两篇文章中介绍了使用 apache commons-net 来发送邮件的方法。这个就很对路了,apache出品,正规大厂,质量信得过产品,呵呵。

核心代码片段:

// 建立发送邮件任务
new AsyncTask<String, Integer, Boolean>() {

		@Override
		protected Boolean doInBackground(String... params) {
			
			//使用commons-net中的AuthenticatingSMTPClient
			AuthenticatingSMTPClient client = new AuthenticatingSMTPClient("TLS", true);
			try {
				client.connect("smtp.gmail.com", 465);
				client.ehlo("localhost"); //需要ehlo一下
				client.sendCommand("AUTH XOAUTH2 " + Base64.encodeBase64URLSafeString(
						String.format("user=%s\1auth=Bearer %s\1\1", me.name, oauthToken).getBytes())
						); //发送Google的XOAUTH2命令
				client.setSender(me.name);
				
				//处理多个收件人
				String[] recipientsArray = null;
				if(recipients.toString().contains(",")) {
					recipientsArray = recipients.toString().trim().split(",");
					for( String recipient : recipientsArray ) {
						client.addRecipient(recipient);
					}
				}else {
					recipientsArray = new String[]{recipients.toString()};
					client.addRecipient(recipients.toString());
				}
				
				//处理邮件主题与正文
				Writer writer = client.sendMessageData();
				if(null != writer) {
					
					//使用apache mime4j中的EncoderUtil来处理中文乱码的问题
					String encodedSubject = EncoderUtil.encodeIfNecessary(subject, Usage.TEXT_TOKEN, 0); //使用apache mime4j中的EncoderUtil来编码邮件主题
					String encodedBody = EncoderUtil.encodeB(body.getBytes()); //使用apache mime4j中的EncoderUtil来编码邮件正文
					
					Log.i(SMSBroadcastReceiver.class.getName(), "encodedSubject: " + encodedSubject);
					Log.i(SMSBroadcastReceiver.class.getName(), "encodedBody: " + encodedBody);
					
					SimpleSMTPHeader header = new SimpleSMTPHeader(me.name, recipientsArray[0], encodedSubject);
					header.addHeaderField("Content-Type", "text/plain; charset=UTF-8");
					header.addHeaderField("Content-Transfer-Encoding", "base64");
					for (int i = 0; i < recipientsArray.length; i++) {
						if(0 == i) continue;
						header.addCC(recipientsArray[i]);
					}
					writer.write(header.toString());
					writer.write(encodedBody);
					writer.close();
				}
				return true;
			} catch (Exception e) {
				return false;
			} finally {
				try {
					client.disconnect();
				} catch (IOException e) {
				}
			}
		}

	}.execute();


© 著作权归作者所有

共有 人打赏支持
since1986
粉丝 7
博文 60
码字总数 10510
作品 1
石家庄
程序员
私信 提问
刚刚学习到的Android使用Javamail通过XOauth调用Gmail API发送邮件的方法

前景知识:OAuth,Javamail-android,Javamail api in android using XOauth 我的一个App项目需要在Service中自动发送邮件的功能,因为是后台自动发送邮件,不能出现邮件UI所以需要使用Javam...

since1986
2014/04/12
0
0
Play2 + ReactiveMongo 实现一个活动报名应用

Play 2: ReactiveMongo: 代码在: http://git.oschina.net/socialcredits/social-credits-activity-service 公司要做一些活动,需要一个线上的活动报名应用。想着前几天刚好看了下 ,觉得这个...

羊八井
2015/08/12
0
4
Android任务和返回栈完全解析,细数那些你所不知道的细节(最详细的解说了)

本篇文章主要内容来自于Android Doc,我翻译之后又做了些加工,英文好的朋友也可以直接去读原文。 http://developer.android.com/guide/components/tasks-and-back-stack.html 任务和返回栈 ...

新年
2015/05/27
0
0
Android Activity---启动Activity

你能够通过调用startActivity()方法来启动另外一个Activity,在调用这个方法时要给它传递一个你想要启动的描述Activity的Intent作为参数。这个Intent既可以确切的指定你想要启动的Activity,...

长平狐
2012/10/16
2.1K
0
Android下无界面后台发送彩信代码

如果想调用系统彩信界面,然后发送彩信,经测试下面的代码就可以实现 Intent intent = new Intent(Intent.ACTION_SEND); 如果想不出现系统的彩信界面,直接从后台发送,可以联系我们 本公司通...

suifeng99
2011/07/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

centos7重置密码、单用户模式、救援模式、ls命令、chmod命令

在工作当中如果我们错误的配置了文件使服务器不能正常启动或者忘记密码不能登录系统,如何解决这些问题呢?重装系统是可以实现的,但是往往不能轻易重装系统的,下面用忘记密码作为例子讲解如...

李超小牛子
今天
3
0
Python如何开发桌面应用程序?Python基础教程,第十三讲,图形界面

当使用桌面应用程序的时候,有没有那么一瞬间,想学习一下桌面应用程序开发?行业内专业的桌面应用程序开发一般是C++,C#来做,Java开发的也有,但是比较少。本节课会介绍Python的GUI(图形用...

程序员补给栈
今天
5
0
kafka在的使用

一、基本概念 介绍 Kafka是一个分布式的、可分区的、可复制的消息系统。它提供了普通消息系统的功能,但具有自己独特的设计。 这个独特的设计是什么样的呢? 首先让我们看几个基本的消息系统...

狼王黄师傅
今天
3
0
Android JNI总结

0x01 JNI介绍 JNI是Java Native Interface的缩写,JNI不是Android专有的东西,它是从Java继承而来,但是在Android中,JNI的作用和重要性大大增强。 JNI在Android中起着连接Java和C/C++层的作...

天王盖地虎626
昨天
3
0
大数据教程(11.8)Hive1.2.2简介&初体验

上一篇文章分析了Hive1.2.2的安装,本节博主将分享Hive的体验&Hive服务端和客户端的使用方法。 一、Hive与hadoop直接的关系 Hive利用HDFS存储数据,利用MapReduce查询数据。 二、Hive与传统数...

em_aaron
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部