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

时间:2011-04-12 13:47:47

标签: spring unicode javamail

我正在使用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");
应用程序启动时

无法解决问题。事实上,在我到来之前?而不是€,现在我得到了 ...

3 个答案:

答案 0 :(得分:18)

就我而言,我通过指定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>

答案 1 :(得分:14)

我正在发布解决方案。

首先确保源代码的编码(如果有内联文本)。如果选择项目属性,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");

感谢所有帮助我解决问题的人。

答案 2 :(得分:0)

当你在一个字节数组(例如从文件中读取)和java.lang.String之间进行转换时,问题可能就出现了。您能否详细介绍一下您的应用程序架构?