Java 邮件发件人在 354 状态后退出

标签 java spring-boot jakarta-mail

我正在尝试使用 JavaMailSenderImpl 发送邮件。 下面是程序和输出显示没有错误,但仍然没有发送邮件。

邮件配置:

@Configuration 
public class MailConfig {

    @Autowired
    private Environment env;

    @Bean
    public JavaMailSender javaMailService() {

        JavaMailSenderImpl mailSender = new JavaMailSenderImpl();

        mailSender.setHost(env.getProperty("spring.mail.host"));
        mailSender.setUsername(env.getProperty("spring.mail.username"));
        mailSender.setPassword(env.getProperty("spring.mail.password"));

        Properties javaMailProperties = new Properties();
        javaMailProperties.put("mail.smtp.ssl.enable", "true");
        javaMailProperties.put("mail.smtp.starttls.enable", "false");
        javaMailProperties.put("mail.smtp.auth", "true");
        javaMailProperties.put("mail.transport.protocol", "smtp");
        javaMailProperties.put("mail.debug", "true");
        javaMailProperties.put("mail.smtp.ssl.checkserveridentity", "true");
        javaMailProperties.put("mail.smtp.socketFactory.port", "465");

        mailSender.setJavaMailProperties(javaMailProperties);

        return mailSender;
    }
}
    @GetMapping("/user/resetPassword/{email}")
    public GenericResponse resetPassword(HttpServletRequest request, 
      @PathVariable("email") String userEmail) throws UserNotFoundException {
        User user = userRepository.findByEmail(userEmail);
        if (user == null) {
            throw new UserNotFoundException("USER NOT FOUND");
        }
        try {
        String token = UUID.randomUUID().toString();
        createPasswordResetTokenForUser(user, token);
        mailSender.send(constructResetTokenEmail("http://localhost:7005", token, user));
        }
        catch(Exception ex) {
            ex.printStackTrace();
        }
        return new GenericResponse("message.resetPasswordEmail");
    }

    public void createPasswordResetTokenForUser(User user, String token) {
        PasswordResetToken myToken = new PasswordResetToken(token, user);

        passwordTokenRepository.save(myToken);
    }

    private SimpleMailMessage constructResetTokenEmail(
              String contextPath, String token, User user) {
                String url = contextPath + "/user/changePassword?token=" + token;
                String message = "message.resetPassword";
                return constructEmail("Reset Password", message + " \r\n" + url, user);
    }

    private SimpleMailMessage constructEmail(String subject, String body,
            User user) {
        SimpleMailMessage email = new SimpleMailMessage();
        email.setSubject(subject);
        email.setText(body);
        email.setTo("rec@gmail.com");
        email.setFrom("sender@gmail.com");
        return email;
    }

}

这是代码的输出:

DEBUG SMTP: Found extension "SIZE", arg "35882577"
DEBUG SMTP: Found extension "8BITMIME", arg ""
DEBUG SMTP: Found extension "AUTH", arg "LOGIN PLAIN XOAUTH2 PLAIN-CLIENTTOKEN OAUTHBEARER XOAUTH"
DEBUG SMTP: Found extension "ENHANCEDSTATUSCODES", arg ""
DEBUG SMTP: Found extension "PIPELINING", arg ""
DEBUG SMTP: Found extension "CHUNKING", arg ""
DEBUG SMTP: Found extension "SMTPUTF8", arg ""
DEBUG SMTP: Attempt to authenticate using mechanisms: LOGIN PLAIN DIGEST-MD5 NTLM XOAUTH2 
DEBUG SMTP: Using mechanism LOGIN
DEBUG SMTP: AUTH LOGIN command trace suppressed
DEBUG SMTP: AUTH LOGIN succeeded
DEBUG SMTP: use8bit false
MAIL FROM:<sender@gmail.com>
250 2.1.0 OK u5sm8797330pfu.198 - gsmtp
RCPT TO:<rec@gmail.com>
250 2.1.5 OK u5sm8797330pfu.198 - gsmtp
DEBUG SMTP: Verified Addresses
DEBUG SMTP:   sender@gmail.com
DATA
354  Go ahead u5sm8797330pfu.198 - gsmtp
QUIT

最佳答案

遇到同样的问题,我试图找出解决问题的方法。

完整错误:

与SMTP服务器拨号时,在RCPT TO命令后,javax.mail发送DATA。 服务器响应 354+ 自定义消息。

似乎在某些平台(linux 是唯一一个对我开发的软件有影响的平台)上有一些特定的消息(失败的消息在里面有双引号)javax.mail lib 只是发送 QUIT。

因为服务器正在等待邮件后跟:


.

服务器只是等待其他内容,从不回答。 javax.mail 因超时而失败。

根本原因

这是一个依赖收敛问题:

  • 我们使用 javax.mail-api 1.6.2
  • 我们使用 apache-commons.commons-mail 1.5
    • apache-commons.commons-mail 依赖于 javax.mail-api 1.5.6(即使兼容 1.6.2)

修复

由于嵌入的某些功能,我们需要 1.6.2。

解决方案是排除传递依赖并在 1.6.2 版本中明确包含 com.sun.mail:javax.mail。

关于Java 邮件发件人在 354 状态后退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61869257/

相关文章:

Java 泛型,<C> 是否等于 <T>?

java - 无法使用 JavaMail 使用 Java 下载 PDF 附件

java - JVM 命令启动选项重复

Java作为dd的前端将iso复制到USB

java - JPA EclipseLink 与 @TableGenerator。为什么事务回滚后id赋的值不为空?

Spring Boot Whitelabel 错误页面几乎无处不在

java - 尝试从 Spring 获取图像

java - 测试时使用数据源的 Spring Boot

javax.mail - 强制 IMAP 使用 TLS1.2+ - "Received fatal alert: protocol_version"

java - 如何使用 Apache Camel + SSL 接收电子邮件?