javamail发件时报错Client was not authenticated to send anonymous mail

本文详细解析了在使用JavaMail发送邮件时遇到的SMTP认证失败错误,提供了具体的代码示例和解决步骤,包括启用STARTTLS加密传输和使用PasswordAuthentication进行身份验证。

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

利用javamai发件时,报错如下:

com.sun.mail.smtp.SMTPSendFailedException: 530 5.7.57 SMTP; Client was not authenticated to send anonymous mail during MAIL FROM [HK2PR02CA0208.apcprd02.prod.outlook.com]

	at com.sun.mail.smtp.SMTPTransport.issueSendCommand(SMTPTransport.java:2267)
	at com.sun.mail.smtp.SMTPTransport.mailFrom(SMTPTransport.java:1758)
	at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:1257)
	at com.xhl.leads.leadsmail.sendmail.service.impl.SendMailServiceImpl.sendHtmlMailNoRecordCat(SendMailServiceImpl.java:425)
	at com.xhl.leads.leadsmail.sendmail.service.impl.SendMailServiceImpl$$FastClassBySpringCGLIB$$581c17fa.invoke(<generated>)
	at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:738)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
	at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:85)
	at com.xhl.leads.leadsmail.common.aspect.ControllerMethodExecutionLogAspect.catTransactionProcess(ControllerMethodExecutionLogAspect.java:61)
	at sun.reflect.GeneratedMethodAccessor154.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:629)
	at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:618)
	at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
	at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
	at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:673)
	at com.xhl.leads.leadsmail.sendmail.service.impl.SendMailServiceImpl$$EnhancerBySpringCGLIB$$6c128f52.sendHtmlMailNoRecordCat(<generated>)
	at com.xhl.leads.leadsmail.sendmail.controller.SendMailController$2.run(SendMailController.java:275)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)

解决办法:

1.添加props.setProperty("mail.smtp.starttls.enable","true");属性

2.连接session时,用PasswordAuthentication获取session实例。

Properties props = new Properties();
props.setProperty("mail.transport.protocol", "smtp");// "smtp"
props.setProperty("mail.smtp.host", host);// smtp.qq.com
props.setProperty("mail.smtp.port", port);// 465
props.setProperty("mail.smtp.auth", "true");// "true"
props.setProperty("mail.smtp.starttls.enable","true");
Session session = Session.getInstance(props, new javax.mail.Authenticator() {
		protected PasswordAuthentication getPasswordAuthentication() {
		                return new PasswordAuthentication(from, passWord);
		}
});

即:在应用中绑定邮箱时,勾选"STARTTLS加密传输"。

题外话,我试了用PasswordAuthentication去拿session实例,但是发现不是所有邮箱都能用PasswordAuthentication来获取session实例。所以我做了判断:如果用户勾选了"STARTTLS加密传输",我就用PasswordAuthentication来获取session,否则直接获取普通的session,即:session = Session.getDefaultInstance(props);

逻辑代码如下:

if("1".equals(mailAccount.getEncryptionTransmissionFlag())) {
	session = Session.getInstance(props, new javax.mail.Authenticator() {
		     protected PasswordAuthentication getPasswordAuthentication() {
		            return new PasswordAuthentication(from, passWord);
		     }
	});
}else {
	session = Session.getDefaultInstance(props);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值