I want to send an email to a Non-ASCII email address and I am not sure what is the recommended procedure using JDK8.
How should I deal with the following email addresses?
Are there any security considerations to be aware of?
Would this sample code be enough?
import java.net.IDN;
public class IDNMailHelper {
public static String toIdnAddress(String mail) {
if (mail == null) {
return null;
}
int idx = mail.indexOf('@');
if (idx < 0) {
return mail;
}
return localPart(mail, idx) + "@" + IDN.toASCII(domain(mail, idx));
}
private static String localPart(String mail, int idx) {
return mail.substring(0, idx);
}
private static String domain(String mail, int idx) {
return mail.substring(idx + 1);
}
}
答案 0 :(得分:3)
如果您的服务器支持SMTPUTF8扩展名,Paweł基本上是正确的,地址应编码为UTF-8。 支持SMTPUTF8的是JavaMail 1.6版本。
要启用此支持,您需要设置JavaMail会话属性
mail.mime.allowutf8
到true
。确保仅在邮件时设置它
服务器支持UTF-8。
对于旧版本的JavaMail, 一种可能的解决方法是将Java Unicode字符串转换为UTF-8编码的字节数组,然后创建Java Unicode字符串,其中每个字节都是一个单独的iso-8859-1字符。我没试过这个,所以我不知道它是否会遇到其他问题。
例如:
address = new String(address.getBytes("utf-8"), "iso-8859-1");
答案 1 :(得分:2)
由于RFC6530,您实际上应该将电子邮件编码为UTF-8。这意味着你不应该在这里使用IDN 如果您的外发SMTP服务器支持EAI(国际化电子邮件),那应该不是问题。
请记住,EAI可能会带来严重的安全风险。如果您决定处理您的应用程序(服务?),请务必阻止用户注册类似的电子邮件地址,即使用不同脚本的电子邮件地址。例如,其中一个人应该被拒绝:
答案 2 :(得分:1)
对于电子邮件的标题,解决方法是RFC-2047,它定义了电子邮件中非ISO-646字符的特定编码协议。 Java Mail有一个使用它的类:MimeUtility。 Punicode / IDNS不适合使用标头。
正如此处的另一位回答者Bill Shannon在this answer中指出的那样,Java Mail通常会自动将MimeUtil应用于您的标题。至于关于干预邮件服务器的评论中的问题,我只回答你关于标题中文本的问题,没有什么会打扰的。至于实际将消息发送到正确位置所需的SMTP协议消息,我不会声称知道。