在电子邮件中使用问号表示不间断空格等字符.它只发生在Unix上,而不是在Windows上



我正面临一个与内容类型/编码相关的奇怪问题。下面是我的Java代码片段。这段代码在Windows机器上运行得非常好,其中应用程序服务器在Windows上运行,用于发送电子邮件的SMTP服务器也是Windows localhost。当我在Unix服务器上部署相同的代码时,为完全相同的内容发送的电子邮件包含问号(??)来表示特殊字符,如不可中断的空白。

我做了很多谷歌搜索,但我没有找到任何解决方案。我该如何解决这个问题?我尝试的内容类型是ISO-8859-1、UTF-8和Windows-1252。没有什么帮助。

        MimeMessage message = new MimeMessage(session);
                .............
        Multipart mp = new MimeMultipart();
        MimeBodyPart messageBody = new MimeBodyPart();
        messageBody.setContent(mailMessage, "text/html;charset=Windows-1252");
        messageBody.setHeader("Content-Type", "text/html;charset=Windows-1252");
        // Add body to the multimedia part
        mp.addBodyPart(messageBody);
        message.setContent(mp);
        // Send message
        Transport.send(message);

在这两种情况下使用相同的邮件服务器吗?用相同的客户端程序来查看消息?

用于调试,就在传输之前。发送呼叫,添加:

message.writeTo(new FileOutputStream("msg.txt"));

,然后检查msg.txt文件,看看字符是否被正确编码。

如何在mailMessage字符串中创建文本?如果您不使用正确的Unicode字符创建字符串,则没有字符集将使其正确。

同样,你不需要显式地设置Content-Type头,删除那一行。

使用:

代替setContent
messageBody.setText(mailMessage, "html", "utf-8");

确保Content-Type头被正确设置,参数(例如,字符集)被正确引用。

最终,我不得不采用一种粗糙的方式来完成它。我用空格替换了这些字符。

mailMessage.replaceAll("[^\x20-\x7e]", " ");

现在,所有的特殊字符,如非断行空格或任何其他超出正常范围的字符,将被空格替换。在这种情况下,电子邮件无论如何都是用于正常文本的。

最新更新