javax.mail.MessagingException: 530 5.7.0 Must issue a STARTTLS command first

本文介绍了一种常见的Java邮件发送失败的问题,即遇到 javax.mail.MessagingException 异常,提示必须先发出 STARTTLS 命令。文章提供了针对 Gmail SMTP 服务器的配置解决方案,通过设置 SSL 相关属性来启用安全连接。
javax.mail.MessagingException: 530 5.7.0 Must issue a STARTTLS command first. u12sm73042tia.38

    at com.sun.mail.smtp.SMTPTransport.issueCommand(SMTPTransport.java:
879)
    at com.sun.mail.smtp.SMTPTransport.mailFrom(SMTPTransport.java:
599)
    at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:
319)
    at com.roadway.edmail.util.JMail2.sendMail(JMail2.java:
278)
    at com.roadway.edmail.bo.feedback.FeedbackSender.sender(FeedbackSender.java:
72)
    at org.apache.jsp.test_jsp._jspService(test_jsp.java:
59)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:
70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:
717)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:
374)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:
342)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:
267)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:
717)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:
290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:
206)
    at com.roadway.edmail.util.CharacterEncodingFilter.doFilter(CharacterEncodingFilter.java:
20)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:
235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:
206)
    at org.tuckey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.java:
164)
    at org.tuckey.web.filters.urlrewrite.RuleChain.doRules(RuleChain.java:
141)
    at org.tuckey.web.filters.urlrewrite.UrlRewriter.processRequest(UrlRewriter.java:
90)
    at org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:
417)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:
235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:
206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:
233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:
191)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:
128)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:
102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:
109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:
286)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:
845)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:
583)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:
447)
    at java.lang.Thread.run(Thread.java:
619)

解决方法:
if(this.smtp.indexOf("smtp.gmail.com")>=0)
            
{
                properties.setProperty(
"mail.smtp.socketFactory.class""javax.net.ssl.SSLSocketFactory"); 
                properties.setProperty(
"mail.smtp.socketFactory.fallback""false"); 
                properties.setProperty(
"mail.smtp.port""465"); 
                properties.setProperty(
"mail.smtp.socketFactory.port""465"); 
            }

在此作下符号,希望对自己加强记忆,对同行的朋友提供方便.^_^
在处理 Java 邮件发送过程中出现的 `javax.mail.AuthenticationFailedException` 和 `MessagingException: reading response` 问题时,通常需要从身份验证、网络连接、SSL/TLS 配置等多个方面进行排查。 ### 身份验证失败 (`AuthenticationFailedException`) 此异常表示邮件服务器拒绝了提供的凭据。常见原因包括用户名或密码错误、未启用 IMAP/SMTP 服务(特别是使用 Gmail 等第三方邮箱时)以及两步验证导致的应用专用密码需求。 解决方案包括: - **检查用户名和密码**:确保输入的用户名和密码正确无误。 - **启用 SMTP/IMAP 服务**:对于 Gmail、Outlook 等邮箱服务,需在账户设置中手动启用 IMAP 或 SMTP 服务。 - **使用应用专用密码**:如果启用了两步验证,应使用生成的应用专用密码而非主密码[^1]。 ### 消息异常读取响应 (`MessagingException: reading response`) 该异常通常与网络连接问题或 SSL/TLS 握手失败有关。可能的原因包括防火墙拦截、代理配置不当、SSL 证书不受信任等。 解决方法包括: - **检查网络连接**:确保可以访问邮件服务器的端口(如 GmailSMTP 使用 465587 端口)。 - **配置 SSL/TLS 设置**:根据邮件服务器要求正确设置 SSL 或 TLS 模式。例如,GmailSMTP 通常使用 SSL 加密[^2]。 - **禁用 SSL 验证(仅限测试环境)**:在开发环境中,可临时跳过 SSL 证书验证以排除证书问题。但此操作不应在生产环境中使用。 示例代码如下,展示了如何配置 `JavaMailSender` 并处理相关异常: ```java import org.springframework.mail.javamail.JavaMailSenderImpl; import javax.mail.MessagingException; import java.util.Properties; public class EmailService { public void sendEmail() { JavaMailSenderImpl mailSender = new JavaMailSenderImpl(); mailSender.setHost("smtp.gmail.com"); mailSender.setPort(587); mailSender.setUsername("your-email@gmail.com"); mailSender.setPassword("your-password"); Properties props = new Properties(); props.put("mail.smtp.auth", "true"); props.put("mail.smtp.starttls.enable", "true"); // 启用 STARTTLS props.put("mail.smtp.host", "smtp.gmail.com"); props.put("mail.smtp.port", "587"); mailSender.setJavaMailProperties(props); try { // 发送邮件逻辑 // SimpleMailMessage message = new SimpleMailMessage(); // message.setTo("recipient@example.com"); // message.setSubject("Test Subject"); // message.setText("This is the email body."); // mailSender.send(message); } catch (Exception e) { if (e instanceof MessagingException && e.getMessage().contains("reading response")) { System.err.println("MessagingException: Failed to read response from server. Check network and SSL settings."); } else if (e instanceof javax.mail.AuthenticationFailedException) { System.err.println("Authentication failed. Please check your credentials and account settings."); } else { e.printStackTrace(); } } } } ``` ### 常见调试建议 - **日志输出**:启用 JavaMail 的调试模式以查看详细的通信过程,有助于定位问题。 ```java props.put("mail.debug", "true"); ``` - **测试网络连通性**:使用 `telnet smtp.gmail.com 587` 测试是否能够连接到邮件服务器。 - **更新依赖库**:确保使用的 `javax.mail` 或 `jakarta.mail` 库为最新版本,避免已知缺陷影响功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值