【问题标题】:Unicode chars and Spring JavaMailSenderImpl, no unicode chars under Linux!Unicode chars 和 Spring JavaMailSenderImpl,Linux 下没有 unicode chars!
【发布时间】:2011-08-03 22:08:28
【问题描述】:

我正在使用 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 不支持这些字符
  • 你能告诉我们初始化message变量的代码吗?
  • 这只是一个普通的字符串......无论如何我正在发布解决方案。

标签: spring unicode jakarta-mail


【解决方案1】:

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

【讨论】:

  • 不,我没有读取任何文件。文本在源代码中的字符串常量中,所以它是 UTF(我认为...)...
  • 它是一个 Maven 项目吗?您需要根据maven.apache.org/general.html#encoding-warning 指定源编码。 Ant 可能有一个等价物。
  • 我一直在考虑将mail.mime.charset设置为UTF-8,这样就够了吗?
  • 您需要提供有关您的应用程序架构的更多信息(编辑您的问题),您还可以发布一些您调用 JavaMailSenderImpl 的代码吗?
【解决方案2】:

我正在发布解决方案。

首先确定源代码的编码(如果有内嵌文本)。如果您选择项目属性,则在 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 小时... huuuuuu
  • 一直在 Windows 上工作并且遇到了类似的问题。标题和内容弄乱了字符。使用 MimeMessageHelper 设置标题和内容是原因,即使在那里设置了 utf-8 编码。使用 UTF-8 规范切换到普通的 MimeMessage.setText 和 .setSubject 是可行的。
  • msg.setSubject(主题, "UTF-8");第二个参数不再存在,任何新的更新都可以用新版本的 API 解决这个问题
【解决方案3】:

在我的例子中,我通过指定 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配置中设置值也可以。
猜你喜欢
  • 1970-01-01
  • 2016-09-01
  • 2021-11-03
  • 2023-01-13
  • 2010-12-19
  • 2015-04-05
  • 2021-08-12
  • 2019-02-23
  • 1970-01-01
相关资源
最近更新 更多