JavaMailSender - 将动态值设置为邮件模板

时间:2015-10-06 15:29:29

标签: java spring email

我在数据库MailTemplate中有一个实体,它有一个用于某些操作的邮件模板。现在,我需要在此模板中设置一个值。 Template是一个简单的JSP页面,我想在运行时填充几个字段。 例如,模板是: “你好用户$ {username}!”现在我想在将这封邮件发送给用户之前设置用户名值。有可能以这种方式吗?我应该使用哪些工具?

1 个答案:

答案 0 :(得分:1)

典型的解决方案是使用 Spring 中广泛支持的模板库之一创建电子邮件内容。在这里,我列出了使用我喜欢的库 Velocity 动态填充模板的基本步骤:

  • 确保 Velocity 库jar包在您的类路径中。
  • 创建模板文件,该文件将是某些软​​件包下的常用 HTML 文件,例如: 一些/包/模板/ hello.html的

    <html>
      <body>
        <div>Hello user ${username}!</div>
      </body>
    </html>
    
  • 使用VelocityEngine处理引擎和VelocityEngineUtils实用程序类用您的模型对象填充模板并创建所需的最终邮件文本(因为我没有提供完整的示例)知道你的配置是怎样的,但我提供了在大多数情况下会改变的片段:

    @Autowired
    JavaMailSenderImpl sender;
    // ...
    
    MimeMessage message = sender.createMimeMessage();
    MimeMessageHelper helper = new MimeMessageHelper(message);
    helper.setTo("someone@host1.com");
    message.setFrom("me@host2.com");
    Map model = new HashMap();
    model.put("username", "Foo");
    String text = VelocityEngineUtils.mergeTemplateIntoString(velocityEngine, "some/package/templates/hello.html", model);
    message.setText(text, true);
    
    //...
    sender.send(message);
    
  • 最后一步是确保在您的应用程序上下文文件中声明org.springframework.ui.velocity.VelocityEngineFactoryBean bean定义(请注意,我没有介绍您应该自己编写的丢失邮件bean,以及它只不过是品味问题,但可以使用Java配置而不是XML配置注入相同的bean:)

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">
    
        <!-- Missing Java Mail Beans -->
    
        <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>
    
    </beans>
    

编辑:如何解析动态构造的模板内容

如果模板内容来自不同的源而不是来自模板文件,则步骤3几乎应该是不同的,因为您必须手动提供用于渲染输入的上下文并使用一个来评估模板内容org.apache.velocity.app.Velocity#evaluate方法:

    import org.apache.velocity.app.Velocity;
    //...

    @Autowired
    JavaMailSenderImpl sender;
    // ...

    String mailBody = "Hello user ${username}!"; // This will depend on how you would get your mail content
    MimeMessage message = sender.createMimeMessage();
    MimeMessageHelper helper = new MimeMessageHelper(message);
    helper.setTo("someone@host1.com");
    message.setFrom("me@host2.com");
    // Create the context for data input
    VelocityContext context = new VelocityContext();
    context.put("username", "Foo");
    // Create the Writer you would use as the output
    StringWriter writer = new StringWriter();
    // Evaluate your text entry
    Velocity.evaluate(context, writer, "EvalError", mailBody);
    message.setText(writer.toString(), true);

    //...
    sender.send(message);

the official Spring documenation

中的更多详情