JavaMail 保证邮件发送成功的方法总结

使用过JavaMail的api发送邮件的人可能会有这样一个疑惑:我如何知道我调用该api发送的邮件是否成功呢?一般的开放的api给我们调用都会有个返回值或者状态码,来告诉我们执行成功与否。但是JavaMail却没有提供这样一个返回值。

所以在调用JavaMail发送邮件的时候,我们只能通过catch异常的方式来判断邮件是否发送成功。我们认为只要没有异常发生,那么邮件就能发送成功。那么我们就来分析一下JavaMail为什么没有提供返回值,和通过异常判断邮件发送成功状态是否靠谱。

JavaMail发送邮件原理

在使用JavaMail进行发送邮件时,我们必须提供一个邮件会话。创建邮件会话的过程如下:

Properties props = new Properties();         // 发送邮件的服务器的IP和端口         props.put("mail.smtp.host", MAIL_SMTP_HOST);         props.put("mail.smtp.port", MAIL_SMTP_PORT);         // 是否需要身份验证         props.put("mail.smtp.auth", "true");          props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");         Session session = Session.getDefaultInstance(props, new Authenticator() {             protected PasswordAuthentication getPasswordAuthentication() {             // 登陆邮件发送服务器的用户名和密码                 return new PasswordAuthentication(MAIL_SENDER_MAIL, MAIL_SENDER_PASS);             }         });

分析一下代码。在创建Session之前我们先创建一个Properties,这个Properties设置了这样几个参 数:mail.smtp.host、mail.smtp.port、mail.smtp.auth和 mail.smtp.socketFactory.class。在创建Session的时候还要传入发送邮件使用的用户名及密码。

发送邮件代码如下:

//使用JavaMail发送邮件的5个步骤
        //1、创建session
         Session session = Session.getInstance(prop);
         //开启Session的debug模式,这样就可以查看到程序发送Email的运行状态
         session.setDebug(true);
         //2、通过session得到transport对象
         Transport ts = session.getTransport();
         //3、使用邮箱的用户名和密码连上邮件服务器,发送邮件时,发件人需要提交邮箱的用户名和密码给smtp服务器,用户名和密码都通过验证之后才能够正常发送邮件给收件人。
         ts.connect("smtp.sohu.com", "gacl", "邮箱密码");
         //4、创建邮件
         Message message = createSimpleMail(session);
         //5、发送邮件
         ts.sendMessage(message, message.getAllRecipients());
         //关闭连接
         ts.close();

总结发送邮件过程主要有以下几个步骤:

1.创建包含邮件服务器的网络链接的Session对象
2.创建代表邮件内容的Message对象
3.创建Transport对象
4.链接服务器
5.发送Message
6.关闭链接

由于Transport只是一个抽象类,所以这里在发送Message的时候用调用的方法ts.sendMessage实际上是调用的Transport的实现类SMTPTransport的sendMessage方法。

而SMTPTransport的sendMessage方法则依赖SMTP协议进行邮件的发送。

所以,当javamail使用smtp服务发送邮件时,当你把邮件发送到smtp服务器的时候,你只能得到已经发送到smtp的队列中的状态,但是邮件服务器是否能发送成功,你是得不到的。就是说,你不能保证邮件发送一定成功。 这就取决于SMTP协议的内容传输了。

但是SMTP协议如果传输失败,是会报错的。SMTP由TCP提供的可靠的数据传输服务把邮件消息从发信人的邮件服务器传送到收信人的邮件服务器。

所以我们可以认为当我们调用JavaMail发送邮件时,如果程序没有报错则表示邮件发送成功。

SMTP工作机制

SMTP通常有两种工作模式:发送SMTP和接收SMTP。

具体工作方式为:发送SMTP在接到用户的邮件请求后,判断此邮件是否为本地邮件,若是直接投送到用户的邮箱,否则向dns查询远端邮件服务器的 MX纪录,并建立与远端接收SMTP之间的一个双向传送通道,此后SMTP命令由发送SMTP发出,由接收SMTP接收,而应答则反方面传送。一旦传送通 道建立,SMTP发送者发送MAIL命令指明邮件发送者。如果SMTP接收者可以接收邮件则返回OK应答。SMTP发送者再发出RCPT命令确认邮件是否 接收到。如果SMTP接收者接收,则返回OK应答;如果不能接收到,则发出拒绝接收应答(但不中止整个邮件操作),双方将如此重复多次。当接收者收到全部 邮件后会接收到特别的序列,如果接收者成功处理了邮件,则返回OK应答即可。

SMTP工作过程

简单邮件传输协议(SMTP)是一种基于文本的电子邮件传输协议,是在因特网中用于在邮件服务器之间交换邮件的协议。SMTP是应用层的服务,可以适应于各种网络系统。

SMTP的命令和响应都是基于文本,以命令行为单位,换行符为CR/LF。响应信息一般只有一行,由一个3位数的代码开始,后面可附上很简短的文字说明。

SMTP要经过建立连接、传送邮件和释放连接3个阶段。具体为:

(1)建立TCP连接。
(2)客户端向服务器发送HELO命令以标识发件人自己的身份,然后客户端发送MAIL命令。
(3)服务器端以OK作为响应,表示准备接收。
(4)客户端发送RCPT命令。
(5)服务器端表示是否愿意为收件人接收邮件。
(6)协商结束,发送邮件,用命令DATA发送输入内容。
(7)结束此次发送,用QUIT命令退出。

SMTP服务器基于DNS中的邮件交换(MX)记录路由电子邮件。电子邮件系统发邮件时是根据收信人的地址后缀来定位邮件服务器的。SMTP通过用户代理程序(UA)完成邮件的编辑、收取和阅读等功能;通过邮件传输代理程序(MTA)将邮件传送到目的地。

车贴 http://www.biyinjishi.com/products/a35-b3570/
办公包装 http://www.biyinjishi.com/products/a50/
便签 http://www.biyinjishi.com/products/a50-b5010/
信纸 http://www.biyinjishi.com/products/a50-b5020/d100084/
信封 http://www.biyinjishi.com/products/a50-b5020/d100085/
纸杯 http://www.biyinjishi.com/products/a50-b5025/d100087/
杯垫 http://www.biyinjishi.com/products/a50-b5025/d100088/
联单 http://www.biyinjishi.com/products/a50-b5030/d100088
二联单 http://www.biyinjishi.com/products/a50-b5030/d100090/
三联单 http://www.biyinjishi.com/products/a50-b5030/d100091/
四联单 http://www.biyinjishi.com/products/a50-b5030/d100092/
五联单 http://www.biyinjishi.com/products/a50-b5030/d100093/
包装袋 http://www.biyinjishi.com/products/a50-b5050/d100093
包装盒 http://www.biyinjishi.com/products/a50-b5055/d100093
包装箱 http://www.biyinjishi.com/products/a50-b5060/d100093
工程图文 http://www.biyinjishi.com/products/a60/
大图打印 http://www.biyinjishi.com/products/a60-b6010/
图纸扫描 http://www.biyinjishi.com/products/a60-b6020/
打蓝图 http://www.biyinjishi.com/products/a60-b6030/
出硫酸图 http://www.biyinjishi.com/products/a60-b6035/
图纸装订 http://www.biyinjishi.com/products/a60-b6050/
个性印品 http://www.biyinjishi.com/products/a65/
照片打印 http://www.biyinjishi.com/products/a65-b6510/

时间: 2025-01-01 08:02:58

JavaMail 保证邮件发送成功的方法总结的相关文章

JavaMail如何保证邮件发送成功

使用过JavaMail的api发送邮件的人可能会有这样一个疑惑:我如何知道我调用该api发送的邮件是否成功呢?一般的开放的api给我们调用都会有个返回值或者状态码,来告诉我们执行成功与否.但是JavaMail却没有提供这样一个返回值. 所以在调用JavaMail发送邮件的时候,我们只能通过catch异常的方式来判断邮件是否发送成功.我们认为只要没有异常发生,那么邮件就能发送成功.那么我们就来分析一下JavaMail为什么没有提供返回值,和通过异常判断邮件发送成功状态是否靠谱. JavaMail发

基于javaMail的邮件发送--excel作为附件

基于JavaMail的Java邮件发送 Author [email protected] Desc 简单邮件发送 Date 2017/12/8 项目中需要根据物料资质的状况实时给用户发送邮件,然后我就简单学习了SMTP. 电子邮件的在网络中传输和网页一样需要遵从特定的协议,常用的电子邮件协议包括 SMTP,POP3,IMAP.其中邮件的创建和发送只需要用到 SMTP协议,所以本文也只会涉及到SMTP协议.SMTP 是 Simple Mail Transfer Protocol 的简称,即简单邮件

java带图片的邮件发送方法实现

package sendEmail; import java.util.Properties; import javax.activation.DataHandler; import javax.activation.FileDataSource; import javax.mail.Authenticator; import javax.mail.Message; import javax.mail.PasswordAuthentication; import javax.mail.Sessi

JavaMail 邮件发送之使用qq邮箱

所需jar包:comment-email.jar     mail.jaractivation.jar 一. 配置QQ邮箱的IMAP 进入qq电子邮件点击 设置->账户里开启 SMTP 服务(开启IMAP/SMTP服务)   注意:在启用QQ邮箱的14天之后才能开启此服务 开启之后会得到授权码,此授权码要记住或者保存到文本文件当中发送邮件的时候需要作为验证密码使用. 二.使用JavaMail发送一封简单邮件 的示例代码: public static void main(String[] args

spring各种邮件发送

参考地址一 参考地址二 Spring邮件抽象层的主要包为org.springframework.mail.它包括了发送电子邮件的主要接口MailSender,和值对象SimpleMailMessage,它封装了简单邮件的属性如from, to,cc,subject,text. 包里还包含一棵以MailException为根的checked Exception继承树,它们提供了对底层邮件系统异常的高级别抽象. 要获得关于邮件异常层次的更丰富的信息,请参考Javadocs. 为了使用JavaMail

深入分析JavaWeb Item42 -- JavaMail创建邮件和发送邮件

一.RFC882文档简单说明 RFC882文档规定了如何编写一封简单的邮件(纯文本邮件),一封简单的邮件包含邮件头和邮件体两个部分,邮件头和邮件体之间使用空行分隔. 邮件头包含的内容有: from字段 –用于指明发件人 to字段 –用于指明收件人 subject字段 –用于说明邮件主题 cc字段 – 抄送,将邮件发送给收件人的同时抄送给另一个收件人,收件人可以看到邮件抄送给了谁 bcc字段 – 密送,将邮件发送给收件人的同时将邮件秘密发送给另一个收件人,收件人无法看到邮件密送给了谁 邮件体指的就

James+Javamail构建邮件服务

James+Javamail构建邮件服务 本文描述如何使用James搭建具备一定邮件过滤.邮件操作功能的邮件服务器,以及使用Javamail实现对James服务器邮件的收发功能. 1 关于James与Javamail Apache James(Java Apache Mail Enterprise Server)是Apache组织的子项目之一,完全采用纯Java技术开发,实现了SMTP.POP3与NNTP等多种邮件相关协议.James是一个邮件应用平台,可以通过Mailet扩充其功能,如Mail

Spring Boot 2.0 图文教程 | 集成邮件发送功能

文章首发自个人微信公众号: 小哈学Java 个人网站: https://www.exception.site/springboot/spring-boots-send-mail 大家好,后续会间断地奉上一些 Spring Boot 2.x 相关的博文,包括 Spring Boot 2.x 教程和 Spring Boot 2.x 新特性教程相关,如 WebFlux 等.还有自定义 Starter 组件的进阶教程,比如:如何封装一个自定义图床 Starter 启动器(支持上传到服务器内部,阿里 OS

学习笔记之邮件发送篇

用脚本语言发送邮件是系统管理员必备技能 对系统定期检查或者当服务器受到攻击时生成文档和报表. 发布这些文档最快速有效的方法就是发送邮件. python中email模块使得处理邮件变得比较简单 发送邮件主要用到了smtplib和email两个模块,这里首先就两个模块进行一下简单的介绍: 本段摘录于    http://www.cnblogs.com/xiaowuyi/archive/2012/03/17/2404015.html 1.smtplib模块 smtplib.SMTP([host[, p