使用Apache Commons Net SMTP以Java(和Android)发送邮件:STARTTLS,SSL

最近我正在做一个Android实验,我想使用SMTP服务器通过android应用程序通过身份验证和加密来发送电子邮件。

好吧, 我发现Android上的javax.mail并不是一个很好的选择 ,因为它取决于awt类(我猜是传统); 有些人试图对其进行调整,以使您不需要整个awt软件包 ,但我在此方面收效甚微。 更不用说那些人几年前自己重构了Android的javax.mail,没有任何维护。

我想到的另一个选择是重新使用Apache Commons Net : 由于该社区向原始SMTP客户端添加了SMTPSClient和AuthenticatingSMTPClient ( 并为SSL和身份验证应用了我的一点补丁 ),因此您可以将该库嵌入Android应用程序(无需传递依赖项)以在安全层上使用身份验证发送邮件。 ( 这篇文章实际上激发了我的灵感 ,但是它使用的是Apache Commons Net的旧版本,而使用3.3则不再需要这样做)

SMTP身份验证和具有Commons Net的STARTTLS

通常,用于此问题的端口是25或备用587端口:您通过普通连接连接到SMTP服务器,要求提供可用的命令,如果支持STARTTLS,则使用它,其余的通信将被加密。

让我们以gmail为例,因为smtp.gmail.com支持身份验证和STARTTLS

public void sendEmail() throws Exception {  String hostname = "smtp.gmail.com";int port = 587;String password = "gmailpassword";String login = "account@gmail.com";String from = login;String subject = "subject" ;String text = "message";AuthenticatingSMTPClient client = new AuthenticatingSMTPClient();try {String to = "recipient@email.com";// optionally set a timeout to have a faster feedback on errorsclient.setDefaultTimeout(10 * 1000);// you connect to the SMTP serverclient.connect(hostname, port);// you say ehlo  and you specify the host you are connecting from, could be anythingclient.ehlo("localhost");// if your host accepts STARTTLS, we're good everything will be encrypted, otherwise we're done hereif (client.execTLS()) {client.auth(AuthenticatingSMTPClient.AUTH_METHOD.LOGIN, login, password);checkReply(client);client.setSender(from);checkReply(client);client.addRecipient(to);checkReply(client);Writer writer = client.sendMessageData();if (writer != null) {SimpleSMTPHeader header = new SimpleSMTPHeader(from, to, subject);writer.write(header.toString());writer.write(text);writer.close();if(!client.completePendingCommand()) {// failurethrow new Exception("Failure to send the email "+ client.getReply() + client.getReplyString());}} else {throw new Exception("Failure to send the email "+ client.getReply() + client.getReplyString());}} else {throw new Exception("STARTTLS was not accepted "+ client.getReply() + client.getReplyString());}} catch (Exception e) {throw e;} finally {client.logout();client.disconnect();}}private static void checkReply(SMTPClient sc) throws Exception {if (SMTPReply.isNegativeTransient(sc.getReplyCode())) {throw new Exception("Transient SMTP error " + sc.getReply() + sc.getReplyString());} else if (SMTPReply.isNegativePermanent(sc.getReplyCode())) {throw new Exception("Permanent SMTP error " + sc.getReply() + sc.getReplyString());}

这里没有什么可添加的,当然,如果您使用自己的异常类,则可以优化异常处理。

带有Commons Net的SMTP身份验证和SSL

某些SMTP服务器配置为仅接受“ a到z SSL”:您必须在向服务器发出任何命令之前确保通信的安全; 通常使用的端口是465。

让我们以LaPoste.net示例(法语帖子提供的免费电子邮件帐户)为例:

public void sendEmail() throws Exception {  String hostname = "smtp.laposte.net";int port = 465;String password = "password";String login = "firstname.lastname";String from = login + "@laposte.net";String subject = "subject" ;String text = "message";// this is the important part : you tell your client to connect using SSL right awayAuthenticatingSMTPClient client = new AuthenticatingSMTPClient("TLS",true);try {String to = "anthony.dahanne@gmail.com";// optionally set a timeout to have a faster feedback on errorsclient.setDefaultTimeout(10 * 1000);client.connect(hostname, port);client.ehlo("localhost");client.auth(AuthenticatingSMTPClient.AUTH_METHOD.LOGIN, login, password);checkReply(client);client.setSender(from);checkReply(client);client.addRecipient(to);checkReply(client);Writer writer = client.sendMessageData();if (writer != null) {SimpleSMTPHeader header = new SimpleSMTPHeader(from, to, subject);writer.write(header.toString());writer.write(text);writer.close();if(!client.completePendingCommand()) {// failurethrow new Exception("Failure to send the email "+ client.getReply() + client.getReplyString());}} else {throw new Exception("Failure to send the email "+ client.getReply() + client.getReplyString());}} catch (Exception e) {throw e;} finally {client.logout();client.disconnect();}

我在这里没有重复checkReply()方法,因为两个代码段都相同。 您会注意到,立即使用SSL意味着您不必检查execTls()响应(实际上,如果这样做,它将无法正常工作)。

包起来

就是这样 如果要使这些示例在您的环境中工作,则可以将apache commons net 3.3 jar添加到您的类路径中

如果您使用的是Maven,请添加依赖项:

<dependency><groupid>commons-net</groupid><artifactid>commons-net</artifactid><version>3.3</version>
</dependency>

如果您将Gradle用于Android项目,则还可以使用以下build.gradle文件:

buildscript {repositories {mavenCentral()}dependencies {classpath 'com.android.tools.build:gradle:0.4.2'}
}
apply plugin: 'android'repositories {mavenCentral()
}dependencies {compile fileTree(dir: 'libs', include: '*.jar'), 'commons-net:commons-net:3.3'
}android {compileSdkVersion 17buildToolsVersion "17.0.0"sourceSets {main {manifest.srcFile 'AndroidManifest.xml'java.srcDirs = ['src']resources.srcDirs = ['src']aidl.srcDirs = ['src']renderscript.srcDirs = ['src']res.srcDirs = ['res']assets.srcDirs = ['assets']}instrumentTest.setRoot('tests')}
}

请享用 !

参考:使用Anthony Dahanne博客博客中的JCG合作伙伴 Anthony Dahanne 用Apache Commons Net SMTP用Java(和Android)发送邮件:STARTTLS,SSL 。

翻译自: https://www.javacodegeeks.com/2013/11/sending-a-mail-in-java-and-android-with-apache-commons-net-smtp-starttls-ssl.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/366574.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

列名无效

数据库增加新&#xff0c;视图没有更新转载于:https://www.cnblogs.com/Neil-Peng/p/9283355.html

天津天河计算机技术有限公司,“天河一号”超级计算机落户天津,命名为“天河”,取天津与“银河团队...

注意问题&#xff1a;一、对语句排序试题一般应注意以下几个问题&#xff1a;1.揣摩语段的整体意义&#xff0c;理清选项内容所提供的信息和表达内容的主旨。2.分析选项内容与整体语段的语境联系。3.进行对比分析&#xff0c;排除干扰项。该类试题几个选项在语句的数量或内容上…

tan和cot的梗_cot和tan的关系

各位家长好&#xff0c;我是51学霸(51xueba.cn)专栏作者&#xff0c;甜老师全文共计521字&#xff0c;建议阅读2分钟cot和tan的关联&#xff1a;tanαcotα1。在三角函数中&#xff0c;cotθcosθ/sinθ&#xff0c;当θ≠kπ&#xff0c;k∈Z时&#xff0c;cotθ1/tanθ&#…

基于 Webpack2、Vue2、iView2 的可视化脚手架 iView Cli 发布 2.0 版本

谷歌今天发布了一系列“性感”的软件&#xff0c;我们也发布了一款大家期待已久的开发者工具&#xff0c;同样很性感 &#xff1a;) iView 2.0 已经发布有两个月了&#xff0c;在 2.0 发布后&#xff0c;npm 下载量、issues 数量都提升了很多&#xff08;可以 watch 下项目&…

在OSGi中为Karaf构建Camel-CXF REST服务–组播和聚合

请查看我在Karaf的OSGi中构建普通CXF服务&#xff08;不使用Camel&#xff09;的其他文章 。 这是有关如何 创建一个CXF REST服务 使用骆驼多播&#xff08;并并行化&#xff09;传入的请求 来自两个不同服务的源数据 汇总响应并 最后将合并结果作为JSON返回给最终用户。…

Myeclipse debug时出现跳行问题的解决

1.删除Myeclipse中部署的类似的重复项目&#xff08;例如将测试项目中的代码包直接复制粘贴到另一个项目中&#xff09;。 2.project->clean 3.删除服务器中部署的项目并重新部署。 4.开启debug模式&#xff0c;问题解决。转载于:https://www.cnblogs.com/abortre/p/9999323…

2017计算机三级哪个好考,快速突破2017年计算机三级考试的几大复习阶段

原标题&#xff1a;快速突破2017年计算机三级考试的几大复习阶段为某种原因&#xff0c;本人共考过2次笔试&#xff0c;3次上机。其中笔试在70左右&#xff0c;3次上机均为满分&#xff0c;看着大批的同学在为三级发愁不知道如何准备和应考。我想我应该把经验和学习的方法写下来…

cgcs2000大地坐标系地图_为什么要从北京54和西安80统一到CGCS2000?测绘人必知!...

导 读北京54坐标和西安80坐标&#xff0c;使用了很多年&#xff0c;为何要统一成CGCS2000坐标&#xff1f;启用CGCS2000坐标有何重大意义&#xff1f;概述北京54坐标系和西安1980坐标系的建立极大的促进了新中国测绘的发展,然而随着空间大地测量技术的兴起,这两种经典的局部大地…

Amazon Elastic Map Reduce使用Apache Mahout计算建议

Apache Mahout是一个“可扩展的机器学习库”&#xff0c;其中包含各种单节点和分布式推荐算法的实现。 在我的上一篇博客文章中&#xff0c; 我描述了如何在单个节点上实现在线推荐系统来处理数据。 如果数据太大而无法放入内存&#xff08;> 100M首选项数据点&#xff09;怎…

基于element-ui实现table可配置化

写在前面 感谢 饿了么前端团队提供组件化框架elememt-ui&#xff0c;本文基础组件使用element-ui。 大背景 在开发一些系统过程中&#xff0c;使用table作数据展示在所难免。先来看看el-table组件。 非常简单易用的组件&#xff0c;根据提供的data数据&#xff0c;配置table…

一种思路,隐藏input标签,通过label关联

一种思路&#xff0c;隐藏input标签&#xff0c;通过label关联 <label class"btn btn-default btn-file">上传图片 <input hidden type"file" class"btn btn-default"></label>posted on 2018-07-09 16:59 .Tang 阅读(...)…

微信小程序 反编译

反编译处于技术学习角度&#xff0c;瞻仰大神代码。 使用工具 node mumu安卓模拟器获取小程序文件 小程序的代码压缩之后 会形成一个后缀为 wxapkg 的文件&#xff0c;下载到微信客户端打开mumu模拟器&#xff0c;安装微信登录之后&#xff0c;打开步步换小程序 &#xff0c;这…

麟龙指标通达信指标公式源码_通达信指标公式源码波段极限副图源码

做价值的传播者&#xff0c;一路同行&#xff0c;一起成长问题&#xff1a;怎样才能每天都收到这类文章&#xff01;答案&#xff1a;只需点击上方《通达信公式指标》{买卖公式}AA:(2*CHIGHLOW)/4;BB:AA-REF(C,12);CC:EMA(BB,13);DD:EMA(CC,2);EE:EMA(BB,34);FF:EMA(BB,55);GG:…

计算机系统备份的原则和策略,计算机系统数据备份机制与策略

计算机系统数据备份机制与策略20年第5 05期华中电力第 l卷 8计算机系统数据备份机制与策略耿煜(樊学院机械系&#xff0c;北襄樊襄湖 4 15 ) 4 03摘要&#xff1a;针对当今计算环境中不断增长的数据量&#xff0c;系统地分析、论述了完整的数据备份机制&#xff0c;出了相应的策…

用Java递增Map值的最有效方法–仅搜索一次键

这个问题可能被认为太基础了&#xff0c;但是在论坛上经常被问到。 在本文中&#xff0c;我将讨论一种仅在Map ONCE中搜索键的方法。 让我们首先来看一个例子。 假设我正在使用Map创建一个字符串频率列表&#xff0c;其中每个键是一个正在计数的String &#xff0c;值是一个In…

[译] 帮助你成为一名成功的 Web 开发工程师的 21 步

前言 随着 Web 开发的蓬勃发展&#xff0c;许多人都在问这样一个问题&#xff1a;我如何才能成为一名 Web 开发者&#xff1f;我认为这个问题不应该这样问&#xff0c;而应该是&#xff1a;我如何才能成为一名成功的 Web 开发者&#xff1f;这样的问题是很有必要的&#xff0c;…

小白_Unity引擎_Mathf

Ceil 1 //向上取值&#xff0c;向大取值 2 Debug.Log(Mathf.Ceil(0.1f)); //1 3 Debug.Log(Mathf.Ceil(0.9f));//1 4 Debug.Log(Mathf.Ceil(-0.1f));//0 5 Debug.Log(Mathf.Ceil(-0.9f));//0 Floor 1 //向下取值&#xff0c;向…

循环卷积和周期卷积的关系_基于单口RAM读写的卷积电路(下)

这是迟到很久的卷积电路verilog设计的下篇。。。你看我还有机会吗。。。上回我们给出系统的层次结构、卷积计算模块以及用于数据缓存的fifo模块&#xff0c;今天我们首先回顾一下上一次的关键内容。系统结构回顾RTL代码文件可以分为结构如下所示 ~|--top_conv_tb.v|--top_conv.…

浅析 PHP 中的 Generator

浅析 PHP 中的 Generator Miss Wang php开发案例 前天 何为 Generator 从 PHP 5.5 开始&#xff0c;PHP 加入了一个新的特性&#xff0c;那就是 Generator&#xff0c;中文译为生成器。生成器可以简单地用来实现对象的迭代&#xff0c;让我们先从官方的一个小例子说起。 xrange…

哈师大计算机等级考试,哈尔滨师范大学教务处

阳光高考网 小编整理分享http://jwc.hrbnu.edu.cn/哈尔滨师范大学教务处教务管理系统 哈尔滨师范大学教务平台 学校前身是1946年我党在东北解放区建立..点击查看http://jwc.hrbnu.edu.cn/哈尔滨师范大学教务处教务管理系统 重点支持建设的百所中西部高校之一。http://www.17xue…