Unicode chars and Spring JavaMailSenderImpl, no unicode chars under Linux!
I'm using Spring and JavaMailSenderImpl, a famous spring class to send emails. My emails contain a lot of unicode chars like èéàò or most notably the dreaded € symbol. My classes work fine when the run on windows. The emails sent are with all the chars (plain text, no html). If I install my app on a Linux virtual server, I'll get all ? instead of the special chars. Is it Spring, Java configuration or something else?
Update
Basically the architecture is this: there is a Spring Web Application and I use spring JavaMailSenderImpl to get the work done. This is the configuration in servlet-context:
<bean id="mailSender" class="org.sp开发者_运维百科ringframework.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>
I'm using the same host on windows and linux to send mail (that is not the same machine where the application runs on... It is just a standard mail service provider over SMTP).
The code I use to send the email is simply:
SimpleMailMessage msg = new SimpleMailMessage();
msg.setTo(adminEmail);
msg.setFrom(adminEmail);
msg.setSubject(subject);
msg.setText(message);
mailSender.send(msg);
Even setting:
System.setProperty("mail.mime.charset", "utf8");
at application startup doesn't solve the situation. In fact, before I was getting ? instead of €, now I get �...
In my case, I resolved the encoding problem by specifying JavaMailSenderImpl's defaultEncoding:
mailSender = new JavaMailSenderImpl();
...
mailSender.setDefaultEncoding("UTF-8");
I believe you can also set the value in bean configuration:
<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
...
<property name="defaultEncoding" value="UTF-8"/>
</bean>
I am posting the solution.
First make sure about the encoding of the source code (if there is inline text). In eclipse is the first screen if you choose project properties. Warning: if you change it later it will garble your text.
Second It is better to use MimeMailMessage so that you can specify the encoding, like this:
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);
Third make sure the system property mail.mime.charset
is set to UTF-8, either from Java command or by code like this:
System.setProperty("mail.mime.charset", "utf8");
Thanks to everybody that helped me sorting this out.
The problem is likely to be when you translate between an array of bytes (e.g. reading from a file) and a java.lang.String
. Can you give more detail on your application's architecture?
精彩评论