以前我们使用JavaMail发送邮件,步骤挺多的。现在的项目跟Spring整合的比较多。所以这里主要谈谈SpringMail发送。
1.导入jar包
如果是Maven项目,Maven地址如下:
org.springframework
spring-context-support
4.2.6.RELEASE
javax.mail
mail
1.4.5
2.配置applicationContext-email.xml(以QQ邮箱发送邮件为例)
//
true
true
25000
1.主机的配置
个人邮箱使用的主机是:
企业邮箱使用的主机是:
2.qq邮箱的授权码
关于qq邮箱的授权码,如果是企业邮箱,则使用登录密码,否则要去获取授权码,要不然会报异常
Exception in thread "main" org.springframework.mail.MailAuthenticationException: Authentication failed; nested exception is javax.mail.AuthenticationFailedException
当然,我们可以使用163邮箱发送,步骤也是一样(主机host的配置为smtp.163.com),要去申请授权码,只是有点奇怪的是,163发送会被当成垃圾邮箱处理。所以这里建议不要使用163邮箱发送邮件。
1.javax.mail.MessagingException: Could not connect to SMTP host: smtp.qq.com, port: 25;
qq邮箱使用的是smtp协议,首先需求检查发件人的邮箱的POP3/SMTP服务是否开启,若未开启,需要到设置—账户中开启:
一般发送邮件的服务器端口号为25,关于SSL协议以及端口号可以参考下面的一篇博客:
https://blog.csdn.net/a2279860a/article/details/59012885
若要修改默认端口号,可进行如下配置:
若使用的是Java代码进行的配置,可进行如下修改:
transport.connect("smtp.qq.com",465, username, password);
2.javax.mail.MessagingException: 503 Error: need EHLO and AUTH first !
503错误。因为smtp服务器需要授权。在spring的配置中加入
或者:
JavaMailSenderImpl sender = new JavaMailSenderImpl();
Properties javaMailProp = new Properties();
javaMailProp.setProperty("mail.smtp.auth", "true");
sender.setJavaMailProperties(javaMailProp);
3.Failed messages: javax.mail.MessagingException: Exception reading response/Connection timed out
异常读取响应/连接超时
解决办法:配置timeout
或者:
4.org.springframework.mail.MailAuthenticationException: Authentication failed
授权失败,可能原因:
1.qq邮箱
上述POP3/SMTP服务未开启,若已开启,还需要将上述授权码复制粘贴到smtp.mail.username处,如:
2.163邮箱
出现这个问题的原因可能是,所配的发送邮箱,有没有对外开放POP3/SMTP服务
解决的方法:(此处使用到是163邮箱,以下是163邮箱 手动设置开启POP3/SMTP服务,其他邮箱需要自行百度)
5.Could not connect to SMTP host: smtp.***.com, port: 465, response: -1
原因:465端口是为SMTPS(SMTP-over-SSL)协议服务开放的,这是SMTP协议基于SSL安全协议之上的一种变种协议。
解决方法:
修改配置文件
或加上如下代码:
props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
25端口(SMTP):25端口为SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)服务所开放的,是用于发送邮件。
如今绝大多数邮件服务器都使用该协议。当你给别人发送邮件时,你的机器的某个动态端口(大于1024)就会与邮件服务器的25号端口建立一个连接,你发送的邮件就会通过这个连接传送到邮件服务器上,保存起来。
109端口(POP2):109端口是为POP2(Post Office Protocol Version 2,邮局协议2)服务开放的,是用于接收邮件的。
110端口(POP3):110端口是为POP3(Post Office Protocol Version 3,邮局协议3)服务开放的,是用于接收邮件的。
143端口(IMAP):143端口是为IMAP(INTERNET MESSAGE ACCESS PROTOCOL)服务开放的,是用于接收邮件的。
目前POP3使用的比POP2广得多,POP2几乎被淘汰,也有某些服务器同时支持POP2和POP3协议。客户端可以使用POP3协议来访问服务端的邮件服务,如今ISP的绝大多数邮件服务器都是使用POP3协议(极少用POP2协议)。在使用邮件客户端程序的时候,会要求输入POP3服务器地址,默认情况下使用的就是110端口。当你用邮件客户端(比如、Thunderbird、foxmail、MS Outlook Express以及各类邮件精灵)登录时,你的机器就会自动用机器的某一个动态端口(大于1024)连接邮件服务器的110端口,服务器就把别人给你发的邮件(之前保存在邮件服务器上),发送到你机器,这样你就可以看到你客户端工具上的收件箱里的新邮件了。
IMAP协议,和POP3协议一样是用来接收邮件的,但是它有它的特别和新颖之处,它是面向用户的,它和POP3协议的主要区别是:用户可以不用把所有的邮件内容全部下载,而是只下载邮件标题和发件人等基本信息,用户可以由标题等基本信息,去决定是否下载邮件全文,用户可以通过客户端的浏览器直接对服务器上的邮件进行操作(比如:打开阅读全文、丢进垃圾箱、永久删除、整理到某文件夹下、归档、)。再简单来说就是:浏览器用的IMAP协议(143端口)来为你接收邮件以及让你很方便的操作服务器上的邮件。邮件客户端用的POP3协议(110端口)来为你接收邮件的全部信息和全文内容保存到你的本地机器成为一个副本,你对邮件客户端上的副本邮件的任何操作都是在副本上,不干涉邮件服务器上为你保存的邮件原本。
上面介绍的SMTP协议、POP2协议、POP3协议、IMAP协议都是不安全的协议。因考虑到网络安全的因素,下面给你介绍基于SSL(Secure Sockets Layer 安全套接层)协议的安全的邮件收发协议。你的邮件在传输过程中可能被网络黑客截取邮件内容,如果你的邮件机密性非常强,不想被收件人以外的任何人和任何黑客截取,或者是涉及国家机密安全的,等等。那么你的邮件就不该使用上述的三种协议进行收发。
若你采用SMTP协议发邮件,那么你发出的邮件从你的机器传到服务器的过程中,可能被黑客截取从而泄露。****若你采用POP2或者POP3协议收取邮件,那么你的邮件从服务器传至你当前机器的过程可能被黑客截取从而泄露。
465端口(SMTPS):465端口是为SMTPS(SMTP-over-SSL)协议服务开放的,这是SMTP协议基于SSL安全协议之上的一种变种协议,它继承了SSL安全协议的非对称加密的高度安全可靠性,可防止邮件泄露。SMTPS和SMTP协议一样,也是用来发送邮件的,只是更安全些,防止邮件被黑客截取泄露,还可实现邮件发送者抗抵赖功能。防止发送者发送之后删除已发邮件,拒不承认发送过这样一份邮件。
995端口(POP3S):995端口是为POP3S(POP3-over-SSL)协议服务开放的,这是POP3协议基于SSL安全协议之上的一种变种协议,它继承了SSL安全协议的非对称加密的高度安全可靠性,可防止邮件泄露。POP3S和POP3协议一样,也是用来接收邮件的,只是更安全些,防止邮件被黑客截取泄露,还可实现邮件接收方抗抵赖功能。防止收件者收件之后删除已收邮件,拒不承认收到过这样一封邮件。
993端口(IMAPS):993端口是为IMAPS(IMAP-over-SSL)协议服务开放的,这是IMAP协议基于SSL安全协议之上的一种变种协议,它继承了SSL安全协议的非对称加密的高度安全可靠性,可防止邮件泄露。IMAPS和IMAP协议一样,也是用来接收邮件的,只是更安全些,防止邮件被黑客截取泄露,还可实现邮件接收方抗抵赖功能。防止收件者收件之后删除已收邮件,拒不承认收到过这样一封邮件。
以上即是我对Spring Mail以及Java Mail发送邮件的总结,若有错误和补充请及时提出,未完待续……