java - 电子邮件地址中的特殊字符抛出异常

标签 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 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;
        }
    }

如果有人能告诉我如何解决这个问题,那就太好了。

最佳答案

假设允许带有 ` 的电子邮件地址,我会尝试更改它

addressTO[i] = new InternetAddress(toAddressesArray[i]);

对此

addressTO[i] = new InternetAddress(toAddressesArray[i].replace("`", "\\`"));

用\. 跳过 ` 字符

关于java - 电子邮件地址中的特殊字符抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23332251/

相关文章:

java - 身份验证和 SSO 应用程序

java - 如何替换字符串中一定数量的空格之后出现的子字符串?

intellij-idea - Intellij 无法识别 javax.mail 导入,但项目构建正常

java - 发送 IMAP 空闲命令后是否需要执行其他操作才能保持连接处于 Activity 状态?

java - Maven 的自定义库无法下载不同版本

java - Eclipse : Failed to connect to remote VM. 连接被拒绝。

java - 在Java中打印固定大小的 double

java - 如何使用 JavaMail 进行 IMAP UID 搜索?

Java Mail 在某些情况下被 gmail 阻止

java - 如何将 PST 文件中的所有或选定的电子邮件和电子邮件附件提取到本地文件夹中?