Unicode字符和Spring JavaMailSenderImpl,Linux下没有Unicode字符!

8
我正在使用Spring和JavaMailSenderImpl,这是一个著名的Spring类,用于发送电子邮件。我的电子邮件包含许多Unicode字符,如èéàò或最明显的可怕的€符号。当我的类在Windows上运行时,它们可以正常工作。发送的电子邮件包含所有字符(纯文本,无HTML)。如果我将应用程序安装在Linux虚拟服务器上,我将得到所有特殊字符的问号。这是Spring、Java配置还是其他什么原因呢?
更新:
基本上架构是这样的:有一个Spring Web应用程序,我使用Spring JavaMailSenderImpl来完成工作。这是servlet-context中的配置:
<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
    <property name="host" value="${email.server}" />
    <property name="username" value="${email.server_user}"></property>
    <property name="password" value="${email.server_pass}"></property>
</bean>

我正在使用同一个主机在Windows和Linux上发送邮件(这不是应用程序运行的同一台机器...它只是一个标准的SMTP邮件服务提供商)。

我用来发送电子邮件的代码非常简单:

SimpleMailMessage msg = new SimpleMailMessage();
            msg.setTo(adminEmail);
            msg.setFrom(adminEmail);
            msg.setSubject(subject);
            msg.setText(message);
            mailSender.send(msg);

甚至设置:

System.setProperty("mail.mime.charset", "utf8");

在应用程序启动时并不能解决这种情况。事实上,在之前我得到的是?而不是€,现在我得到的是�...

(说明:此段内容可能涉及编码问题,建议检查编码设置)


不是真正的答案,但你有检查过你的Linux用户的“locale”吗?也许它正在使用不支持这些字符的LANG。 - MarcoS
你能展示一下初始化 message 变量的代码吗? - artbristol
这只是一个普通的字符串... 无论如何,我正在发布解决方案。 - gotch4
3个回答

21

在我的情况下,我通过指定JavaMailSenderImpl的defaultEncoding解决了编码问题:

mailSender = new JavaMailSenderImpl();
...
mailSender.setDefaultEncoding("UTF-8");

我相信您也可以在bean配置中设置该值:

<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
    ...
    <property name="defaultEncoding" value="UTF-8"/>
</bean>

没错,在bean配置中设置值也可以。 - MyBrainHurts

16

我正在发布解决方案。

首先,确定源代码的编码(如果存在内联文本)。在Eclipse中,如果您选择项目属性,则是第一个屏幕。警告:如果稍后更改编码,它将破坏您的文本。

第二,最好使用MimeMailMessage,这样您可以指定编码,像这样:

MimeMessage msg = mailSender.createMimeMessage();

        msg.addRecipient(RecipientType.TO, new InternetAddress(adminEmail));
        msg.addFrom(new InternetAddress[] { new InternetAddress(adminEmail) });

        msg.setSubject(subject, "UTF-8");
        msg.setText(message, "UTF-8");  
        mailSender.send(msg);

第三步,确保系统属性mail.mime.charset已设置为UTF-8,可通过Java命令或像这样的代码进行设置:

System.setProperty("mail.mime.charset", "utf8");

感谢每一个帮助我解决问题的人。


它说我必须等待21个小时... 呼呼呼 - gotch4
之前在Windows上工作时遇到了类似的问题。标题和内容出现乱码。使用MimeMessageHelper设置标题和内容是问题的原因,即使设置了utf-8编码也无效。改用纯文本的MimeMessage.setText和.setSubject,并指定UTF-8编码解决了问题。 - Pafnucy
msg.setSubject(subject, "UTF-8"); 第二个参数已经不存在了,有任何新的更新来解决这个问题与API的新版本。 - Zain Elabidine

0

问题可能出现在将字节数组(例如从文件中读取)和java.lang.String之间进行转换时。您能否提供有关应用程序架构的更多详细信息?


不,我没有从任何文件中读取。文本在源代码中作为字符串常量,因此它是UTF(我想...)。 - gotch4
这是一个Maven项目吗?你需要按照http://maven.apache.org/general.html#encoding-warning指定源编码。Ant可能有相应的设置。 - artbristol
我一直在考虑将mail.mime.charset设置为UTF-8,这样就足够了吗? - gotch4
你需要提供更多关于你的应用程序架构的信息(编辑你的问题),同时你能否发布一些调用JavaMailSenderImpl的代码? - artbristol

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接