playframework - 在电子邮件中嵌入 URL

标签 playframework

这是我的场景:

  • 用户将他/她自己注册到系统。
  • 系统发送确认邮件
  • 用户点击邮件内的网址完成注册

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

    (app/views/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
    

    我错过了什么?

    最佳答案

    我猜你在生产环境中在某些 web 服务器后面运行 play,比如 apache。

    默认情况下,“application.baseUrl”仅在请求对象为空时(从作业调用邮件时)使用。这是框架中的代码

    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”。

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

    在您的 MailSender 类中,您可以将 url 保留为静态变量
    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)}
    

    关于playframework - 在电子邮件中嵌入 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9155409/

    相关文章:

    java - 玩2.0和IDEA。缺少 javaCore、javaJdbc、javaEbean 依赖项

    java - HBase读取数据返回null

    java - 所有者删除时违反参照完整性约束(OneToMany 单向)

    jpa - 数据库更新前的计算

    java - Play Framework 获取文件的最后修改日期

    playframework - 使用 Specs2 的 Mockito 中的 NoSuchMethodError

    model-view-controller - 路由到 Play 中的静态文件!框架2.0

    java - 解决 Idea 中使用 activator new 生成的项目的依赖关系

    ubuntu - 在 ubuntu 上更新软件包后,在 ubuntu 上 Play Framework 命令停止工作

    java - 如何使用Ajax显示在线用户