Java:将电子邮件发送到非ASCII电子邮件地址
我想向非ASCII电子邮件地址发送电子邮件,但我不确定使用JDK8的建议步骤 我应该如何处理以下电子邮件地址Java:将电子邮件发送到非ASCII电子邮件地址,java,email,internationalization,java-8,jakarta-mail,Java,Email,Internationalization,Java 8,Jakarta Mail,我想向非ASCII电子邮件地址发送电子邮件,但我不确定使用JDK8的建议步骤 我应该如何处理以下电子邮件地址 德奥rte@example.com test@S奥伦森·德 德奥rte@S奥伦森·德 是否有任何安全注意事项需要注意 这个示例代码足够了吗 import java.net.IDN; public class IDNMailHelper { public static String toIdnAddress(String mail) { if (mail ==
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);
}
}
导入java.net.IDN;
公共类IDNMailHelper{
公共静态字符串toIdnAddress(字符串邮件){
if(mail==null){
返回null;
}
int idx=mail.indexOf('@');
if(idx<0){
回信;
}
返回localPart(mail,idx)+“@”+IDN.toASCII(domain(mail,idx));
}
私有静态字符串localPart(字符串邮件,int-idx){
return mail.substring(0,idx);
}
私有静态字符串域(字符串邮件,int-idx){
返回邮件子字符串(idx+1);
}
}
因为您实际上应该将电子邮件编码为UTF-8。这意味着您不应在此处使用IDN。如果您的发送SMTP服务器支持EAI(国际化电子邮件),这应该不会是一个问题 请记住,EAI可能会带来严重的安全风险。如果您决定在应用程序(服务?)中处理,请确保防止用户注册外观相似的电子邮件地址,即使用不同脚本的电子邮件地址。例如,应拒绝其中一人:
- 德奥rte@S奥伦森·德
- DöΓtö@Sörensen.de
如果您的服务器支持SMTPUTF8扩展,那么地址应该编码为UTF-8,这基本上是正确的。 JavaMail 1.6版本中提供了对SMTPUTF8的支持 要启用此支持,需要设置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");
对于电子邮件的标题,解决方案是为电子邮件中的非ISO-646字符定义特定的编码协议。Java Mail有一个类可用于使用以下内容:。Punicode/IDNS不适合标头使用
正如另一位回答者Bill Shannon在中指出的那样,Java Mail通常会自动将MimeUtil应用于您的邮件头。至于评论中关于介入邮件服务器的一个问题,我只是回答你关于标题中文本的问题,没有什么麻烦。至于实际将邮件发送到正确位置所需的SMTP协议邮件,我并不声称知道。如果您对测试包含非ASCII头支持的JavaMail版本感兴趣,请通过JavaMail与我联系_ww@oracle.com.Did你能试试上面的吗?您想测试JavaMail的固定版本吗?我从未收到您的回复,所以我认为这对您来说并不重要。6530仍然是一个草案,不是吗?“建议的标准”和“类别:标准跟踪”建议了其他内容。这是它应该如何实现的,我非常确信有SMTP服务器支持此扩展。您能详细说明我将如何使用MimeUtility类对非ASCII电子邮件地址进行编码吗?此外,我有什么保证电子邮件不会被其路径上的电子邮件服务器拒绝?