【问题标题】:send a message using freemarker使用 freemarker 发送消息
【发布时间】:2015-06-09 09:42:33
【问题描述】:

我需要发送一封带有正文的信:

 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" 与我的设置。 有必要这样做 new MimeMessage(session) 吗? 如何从 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>

【问题讨论】:

    标签: java spring email freemarker


    【解决方案1】:

    您需要将映射传递给使用 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 文件夹下(相对于您的网络应用)。将 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);
    

    【讨论】:

    • 如何将 MAP 放入 freemarker 页面?那么Page freemarker是如何转换成字符串的呢?
    • 使用 Spring 更新了我的答案
    • 这样

      Lecturer-b 创建了一个新课程

      ----------------------------------- -----

      姓名:John

      类别:开发经理

      描述:经理

      链接:经理

      ----------------------------------- -----

      请在经理处复习本课程

    • 所以你已经有了渲染的 html。现在您只需要一个邮件发件人并在其上调用一个方法来发送 html 电子邮件。
    • @Dmitry88:SimpleMailMessage 只能发送文本。要发送 html 内容,请使用 MimeMessage。我已经更新了我的答案。
    猜你喜欢
    • 2018-01-04
    • 2015-09-02
    • 2020-08-04
    • 2018-05-25
    • 2014-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多