在电子邮件中嵌入URL

时间:2012-02-06 03:53:22

标签: playframework

这是我的情景:

  1. 用户将自己注册到系统中。
  2. 系统发送确认电子邮件
  3. 用户点击电子邮件中的网址以完成注册
  4. 在第二步中,我正在尝试在电子邮件中嵌入“激活”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)}
    

    (应用程序/通知器/ 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);
        }
    }
    

    (CONF / application.conf)

    application.baseUrl=http://localhost:9000/
    %prod.application.baseUrl=http://www.realaddressgoeshere.com/
    

    我想获得服务器的URL,但我得到了URL 发展。

    期待得到:

    Click below to confirm user registration:
    http://www.realaddressgoeshere.com/registerer/activateuser?token=sometokengoeshere
    

    但我明白了:

    Click below to confirm user registration:
    http://127.0.0.1:9000/registerer/activateuser?token=sometokengoeshere
    

    我错过了什么?

3 个答案:

答案 0 :(得分:6)

我猜你正在制作一些像生产中的apache这样的网络服务器。

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

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

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

可能服务器中存在一些调整以正确传递请求。另一种可能性是手动设置网址的基本部分。

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

private static String APPLICATION_URL = Play.configuration.getProperty("application.baseUrl");

在发送的方法中添加

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);
    }
}

并在邮件中使用

${applicationUrl}@{Registerer.activateUser(token)}

答案 1 :(得分:1)

您是否可能会将application modeframework id混淆?在应用程序配置文件的以下行中,%prod引用框架标识prod。它不涉及应用程序模式PROD

%prod.application.baseUrl=http://www.realaddressgoeshere.com/

如果您希望该设置生效,则必须使用play id命令将框架ID设置为“prod”。有关详细信息,请参阅Play framework documentation

答案 2 :(得分:0)

万一你仍然需要它,或者别人有同样的问题......

由于您在Apache服务器后面运行,假设您使用mod_proxy和ProxyPass指令将请求代理到localhost:9000,您实际上可以保留原始主机行从传入请求到代理主机,而不是localhost :9000(或您为ProxyPass指令指定的任何主机名)。为此,将以下指令添加到apache2 VirtualHost配置:

ProxyPreserveHost On

有关详细信息,请查看Apache documentation for ProxyPreserveHost Directive here