Java 电子邮件地址中的撇号引发异常
我必须使用JavaMail API向用户发送电子邮件 用户可能有带撇号的电子邮件地址,如Java 电子邮件地址中的撇号引发异常,java,jakarta-mail,Java,Jakarta Mail,我必须使用JavaMail API向用户发送电子邮件 用户可能有带撇号的电子邮件地址,如 Michael.O’Hara@sampleDomain.com 当我尝试向这样的用户发送电子邮件时,我遇到了以下异常情况 javax.mail.MessagingException: Can't send command to SMTP host; nested exception is: java.net.SocketException: Software caused conn
Michael.O’Hara@sampleDomain.com
当我尝试向这样的用户发送电子邮件时,我遇到了以下异常情况
javax.mail.MessagingException: Can't send command to SMTP host;
nested exception is:
java.net.SocketException: Software caused connection abort: socket write error
at com.sun.mail.smtp.SMTPTransport.sendCommand(SMTPTransport.java:1564)
at com.sun.mail.smtp.SMTPTransport.sendCommand(SMTPTransport.java:1551)
at com.sun.mail.smtp.SMTPTransport.close(SMTPTransport.java:696)
at javax.mail.Transport.send0(Transport.java:191)
at javax.mail.Transport.send(Transport.java:118)
at com.openpages.ext.duke.util.DukeEmailUtil.sendNotification(DukeEmailUtil.java:194)
下面是我用来发送电子邮件的方法
public static void sendNotification(String mailServer, String fromName,
String fromAddress, String toAddress, String ccAddresses,
String subject, String emailContent) throws Exception {
try {
// TODO: The email session should be cached in a future release.
Properties props = new Properties();
props.put("mail.smtp.host", mailServer);
Session session = Session.getInstance(props, null);
MimeMessage msg = new MimeMessage(session);
InternetAddress addressFrom = null;
if (StringUtil.isGood(fromName))
addressFrom = new InternetAddress(fromAddress, fromName);
else
addressFrom = new InternetAddress(fromAddress);
msg.setFrom(addressFrom);
if (toAddress != null && !toAddress.equalsIgnoreCase("")) {
String[] toAddressesArray = toAddress.split(";");
InternetAddress[] addressTO = new InternetAddress[toAddressesArray.length];
for (int i = 0; i < toAddressesArray.length; i++) {
LoggerFactory.getLogger().error("Before InternetAdress Contructor");
addressTO[i] = new InternetAddress(toAddressesArray[i]);
LoggerFactory.getLogger().error("After InternetAdress Contructor");
}
msg.setRecipients(Message.RecipientType.TO, addressTO);
}
// TODO : method signature has to be changed
// to take String[] for toAddress & ccAddresses
if (ccAddresses != null && !ccAddresses.equalsIgnoreCase("")) {
String[] ccAddressesArray = ccAddresses.split(";");
InternetAddress[] addressCC = new InternetAddress[ccAddressesArray.length];
for (int i = 0; i < ccAddressesArray.length; i++) {
addressCC[i] = new InternetAddress(ccAddressesArray[i]);
}
msg.setRecipients(Message.RecipientType.CC, addressCC);
}
msg.setSubject(subject, "utf-8");
msg.setContent(emailContent, "text/html;charset=utf-8");
Transport.send(msg);
msg = null;
session = null;
}
catch (Exception e) {
e.printStackTrace();
throw e;
}
}
如果有人能告诉我如何解决这个问题,那就太好了。有两种可能的方法来解决这个问题。我不知道你的代码到底是什么样子的,如果你能发布一些代码来显示消息是如何发送的,那就太酷了 使用strict=false,例如新的InternetAddressMichael.O'Hara@sampleDomain.com错误的 除上述方法外,将电子邮件地址本身置于双引号中,尽管这更像是一种变通方法 放松对会话对象Session.setPropertymail.mime.address.strict的严格验证,false;
RFC 2822规范绝对要求引用地址中包含此类特殊字符的本地部分,即Michael.O'Hara@sampleDomain.com.您要连接到哪个邮件服务器?它能处理电子邮件地址本地部分的这些字符吗?什么类和方法引发异常?你确定你使用的是ASCII撇号十六进制0x27吗?即使在引用电子邮件后,我在SMTP传输类中也会遇到如下错误javax.mail.MessaginException:无法向SMTP主机发送命令;嵌套异常为:java.net.SocketException:软件导致的连接中止:com.sun.mail.SMTPTransport.sendcommandsmttptransport.java:1564在com.sun.mail.smtp.SMTPTransport.sendcommandsmttptransport.java:1551在com.sun.mail.smtp.SMTPTransport.closeSMTPTransport.java:696在javax.mail.Transport.send0Transport.java:191在javax.mail.Transport.sendTransport.java:118上显示了什么?