Spring JavaMailSender发送带点前缀的Gmail时出现认证失败如何解决?
问题描述
我在发送邮件时遇到异常:当收件人为example.ca@gmail.com这类@符号前缀包含.的邮箱时发送失败,但example@gmail.com这类无前缀点的邮箱可正常发送成功。
我使用Spring工具类和smtp.gmail.com配置进行邮件发送,相关实现代码如下:
// Prepare message using a Spring helper MimeMessage mimeMessage = javaMailSender.createMimeMessage(); try { MimeMessageHelper message = new MimeMessageHelper(mimeMessage, isMultipart, StandardCharsets.UTF_8.name()); message.setTo(to); message.setFrom(jHipsterProperties.getMail().getFrom()); message.setSubject(subject); message.setText(content, isHtml); javaMailSender.send(mimeMessage); log.debug("Sent email to User '{}'", to); } catch (MailException | MessagingException e) { log.warn("Email could not be sent to user '{}'", to, e); }
错误日志如下:
2021-08-31T04:06:27.416873+00:00 app[web.1]: 2021-08-31 04:06:27.416 WARN 4 --- [ travoxi-task-1] com.travoxi.service.MailService : Email could not be sent to user 'example.ca@gmail.com' 2021-08-31T04:06:27.416890+00:00 app[web.1]: 2021-08-31T04:06:27.416893+00:00 app[web.1]: org.springframework.mail.MailAuthenticationException: Authentication failed; nested exception is javax.mail.AuthenticationFailedException: 534-5.7.14 <https://accounts.google.com/signin/continue?sarp=1&scc=1&plt=AKgnsbv 2021-08-31T04:06:27.416894+00:00 app[web.1]: 534-5.7.14 qNoy6Lu4AF50xBC1hVOvMq5I5WERrCjcVtqcfyg5diaafRcCIxfAL0CTgx5Mf9FPT3o1z 2021-08-31T04:06:27.416894+00:00 app[web.1]: 534-5.7.14 ouQgv4Ywttz25NL7CwTx7It0n9Hycl4RsHvptxU48jLZLiH4amfxH1YBgFzKWnbW> 2021-08-31T04:06:27.416895+00:00 app[web.1]: 534-5.7.14 Please log in via your web browser and then try again. 2021-08-31T04:06:27.416896+00:00 app[web.1]: 534-5.7.14 Learn more at 2021-08-31T04:06:27.416896+00:00 app[web.1]: 534 5.7.14 https://support.google.com/mail/answer/78754 a185sm12790018qkg.128 - gsmtp 2021-08-31T04:06:27.416896+00:00 app[web.1]: 2021-08-31T04:06:27.416897+00:00 app[web.1]: at org.springframework.mail.javamail.JavaMailSenderImpl.doSend(JavaMailSenderImpl.java:440) 2021-08-31T04:06:27.416897+00:00 app[web.1]: at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:361) 2021-08-31T04:06:27.416897+00:00 app[web.1]: at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:356)
解决方案
首先要明确:这个报错和收件人邮箱前缀是否带点没有直接关联。Gmail本身对邮箱前缀的点是做忽略处理的,example.ca@gmail.com和exampleca@gmail.com会被识别为同一个邮箱,不会因为前缀带点就拒绝投递。你观察到的差异只是巧合,大概率是测试带点邮箱时刚好触发了Gmail的SMTP认证拦截。
错误日志里的534报错是典型的Gmail SMTP认证失败,可按以下步骤排查修复:
- 替换发件邮箱的认证方式:Gmail已经不再支持普通账号密码直接登录SMTP服务,你需要先为发件用的Gmail账号开启两步验证,之后生成专属的应用专用密码,把配置文件里的邮箱登录密码替换为这个应用专用密码即可。
- 解除登录拦截:你可以先通过浏览器登录发件用的Gmail账号,进入账号安全页,找到最近的异常登录拦截记录,确认是你自己的操作后放行,之后再重试发送邮件。
- 补充SMTP配置参数:可以在JavaMailSender的配置中添加以下参数,降低被识别为异常请求的概率:
Properties mailProps = javaMailSender.getJavaMailProperties(); mailProps.put("mail.smtp.auth", "true"); mailProps.put("mail.smtp.starttls.enable", "true"); mailProps.put("mail.smtp.ssl.trust", "smtp.gmail.com");
按照以上步骤调整后,无论收件人邮箱前缀是否带点,都可以正常发送。
内容的提问来源于stack exchange,提问作者Nam Tang
相关产品推荐
相关产品推荐

