在 Struts 2 中发送带有嵌入 URL 的邮件

Posted

技术标签:

【中文标题】在 Struts 2 中发送带有嵌入 URL 的邮件【英文标题】:Sending mail with embedded URL in Struts 2 【发布时间】:2013-07-01 05:01:45 【问题描述】:

对于我公司的项目,我必须发送包含嵌入式 URL 的电子邮件,系统会提示用户关注这些 URL。

例如,一个人在网站上注册,然后 Struts2 应用程序会向该人发送一封电子邮件,其中有一个 URL 以确认订阅。

到目前为止,表单提交和发送电子邮件(从操作内部)都可以正常工作。我遇到的问题是我找不到生成要嵌入邮件正文的 URL 的方法。

我一定是做错了,但我在想类似以下的事情:

public String send() throws Exception 
    StringBuffer body = new StringBuffer();

    HashMap<String, String> params = new HashMap<String, String>();
    params.put("id", "xxxxxyyyyyaaaaa");

    body.append("Veuillez vous rendre ici :");
    body.append(UrlManager.getUrlForAction("action", params));

    SendMail sendMail = new SendMail();
    sendMail.send("me@me.fr", "Information", body.toString());

    return SUCCESS;

其中会有一个UrlManager(可以由框架提供的东西)和一个方法getUrlForAction(),它获取一个动作及其参数作为输入,并输出一个包含相应URL的字符串(如@987654324 @)。

有没有人对如何做到这一点有任何想法或指示?

编辑:

我尝试使用 UrlProvider,但在调用 determineActionUrl 时出现空指针异常。可能是我用错了。

HashMap<String,Object> params = new HashMap<String,Object>();
params.put("id", data.getMd5());

UrlProvider up = new ComponentUrlProvider(
                            new Component(ServletActionContext.getValueStack(ServletActionContext.getRequest())),
                            ServletActionContext.getRequest().getParameterMap());
downloadUrl = up.determineActionURL("confirm", "/", "GET",
                                    ServletActionContext.getRequest(),
                                    ServletActionContext.getResponse(),
                                    params,
                                    "http", true, true, true, true);

【问题讨论】:

您能否更具体地说明“无法找到生成 URL 的方法”。您是否尝试过您自己发布的上述代码?如果你试过了,你会得到任何错误。 “我在想下面的事情”还不够好。试试看,看看你遇到了什么错误或问题。 你写的是UrlManager还是SendMail?在 Struts2 框架中找不到。 是的,我都“写”了。实际上,SendMail 只是我为我的项目编写的一个助手,但 UrlManager 并不是真的。它更像是我希望它成为和工作的东西,比如 UrlHelper,它接近我想要的,但实际上并没有做我需要的,比如生成示例 url。 UrlHelper 省略了正在使用的端口(这里是 8080 用于开发机器),并将“.action”添加到 URL。 @CPU100,上面的代码不会这样做,因为我最好的尝试是使用 UrlHelper,它没有给出我期望的结果(它省略了端口,添加了“.action”到 url 等),即使我已将 struts 配置为没有操作扩展,并将端口设置为 8080 (struts.http.port=8080)。 @FabriceAGNELLO 你是如何使用 UrlHelper 的?编辑问题并分享您的经验。还提供默认 UrlHelper 有什么问题? 【参考方案1】:

您需要在您的操作中创建属性(依赖项)

@Inject
public void setActionMapper(ActionMapper actionMapper) 
  this.actionMapper = actionMapper;


private UrlHelper urlHelper;

@Inject
public void setUrlHelper(UrlHelper urlHelper) 
  this.urlHelper = urlHelper;

然后在动作中你可以写类似的东西

Map<String, Object> parameters = new HashMap<>();
ActionMapping mapping = new ActionMapping("action", "namespace", "", parameters);
String uri = actionMapper.getUriFromActionMapping(mapping);
String url  = urlHelper.buildUrl(uri, ServletActionContext.getRequest(), ServletActionContext.getResponse(), parameters, "http", true, false, true, false);

【讨论】:

Roman,注射部分是我所缺少的。照你说的做的很好,所以问题已经解决了。非常感谢。【参考方案2】:

您可以查看 Struts 的 UrlProvider.determineActionURL,它可以满足您的需求。

更新确实,几周前我需要使用这种方法,我记得一些 NPE 正在兴起……最后,我能够编写以下代码(改编自我的应用程序):

String getMyActionUrl() throws Exception 

    ActionInvocation invocation = (ActionInvocation) ActionContext
            .getContext().get(ActionContext.ACTION_INVOCATION);

    org.apache.struts2.components.URL url = new org.apache.struts2.components.URL(invocation.getStack(), getServletRequest(),
            getServletResponse());
    url.addParameter("parameterToBeDeleted", null);
    url.addParameter("newParam", newValue);
    url.setActionMapper(new DefaultActionMapper());
    url.setUrlHelper(new DefaultUrlHelper());

    String myUrl = url
            .getUrlProvider()
            .determineActionURL(
                    "MyActionName",
                    invocation.getProxy().getNamespace(),
                    invocation.getProxy().getMethod(),
                    getServletRequest(),
                    getServletResponse(),
                    getServletRequest().getParameterMap(),
                    "http",
                    true, true, false, false);

    return myUrl;


注意事项:

MyActionName 在这里是一个字符串——不是一个很好的可维护代码。确保它与您为操作指定的名称匹配(可能与处理对该操作的调用的 Action 类的名称不同)。

http 是硬编码的。根据需要进行更改。

【讨论】:

我会尝试找到如何使用此方法,但它看起来与 UrlHelper 非常相似,无法完全解决问题。也许有了这个我会更幸运。 我已经编辑了我的初始帖子。我使用 UrlProvider.determineActionURL 方法(可能是错误的方式)得到 NullPointerException。你知道出了什么问题吗? @FabriceAGNELLO 更新了答案。 HTH :) 我终于尝试了 Roman C. 给出的解决方案,它就像一个魅力。您的解决方案似乎也很好,但我会继续使用 Roman 的解决方案。无论如何,感谢您的帮助。

以上是关于在 Struts 2 中发送带有嵌入 URL 的邮件的主要内容,如果未能解决你的问题,请参考以下文章

Struts2 更好的带有点的 URL

带有 .action 的 Struts2 URL

显示带有嵌入内容的 url (djs v12)

在 c# 中动态分配 ContentId 并发送带有嵌入图像的电子邮件

带有嵌入的欢迎消息未显示

使用 MimeMultipart、Java 8 发送带有多个嵌入图像的邮件