在使用ñ
字符时,我遇到了解析方法的问题:
essage.setRecipients(Message.RecipientType.TO, internetAddress.parse("somedir.withñchar@m ailserver.com",false));
我为strict参数传递false,但总是得到错误:
javax.mail.internet.AddressException: Local address contains control or whitespace in string ``somedir.with±har@mailserver.com''
at Mailer.main(Mailer.java:386)
Caused by: javax.mail.internet.AddressException: Local address contains control
or whitespace in string ``somedir.with±har@mailserver.com''
at javax.mail.internet.InternetAddress.checkAddress(InternetAddress.java
:1155)
at javax.mail.internet.InternetAddress.parse(InternetAddress.java:1044)
at javax.mail.internet.InternetAddress.parse(InternetAddress.java:575)
at Mailer.main(Mailer.java:377)
答案 0 :(得分:5)
如果您仍然遇到此问题,我建议您为您不寻常的电子邮件地址添加双引号,就像我一样。它对我有用,因为InternetAddress的checkAddress方法放弃验证引用的地址。这是简单快捷的解决方案。
示例:强>
unusual_email_without_at_sign_or_with_accentuátion (won't work)
"unusual_email_without_at_sign_or_with_accentuátion" (it works!)
完美而正确的解决方案是Java团队修复 InternetAddress类错误,即使在构造函数中接收“strict = false”,也会检查电子邮件语法,什么时候不应该。
错误示例:
InternetAddress i = new InternetAddress("unusual_email_without_at_sign_or_with_accentuátion ", false)
变通方法解决方案的示例:
InternetAddress i = new InternetAddress("\"unusual_email_without_at_sign_or_with_accentuátion\"", false)
创建扩展Address的新类的方法将不起作用,因为出于某种原因,Transport.send()似乎再次验证地址,并且还启动了异常。
请告诉我们是否有帮助!
答案 1 :(得分:3)
验证你的ñ实际是否为n-tilde。以下对我来说非常适合
InternetAddress[] list = InternetAddress.parse("fred.joñes@example.com", false);
for (InternetAddress a : list) {
System.out.println("[" + a + "]");
}
当用unicode转义符替换ñ时(在源.java文件中)
InternetAddress[] list = InternetAddress.parse("fred.jo\u00F1es@example.com", false);
您可以尝试将其替换为此测试。
编辑:BTW我也使用了解析(“...”)和地址而没有第二个参数,并且传递true
用于严格,两者都有效。
答案 2 :(得分:0)
也许你的文本编辑器没有将你的源文件保存为UTF8,而是保存为ASCII,所以你的nya搞砸了。确保将其保存为UTF8。当保存为UTF8时,编译.java文件时可能还需要编译选项。我有一段时间没有这样做,但我记得就是这样。
答案 3 :(得分:0)
JavaMail的地址解析器告诉你一些非常重要的事情:你只能在电子邮件地址的@
符号左侧使用普通的可打印ASCII字符。查看RFC {5}以获取ABNF for valid email addresses:
addr-spec = local-part "@" domain
local-part = dot-atom / quoted-string / obs-local-part
dot-atom = [CFWS] dot-atom-text [CFWS]
dot-atom-text = 1*atext *("." 1*atext)
atext = ALPHA / DIGIT / ; Printable US-ASCII
"!" / "#" / ; characters not including
"$" / "%" / ; specials. Used for atoms.
"&" / "'" /
"*" / "+" /
"-" / "/" /
"=" / "?" /
"^" / "_" /
"`" / "{" /
"|" / "}" /
"~"
quoted-string = [CFWS]
DQUOTE *([FWS] qcontent) [FWS] DQUOTE
[CFWS]
qcontent = qtext / quoted-pair
quoted-pair = ("\" (VCHAR / WSP)) / obs-qp
qtext = %d33 / ; Printable US-ASCII
%d35-91 / ; characters not including
%d93-126 / ; "\" or the quote character
obs-qtext
在继续之前,请确保地址正确无误。
答案 4 :(得分:0)
要将电子邮件发送到包含不可打印字符的地址(例如ñ),您必须使用UTF-8对电子邮件地址进行编码。
原始RFC 5322 Internet Message Format不允许使用重音字符。但是,自RFC 6532 (Internationalized Email Headers)提供了一种在电子邮件地址中使用国际字符的方法。
查看this StackOverflow question了解详情。
答案 5 :(得分:-1)
创建一个新类,扩展它并覆盖验证功能。但是我不明白为什么你会这么想。
public class invalidInternetAddress extends internetAddress {
@Override
private static void checkAddress() throws AddressException {
}
}