当前位置: 首页 > 科技观察

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

时间:2023-03-12 16:29:52 科技观察

用过JavaMail的api发送邮件的人可能会有这样的疑问:我怎么知道调用这个api发送的邮件是否成功?一般的开放API都会有一个返回值或者状态码供我们调用,告诉我们执行是否成功。但是JavaMail不提供这样的返回值。所以在调用JavaMail发送邮件时,只能通过捕获异常来判断邮件是否发送成功。我们相信只要没有异常,邮件就可以发送成功。那么我们来分析下JavaMail为什么不提供返回值,通过异常来判断邮件发送状态是否成功靠谱。JavaMail发送邮件的原理在使用JavaMail发送邮件时,我们必须提供一个邮件会话。创建邮件会话的过程如下:Propertiesprops=newProperties();//发送邮件的服务器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");Sessionsession=Session.getDefaultInstance(props,newAuthenticator(){protectedPasswordAuthenticationgetPasswordAuthentication(){//登录发送邮件服务器的用户名和密码returnnewPasswordAuthentication(MAIL_SENDER_MAIL,MAIL_SENDER_PASS);}});分析代码。在创建Session之前,我们先创建一个Properties,里面设置了几个参数:mail.smtp.host、mail.smtp.port、mail.smtp.auth和mail.smtp.socketFactory.class。创建Session时,还必须传入用于发送邮件的用户名和密码。发送邮件的代码如下://5stepstosendemailsusingJavaMail//1.创建会话Sessionsession=Session.getInstance(prop);//开启Session的调试模式,可以查看发送Email的程序运行状态session.setDebug(true);//2。通过会话获取传输对象Transportts=session.getTransport();//3。使用邮箱的用户名和密码连接邮件服务器。发送邮件时,发件人需要提交邮箱发送用户名和密码到smtp服务器。用户名和密码验证通过后,邮件就可以正常发送给收件人了。ts.connect("smtp.sohu.com","gacl","邮箱密码");//4。创建邮件Messagemessage=createSimpleMail(session);//5。发送邮件ts.sendMessage(message,message.getAllRecipients());//关闭连接ts.close();用以下步骤总结发送邮件的过程:1.创建一个包含到邮件服务器的网络链接的Session对象2.创建一个表示邮件内容的Message对象3.创建Transport对象4.链接到服务器5.发送消息6.关闭链接由于Transport只是一个抽象类,所以这里调用的方法ts.sendMessage实际上是发送Message时调用的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)是一种基于文本的电子邮件传输协议,用于Internet中邮件服务器之间的邮件交换。SMTP是应用层服务,可以适配各种网络系统。SMTP命令和响应都是基于文本的,以命令行为单位,换行符为CR/LF。响应信息一般只有一行,以3位代码开头,后面是很短的文字说明。SMTP要经过三个阶段:建立连接、发送邮件、释放连接。具体为:(1)建立TCP连接。(2)客户端向服务器发送HELO命令,识别发送者自己的身份,然后客户端发送MAIL命令。(3)服务器响应OK,表示准备接收。(4)客户端发送RCPT命令。(5)服务器端表示是否愿意为收件人接收邮件。(6)协商结束后,发送邮件,使用命令DATA发送输入内容。(7)要结束本次传输,请使用QUIT命令退出。SMTP服务器根据DNS中的邮件交换(MX)记录路由电子邮件。邮件系统在发送邮件时,根据收件人的地址后缀定位邮件服务器。SMTP通过用户代理程序(UA)完成邮件的编辑、接收、阅读等功能;并通过邮件传输代理程序(MTA)将邮件传送到目的地。