【发布时间】:2011-09-16 08:41:20
【问题描述】:
我花了几天时间弄清楚如何通过 JNDIwith authentication 在 Tomcat 中配置 javax.mail.Session,现在我明白了,但只是在深入研究代码之后。
这次我见过最糟糕的代码:javax.mail.Service#connect(String,String,String,String) Version 1.4.1
if (user == null) {
user = url.getUsername();
if (password == null) // get password too if we need it
password = url.getPassword();
} else {
if (password == null && user.equals(url.getUsername()))
// only get the password if it matches the username
password = url.getPassword();
}
什么时候分配密码?为什么要对 null 进行两次检查? – 然后意识到 else 不属于上面的 if。 (这是原始缩进)。回到主题。
至少我发现正确的资源定义是:
<Resource name="email/session"
type="javax.mail.Session"
auth="Container"
password="secret"
mail.debug="false"
mail.transport.protocol="smtp"
mail.smtp.auth="true"
mail.smtp.user="testi"
mail.smtp.host="smtp.xxx.org"
mail.smtp.from="test@example.com"
/>
注意它是“password”和“mail.smtp.user”或“mail.user”,而不是“mail.smtp.password”或“user”。
至少魔法是在 Tomcats org.apache.naming.factory.MailSessionFactory 中完成的。如果属性 password 和属性 mail.smtp.user 或 mail.user 退出,则该工厂将 javax.mail.Authenticator 添加到邮件会话。
现在我的问题是所有这些东西的文档在哪里。特别是关于用户名和密码的配置?
顺便说一句:我解释得更详细一点,以帮助其他有同样问题的人。
【问题讨论】:
-
issues.apache.org/bugzilla/show_bug.cgi?id=53665 2012 年 8 月报告了一个问题
-
我想说最后的“else”应该被删除。大多数情况下,这种事情是由于代码在很长一段时间内演变而来的。
标签: java tomcat jndi jakarta-mail