使用freemarker发送消息

时间:2015-06-09 09:42:33

标签: java spring email freemarker

我需要发信给身体:

 Lector {LectorName} had created a new course
 ----------------------------------------------------
 Name:        {CourseName}
 Category:    {CourseCategory}
 Description: {CourseDescription}
 Links:       {CourseLinks}
 ----------------------------------------------------
 Please, review this course at {CourseApproveLink}

我在页面上制作了freemarker

<!DOCTYPE html>
<html lang="en">
 <head>

</head>
<body>

<p>         ${LectorName} had created a new course</p>
<p>----------------------------------------------------</p>
<p>Name: ${Course.title}</p>
<p>Category: ${Course.category.name}</p>
<p>Description: ${Course.descr}</p>
 <p>Links: ${Course.links}</p>
 <p>----------------------------------------------------</p>
  <p>Please, review this course at ${CourseApproveLink}</p>
  </body>
   </html>

如何填写并传递发送信件的方法中的值? 这是我的代码。我的方法sendMail和Bean“mailSender”与我的设置。 有必要这样做新的MimeMessage(会话)吗? 如何将bean中的设置导入会话?

@Service("mailService")
public class MailService {

@Autowired
private MailSender mailSender;
@Autowired
private SimpleMailMessage alertMailMessage;

@Resource(name = "freemarkerEmailConfig")
private Configuration emailConfiguration;

public void sendMail(String from, String to, String subject, String body) {

SimpleMailMessage message = new SimpleMailMessage();

message.setFrom(from);
message.setTo(to);
message.setSubject(subject);
 message.setText(body);

mailSender.send(message);

}

public void sendAlertMail(String alert) {

SimpleMailMessage mailMessage = new SimpleMailMessage(alertMailMessage);
mailMessage.setText(alert);
mailSender.send(mailMessage);

}

}



<bean id="mailSender"  class="org.springframework.mail.javamail.JavaMailSenderImpl">

    <property name="host" value="smtp.mail.ru" />
    <property name="port" value="465" />
    <property name="username" value="user@mail.ru" />
    <property name="password" value="***********" />
    <property name="javaMailProperties">
        <props>
            <prop key="mail.transport.protocol">smtp</prop>
            <prop key="mail.smtp.auth">true</prop>
            <prop key="mail.smtp.ssl.enable">true</prop>
            <prop key="mail.debug">true</prop>
        </props>
    </property>
    </bean>

    <bean id="alertMailMessage"  class="org.springframework.mail.SimpleMailMessage">
    <property name="from">
        <value>dima4nolimit@mail.ru</value>
    </property>
    <property name="to">
        <value>bizanrus@mail.ru</value>
    </property>
    <property name="subject"
        value="Alert - Exception occurred. Please investigate" />

    </bean>

1 个答案:

答案 0 :(得分:2)

您需要将地图传递给使用freemarker模板发送电子邮件的方法。在您的情况下,地图将类似于:

Map<Object, Object> map = new HashMap<Object, Object>();
map.put("LectorName", "...");
map.put("Course", course);
map.put("CourseApproveLink", "...");

Freemarker将根据您传入的密钥解析变量名称。

如果您使用Spring,请在applicationContext.xml中配置模板目录,如下所示:

<!-- FreeMarker Configuration -->
<bean id="freemarkerEmailConfig" class="freemarker.template.Configuration">
    <property name="directoryForTemplateLoading" value="templates/email" />
    <property name="objectWrapper">
        <bean class="freemarker.template.DefaultObjectWrapper"/>
    </property>
</bean> 

将模板放在templates/email文件夹下(相对于您的webapp)。将applicationContext中定义的freemarkerEmailConfig bean注入到服务类中:

@Resource(name = "freemarkerEmailConfig")
private Configuration emailConfiguration;

现在,在您的服务类中,您可以使用emailConfiguration检索模板,然后使用上面的地图处理它,如下所示:

Template template = emailConfiguration.getEmailTemplate(templateName);
String text = FreeMarkerTemplateUtils.processTemplateIntoString(template, map);

FreeMarkerTemplateUtils是Spring的一个类。现在text将包含html,其中所有变量都被地图中的值替换。只需发送包含text html内容的电子邮件:

MimeMessage msg = mailSender.createMimeMessage();
msg.setFrom(new InternetAddress(EMAIL_SENDER_ADDRESS, EMAIL_SENDER_PERSONAL));
msg.setSubject(subject);
msg.setSentDate(new Date());
msg.setContent(text, "text/html; charset=UTF-8");
for (EmailInternetAddress emailInternetAddress  :emailInternetAddresses) {
    msg.addRecipient(emailInternetAddress.getRecipientType(),
                emailInternetAddress.getInternetAddress());
    }
mailSender.send(msg);