如果密码包含@,则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安全选项以修复与身份验证相关的问题。
答案 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页是一个很好的起点。