最近在工作中需要用到使用JAVA后台来给用户发送邮件,上网一搜,发现JAVA已经有好用的JAR包来实现JAVA发送邮件的功能,即:JavaMail.jar
第一步,引入对应的JAR包
下图是gradle引入JAR包的写法,目前最新版本就是1.5.6
compile("javax.mail:javax.mail-api:1.5.6") compile("com.sun.mail:javax.mail:1.5.6") |
maven,grape 的写法类似
在
http://mvnrepository.com/ 这个网站可以搜到对应的JAR包,和写法。
坑一:
大部分网上的文章 只说了需要引入第一个JAR包,即 javax.mail,实际使用中会发现,若只引入第一个包,会出现如下错误:
javax.mail.NoSuchProviderException: smtp |
引入第二个JAR包则可以解决。
实际上这里依赖了三个包,如果不使用依赖包管理,则可以直接把jar包放到项目中的lib文件下
下载地址
http://download.youkuaiyun.com/detail/sujingyu123/9723502
第二步,开发邮件功能:
这里我把我的代码放上来
import java.util.*; import javax.mail.*; import javax.mail.internet.*; public class Test { public static void main(String[] args) throws Exception { Properties props = new Properties(); props.setProperty("mail.smtp.ssl.enable", "true"); // 发送服务器需要身份验证 props.setProperty("mail.smtp.auth", "true"); // 设置邮件服务器主机名 props.setProperty("mail.host", "smtp.163.com"); props.setProperty("mail.smtp.port", "465"); // 发送邮件协议名称 props.setProperty("mail.transport.protocol", "smtp"); // 设置环境信息 Session session = Session.getDefaultInstance(props, new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication("test@163.com", "emailpassword"); } }); try { Message message = new MimeMessage(session); message.setFrom(new InternetAddress("test@163.com")); message.addRecipient(Message.RecipientType.TO, new InternetAddress("receivertest@163.com")); message.setSubject("subject"); message.setText("content"); Transport.send(message); } catch (Exception e) { e.printStackTrace(); } System.out.println("发送完毕!"); } } |
使用时修改 发件邮箱的帐号密码,以及收件人邮箱即可
第三步,发送邮件
直接运行第二步中写的测试文件。
坑二:报错
javax.mail.AuthenticationFailedException: 550 User has no permission |
用户未授权,应该是用户名密码错误,但是 可以直接在网页端登录邮箱。后来发现是网易的163邮箱出于安全考虑,在第三方客户端需要另外的密码登录。
解决办法:
1.登录163邮箱
2.在主菜单的设置菜单中,选择pop3/smtp/iamp二级子菜单。
3.点击左侧“客户端授权密码”,开启并设置客户端授权密码。并把这个密码作为javamail API发送邮件的认证密码。
坑三:报错
javaMail SMTPSendFailedException: 554 DT:SPM 163 smtp4 |
根据附录一,554错误为
发送的邮件内容包含了未被许可的信息,或被系统识别为垃圾邮件。请检查是否有用户发送病毒或者垃圾邮件;
然而一些邮箱可以发送,比如企业邮箱,163邮箱,有些QQ邮箱,另外一些QQ邮箱则不管什么内容都无法发送过去,返回554错误。因为 网易判定 是否是垃圾邮件的算法是不透明的,所以没办法具体去了解到底是怎样的邮件是违反了邮件规定,并且同样的邮件 可以向某些邮箱发送,某些不可以。如果一定需要163邮箱服务,必须去联系服务提供商,网易邮箱来解决这个问题。
PS:强烈建议使用QQ邮箱的邮箱服务来发送邮件,使用流程跟上面相同,只需要修改发件服务器和发件邮箱密码即可(同样需要第三方客户端授权码来登陆)。
附录一 网易邮箱错误说明:
•421 HL:REP 该IP发送行为异常,存在接收者大量不存在情况,被临时禁止连接。请检查是否有用户发送病毒或者垃圾邮件,并核对发送列表有效性; •421 HL:ICC 该IP同时并发连接数过大,超过了网易的限制,被临时禁止连接。请检查是否有用户发送病毒或者垃圾邮件,并降低IP并发连接数量; •421 HL:IFC 该IP短期内发送了大量信件,超过了网易的限制,被临时禁止连接。请检查是否有用户发送病毒或者垃圾邮件,并降低发送频率; •421 HL:MEP 该IP发送行为异常,存在大量伪造发送域域名行为,被临时禁止连接。请检查是否有用户发送病毒或者垃圾邮件,并使用真实有效的域名发送; •450 MI:CEL 发送方出现过多的错误指令。请检查发信程序; •450 MI:DMC 当前连接发送的邮件数量超出限制。请减少每次连接中投递的邮件数量; •450 MI:CCL 发送方发送超出正常的指令数量。请检查发信程序; •450 RP:DRC 当前连接发送的收件人数量超出限制。请控制每次连接投递的邮件数量; •450 RP:CCL 发送方发送超出正常的指令数量。请检查发信程序; •450 DT:RBL 发信IP位于一个或多个RBL里。请参考http://www.rbls.org/关于RBL的相关信息; •450 WM:BLI 该IP不在网易允许的发送地址列表里; •450 WM:BLU 此用户不在网易允许的发信用户列表里; •451 DT:SPM ,please try again 邮件正文带有垃圾邮件特征或发送环境缺乏规范性,被临时拒收。请保持邮件队列,两分钟后重投邮件。需调整邮件内容或优化发送环境; •451 Requested mail action not taken: too much fail authentication 登录失败次数过多,被临时禁止登录。请检查密码与帐号验证设置; •451 RP:CEL 发送方出现过多的错误指令。请检查发信程序; •451 MI:DMC 当前连接发送的邮件数量超出限制。请控制每次连接中投递的邮件数量; •451 MI:SFQ 发信人在15分钟内的发信数量超过限制,请控制发信频率; •451 RP:QRC 发信方短期内累计的收件人数量超过限制,该发件人被临时禁止发信。请降低该用户发信频率; •451 Requested action aborted: local error in processing 系统暂时出现故障,请稍后再次尝试发送; •500 Error: bad syntaxU 发送的smtp命令语法有误; •550 MI:NHD HELO命令不允许为空; •550 MI:IMF 发信人电子邮件地址不合规范。请参考http://www.rfc-editor.org/关于电子邮件规范的定义; •550 MI:SPF 发信IP未被发送域的SPF许可。请参考http://www.openspf.org/关于SPF规范的定义; •550 MI:DMA 该邮件未被发信域的DMARC许可。请参考http://dmarc.org/关于DMARC规范的定义; •550 MI:STC 发件人当天的连接数量超出了限定数量,当天不再接受该发件人的邮件。请控制连接次数; •550 RP:FRL 网易邮箱不开放匿名转发(Open relay); •550 RP:RCL 群发收件人数量超过了限额,请减少每封邮件的收件人数量; •550 RP:TRC 发件人当天内累计的收件人数量超过限制,当天不再接受该发件人的邮件。请降低该用户发信频率; •550 DT:SPM 邮件正文带有很多垃圾邮件特征或发送环境缺乏规范性。需调整邮件内容或优化发送环境; •550 Invalid User 请求的用户不存在; •550 User in blacklist 该用户不被允许给网易用户发信; •550 User suspended 请求的用户处于禁用或者冻结状态; •550 Requested mail action not taken: too much recipient 群发数量超过了限额; •552 Illegal Attachment 不允许发送该类型的附件,包括以.uu .pif .scr .mim .hqx .bhx .cmd .vbs .bat .com .vbe .vb .js .wsh等结尾的附件; •552 Requested mail action aborted: exceeded mailsize limit 发送的信件大小超过了网易邮箱允许接收的最大限制; •553 Requested action not taken: NULL sender is not allowed 不允许发件人为空,请使用真实发件人发送; •553 Requested action not taken: Local user only SMTP类型的机器只允许发信人是本站用户; •553 Requested action not taken: no smtp MX only MX类型的机器不允许发信人是本站用户; •553 authentication is required SMTP需要身份验证,请检查客户端设置; •554 DT:SPM 发送的邮件内容包含了未被许可的信息,或被系统识别为垃圾邮件。请检查是否有用户发送病毒或者垃圾邮件; •554 DT:SUM 信封发件人和信头发件人不匹配; •554 IP is rejected, smtp auth error limit exceed 该IP验证失败次数过多,被临时禁止连接。请检查验证信息设置; •554 HL:IHU 发信IP因发送垃圾邮件或存在异常的连接行为,被暂时挂起。请检测发信IP在历史上的发信情况和发信程序是否存在异常; •554 HL:IPB 该IP不在网易允许的发送地址列表里; •554 MI:STC 发件人当天内累计邮件数量超过限制,当天不再接受该发件人的投信。请降低发信频率; •554 MI:SPB 此用户不在网易允许的发信用户列表里; •554 IP in blacklist 该IP不在网易允许的发送地址列表里。 |