Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to set content type for emails sent using spring's JavaMailSenderImpl

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

like image 264
Tiho Avatar asked Jul 18 '10 10:07

Tiho


4 Answers

Another option could be:

JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
mailSender.setDefaultEncoding("UTF-8");
like image 106
Gustavo Martínez Avatar answered Oct 26 '22 07:10

Gustavo Martínez


2020 answer, as XML configuration is not very used now:

JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
mailSender.getJavaMailProperties().put("mail.mime.charset", "UTF-8");
like image 41
Benjamin Caure Avatar answered Oct 26 '22 06:10

Benjamin Caure


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"/>
like image 33
Tiho Avatar answered Oct 26 '22 06:10

Tiho


You can set this as a property mail.mime.charset in the JavaMailSenderImpl spring bean config. See an example answered at this previous query.

like image 35
JoseK Avatar answered Oct 26 '22 05:10

JoseK