关闭 x
IT技术网
    技 采 号
    ITJS.cn - 技术改变世界
    • 实用工具
    • 菜鸟教程
    IT采购网 中国存储网 科技号 CIO智库

    IT技术网

    IT采购网
    • 首页
    • 行业资讯
    • 系统运维
      • 操作系统
        • Windows
        • Linux
        • Mac OS
      • 数据库
        • MySQL
        • Oracle
        • SQL Server
      • 网站建设
    • 人工智能
    • 半导体芯片
    • 笔记本电脑
    • 智能手机
    • 智能汽车
    • 编程语言
    IT技术网 - ITJS.CN
    首页 » JAVA »JavaMail 保证邮件发送成功的方法整理

    JavaMail 保证邮件发送成功的方法整理

    2015-12-08 00:00:00 出处:developerworks
    分享

    使用过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)将邮件传送到目的地。

    上一篇返回首页 下一篇

    声明: 此文观点不代表本站立场;转载务必保留本文链接;版权疑问请联系我们。

    别人在看

    电脑屏幕不小心竖起来了?别慌,快捷键搞定

    Destoon 模板存放规则及语法参考

    Destoon系统常量与变量

    Destoon系统目录文件结构说明

    Destoon 系统安装指南

    Destoon会员公司主页模板风格添加方法

    Destoon 二次开发入门

    Microsoft 将于 2026 年 10 月终止对 Windows 11 SE 的支持

    Windows 11 存储感知如何设置?了解Windows 11 存储感知开启的好处

    Windows 11 24H2 更新灾难:系统升级了,SSD固态盘不见了...

    IT头条

    Synology 更新 ActiveProtect Manager 1.1 以增强企业网络弹性和合规性

    00:43

    新的 Rubrik Agent Cloud 加速了可信的企业 AI 代理部署

    00:34

    宇树科技 G1人形机器人,拉动一辆重达1.4吨的汽车

    00:21

    Cloudera 调查发现,96% 的企业已将 AI 集成到核心业务流程中,这表明 AI 已从竞争优势转变为强制性实践

    02:05

    投资者反对马斯克 1 万亿美元薪酬方案,要求重组特斯拉董事会

    01:18

    技术热点

    大型网站的 HTTPS 实践(三):基于协议和配置的优化

    ubuntu下右键菜单添加新建word、excel文档等快捷方式

    Sublime Text 简明教程

    用户定义SQL Server函数的描述

    怎么在windows 7开始菜单中添加下载选项?

    SQL Server 2016将有哪些功能改进?

      友情链接:
    • IT采购网
    • 科技号
    • 中国存储网
    • 存储网
    • 半导体联盟
    • 医疗软件网
    • 软件中国
    • ITbrand
    • 采购中国
    • CIO智库
    • 考研题库
    • 法务网
    • AI工具网
    • 电子芯片网
    • 安全库
    • 隐私保护
    • 版权申明
    • 联系我们
    IT技术网 版权所有 © 2020-2025,京ICP备14047533号-20,Power by OK设计网

    在上方输入关键词后,回车键 开始搜索。Esc键 取消该搜索窗口。