在电子邮件中嵌入URL

TAT*_*TAT 6 playframework

这是我的情景:

  1. 用户将他/她自己注册到系统.
  2. 系统发送确认电子邮件
  3. 用户单击电子邮件中的URL以完成注册

在第二步中,我试图在电子邮件中嵌入"激活"URL(由@@ {Controller.action()}解析).电子邮件将通过Mailer扩展的自定义类发送.我通过阅读以下页面为开发和生产服务器设置"application.baseUrl",这解释了application.baseUrl设置. http://www.playframework.org/documentation/1.2.4/configuration#application.baseUrl

(应用程序/视图/ registerer.txt)

Click below to confirm user registration:
@@{Registerer.activateUser(token)}
Run Code Online (Sandbox Code Playgroud)

(应用程序/通知器/ MailSender.java)

public class MailSender extends Mailer {
    public static void registration(User user, String token) {
        setSubject("User Registration Confirmation"));
        addRecipient(user.email);
        setFrom("XXXSystem <auto-mail@xxxsystem.com>");
        send(user, token);
    }
}
Run Code Online (Sandbox Code Playgroud)

(CONF/application.conf)

application.baseUrl=http://localhost:9000/
%prod.application.baseUrl=http://www.realaddressgoeshere.com/
Run Code Online (Sandbox Code Playgroud)

我想获得服务器的URL,但我得到了开发的URL.

期待得到:

Click below to confirm user registration:
http://www.realaddressgoeshere.com/registerer/activateuser?token=sometokengoeshere
Run Code Online (Sandbox Code Playgroud)

但我得到:

Click below to confirm user registration:
http://127.0.0.1:9000/registerer/activateuser?token=sometokengoeshere
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

Seb*_*ron 6

我猜你正在制作一些像apache这样的web服务器.

默认情况下,"application.baseUrl"仅在Request对象为null时(从Job调用Mail时)使用.这是框架中的代码

String base =  Http.Request.current() == null ? Play.configuration.getProperty("application.baseUrl", "application.baseUrl") : Http.Request.current().getBase();
Run Code Online (Sandbox Code Playgroud)

当您从Controller调用邮件时,将调用"Http.Request.current.getBase()"方法,如果您在前端服务器后面运行,则该方法可以是"http://127.0.0.1:9000".

也许在服务器中有一些调整来正确传递请求.另一种可能性是手动设置URL的基本部分.

在MailSender类中,您可以将URL保留为静态变量

private static String APPLICATION_URL = Play.configuration.getProperty("application.baseUrl");
Run Code Online (Sandbox Code Playgroud)

将其添加到您发送的方法中

public class MailSender extends Mailer {
    public static void registration(User user, String token) {
        String applicationUrl = APPLICATION_URL;
        setSubject("User Registration Confirmation"));
        addRecipient(user.email);
        setFrom("XXXSystem <auto-mail@xxxsystem.com>");
        send(user, token, applicationUrl);
    }
}
Run Code Online (Sandbox Code Playgroud)

并在您的邮件中使用它

${applicationUrl}@{Registerer.activateUser(token)}
Run Code Online (Sandbox Code Playgroud)