Javamail问题与邮件地址中的characters字符

时间:2011-01-05 19:53:17

标签: java javamail

在使用ñ字符时,我遇到了解析方法的问题:

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)

6 个答案:

答案 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 {
  }
}