How to set content type for emails sent using spring's JavaMailSenderImpl
Question
question is from subject. I'm using JavaMailSenderImpl from spring 3.0.3.RELEASE and velocity 1.6.4 for mail preparation from template.
When I send email with Croatian characters from my webapp recipient receives "?" in stand of normal Croatian characters. If I turn debug mode for mails, from log I can see that Content-type is set to:
Content-Type: text/html; charset=us-ascii
Content-Transfer-Encoding: 7bit
How can I set it to:
Content-Type: text/html; charset=utf-8?
I'm using gmail for mail sending while I'm developing this webapp.
Here are my settings in spring's servlet xml conf file:
<bean id="userAuthorizationManager" class="com.mypackage.manage.SimpleUserAuthorizationManagerImpl">
<property name="mailSender" ref="mailSender" />
<property name="velocityEngine" ref="velocityEngine" />
<property name="from" value="address" />
<property name="authorizationAddress" value="some text" />
<property name="subject" value="some text" />
</bean>
<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
<property name="host" value="smtp.gmail.com" />
<property name="port" value="465" />
<property name="username" value="user" />
<property name="password" value="pass" />
<property name="protocol" value="smtps" />
<property name="javaMailProperties">
<props>
<prop key="mail.smtp.auth">true</prop>
<prop key="mail.smtp.connectiontimeout">5000</prop>
<prop key="mail.smtp.sendpartial">true</prop>
<prop key="mail.smtp.userset">true</prop>
<prop key="mail.mime.charset">UTF-8</prop>
<prop key="mail.smtp.isSecure">true</prop>
<prop key="mail.smtp.requiresAuthentication">true</prop>
<prop key="mail.smtp.auth">true</prop>
<prop key="mail.smtp.port">465</prop>
<prop key="mail.smtp.socketFactory.class">javax.net.ssl.SSLSocketFactory</prop>
<prop key="mail.smtp.socketFactory.fallback">false</prop>
<prop key="mail.smtp.starttls.enable">true</prop>
<prop key="mail.debug">true</prop>
</props>
</property>
</bean>
<bean id="velocityEngine"
class="org.springframework.ui.velocity.VelocityEngineFactoryBean">
<property name="velocityProperties">
<value>
resource.loader=class
class.resource.loader.class=org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader
</value>
</property>
</bean>
Here is my code from mail manager:
private void sendConfirmationEmail(final User user, final int requestId) {
MimeMessagePreparator preparator = new MimeMessagePreparator() {
public void prepare(MimeMessage mimeMessage) throws Exception {
MimeMessageHelper message = new MimeMessageHelper(mimeMessage);
message.setTo(user.getEmailAddress());
message.setFrom(from);
message.setSubject(subject);
Map<String, Object> model = new HashMap<String, Object>();
model.put("user", user);
model.put("authorizationAddress", authorizationAddress);
model.put("requestId", requestId);
String text = VelocityEngineUtils
.mergeTemplateIntoString(
velocityEngine,
"com/mypackage/mail/registration-confirmation.vm",
model);
message.setText(text, true);
}
};
PendingMail pendingMail = new PendingMail(preparator);
pool.submit(pendingMail);
}
private class PendingMail implements Callable<Object> {
MimeMessagePreparator preparator;
protected PendingMail(MimeMessagePreparator preparator) {
this.preparator = preparator;
}
public Object call() {
mailSender.send(preparator);
return null;
}
}
Have you any other suggestion?
Regards, Tiho
Solution
I resolved my problem thanks to this post.
According to the post I put this in the mailSender bean configuration:
<property name="defaultEncoding" value="UTF-8"/>
OTHER TIPS
You can set this as a property mail.mime.charset
in the JavaMailSenderImpl spring bean config. See an example answered at this previous query.
2020 answer, as XML configuration is not very used now:
JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
mailSender.getJavaMailProperties().put("mail.mime.charset", "UTF-8");
Another option could be:
JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
mailSender.setDefaultEncoding("UTF-8");