JavaMail发送邮件 可能会踩的坑

本文介绍了使用JavaMail发送邮件时可能遇到的问题及解决方案,包括引入正确JAR包、处理163邮箱的授权问题以及应对554错误。强调了163邮箱的安全策略和建议使用QQ邮箱服务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在工作中需要用到使用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不在网易允许的发送地址列表里。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值