关闭 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)将邮件传送到目的地。

    上一篇返回首页 下一篇

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

    别人在看

    抖音安全与信任开放日:揭秘推荐算法,告别单一标签依赖

    ultraedit编辑器打开文件时,总是提示是否转换为DOS格式,如何关闭?

    Cornell大神Kleinberg的经典教材《算法设计》是最好入门的算法教材

    从 Microsoft 下载中心安装 Windows 7 SP1 和 Windows Server 2008 R2 SP1 之前要执行的步骤

    Llama 2基于UCloud UK8S的创新应用

    火山引擎DataTester:如何使用A/B测试优化全域营销效果

    腾讯云、移动云继阿里云降价后宣布大幅度降价

    字节跳动数据平台论文被ICDE2023国际顶会收录,将通过火山引擎开放相关成果

    这个话题被围观超10000次,火山引擎VeDI如此解答

    误删库怎么办?火山引擎DataLeap“3招”守护数据安全

    IT头条

    平替CUDA!摩尔线程发布MUSA 4性能分析工具

    00:43

    三起案件揭开侵犯个人信息犯罪的黑灰产业链

    13:59

    百度三年开放2.1万实习岗,全力培育AI领域未来领袖

    00:36

    工信部:一季度,电信业务总量同比增长7.7%,业务收入累计完成4469亿元

    23:42

    Gartner:2024年全球半导体营收6559亿美元,AI助力英伟达首登榜首

    18:04

    技术热点

    iOS 8 中如何集成 Touch ID 功能

    windows7系统中鼠标滑轮键(中键)的快捷应用

    MySQL数据库的23个特别注意的安全事项

    Kruskal 最小生成树算法

    Ubuntu 14.10上安装新的字体图文教程

    Ubuntu14更新后无法进入系统卡在光标界面解怎么办?

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

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