gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 07:53:47 25 4
gpt4 key购买 nike

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

最佳答案

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

  • 确保 Velocity 库 jar 位于您的类路径中。
  • 创建模板文件,该文件将是某个包下的常见 HTML 文件,例如some/package/templates/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 配置来注入(inject)相同的 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

关于JavaMailSender - 将动态值设置到邮件模板中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32973887/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com