ImapMailReceiver的不当行为

时间:2017-08-31 06:52:55

标签: spring spring-boot spring-integration imap

如果密码包含@,则ImapMailReceiver无法正确返回主机。

例如:

  

用户名:abc@gmail.com

     

密码:abc @ 123

     

host:imap.gmail.com

最终URI字符串

  

IMAP://abc@gmail.com:ABC @ 123 @ imap.gmail.com:993 /收件箱

然后,ImapMailReceiver将主机标识为123@imap.gmail.com

我检查了this线程,但我使用JavaConfig方式创建ImapMailReceiver,其中线程是关于XML配置方式。

有什么方法可以解决这个问题?

谢谢!

更新

带编码的最终URI字符串

  

IMAP://abc%40gmail.com:abc%40123@imap.gmail.com:993 /收件箱

在这种情况下,我收到了AuthenticationException。

可能以上信息可以帮助您了解问题。

更新1

以上是Gmail的问题。需要在Gmail中启用LESS SECURE APP安全选项以修复与身份验证相关的问题。

2 个答案:

答案 0 :(得分:1)

我在Office 365帐户中遇到了相同的问题,该帐户的用户名类似于“ your-user@your-company.com”,而主机名为“ outlook.office365.com”。如果不对用户名进行编码,则将“ your-company.com”用作主机,这将导致以下(有点误导)错误:

javax.mail.AuthenticationFailedException:连接失败,未指定密码吗?

使用mail.debug = true激活调试...

mailProps.put("mail.debug", "true");
receiver.setJavaMailProperties(mailProps);

...为我们提供了用于连接到邮件服务器的参数。

调试IMAPS:protocolConnect返回false,主机= your-company.com,用户=您的用户,密码=

为解决此问题,我使用URLEncoder.encode作为用户名和密码,例如:

...
new StringBuilder("imaps://")
   .append(URLEncoder.encode(mailSettings.getUser(), StandardCharsets.UTF_8.toString()))
   .append(":")
   .append(URLEncoder.encode(mailSettings.getPassword(), StandardCharsets.UTF_8.toString()))
...

答案 1 :(得分:0)

RFC 1738说:

Within the user and password field, any ":", "@", or "/" must be encoded.

我希望您已经知道URL编码的工作原理。如果您想要复习,那么同一文档的第18页是一个很好的起点。