【问题标题】:Send a link in confirmation mail在确认邮件中发送链接
【发布时间】:2014-02-08 00:12:39
【问题描述】:

我正在使用这些配置:

WebMail.SmtpServer = "smtp.gmail.com";
WebMail.EnableSsl = true;
WebMail.SmtpPort = 587;
WebMail.UserName = "name";
WebMail.Password = "pass";
WebMail.From = "fromaddres";

发送带有超链接的确认电子邮件会返回一个 HttpRequestValidationException。

我尝试使用 WebMail.Send() 方法制作测试邮件页面。那里的一些代码:

try{
    if(IsPost){
        WebMail.Send(
            to: Request.Form["emailAddress"],
            subject: Request.Form["emailSubject"],
            body: Request.Form["emailBody"],
            isBodyHtml: true
       );
       message = "Email sent!";
    }
}catch(HttpRequestValidationException){
}catch(Exception ex){
    message = "Email could not be send! Error: "+ex.Message;
}

如果我在“emailBody”中输入纯文本。电子邮件已正确发送。

但是,如果我在输入文本中的某处写任何 html 标签,例如超链接或段落,它返回相同的异常并说“emailBody”输入内容可能具有潜在危险。

有人可以说我做错了什么或如何解决这个问题吗?

编辑

解决方案是将“isBodyHtml”参数设置为 false。 删除“emailBody”中的所有 html 标签,只用 url
写纯文本 (例如“嗨,访问这个网站:www.google.com”) 在收到的电子邮件中,我有一个带有所需网站链接的文本。

无论如何发送<a> 链接会很有用。

【问题讨论】:

    标签: c# asp.net razor asp.net-webpages


    【解决方案1】:

    您的Request.Form["emailBody"] 很可能有 html 编码的字符串。在通过电子邮件发送之前,您可能需要将编码的 HTML 转换为原始 html。您可以使用 WebUtility.HtmlDecode (msdn) 方法转换回原始 html。

            to: Request.Form["emailAddress"],
            subject: Request.Form["emailSubject"],
            body: WebUtility.HtmlDecode(Request.Form["emailBody"]),
    

    【讨论】:

    • 还是一样的异常。除了禁用验证之外,还有其他方法可以做到这一点吗?
    【解决方案2】:

    当通过请求提交潜在的恶意代码时会引发该异常。在这种情况下,HTML 标记。 HttpRequestValidationException

    *您可以通过将其添加到 web.config 来禁用应用程序的请求验证:

    <configuration> 
      <system.web> 
        <pages validateRequest="false" /> 
      </system.web> 
    </configuration>* 
    

    注意:始终清理您的输入。

    编辑:

    上面的配置我已经测试过了,确实不行。

    如果您使用[ValidateInput(false)] 装饰您的方法并将requestValidationMode="2.0" 添加到&lt;httpRuntime /&gt; 元素,您应该能够发送带有html 内容的电子邮件。

    <httpRuntime targetFramework="4.5" requestValidationMode="2.0" />
    

    来自我的测试配置:

    <system.web>
        <compilation debug="true" targetFramework="4.5" />
        <httpRuntime targetFramework="4.5" requestValidationMode="2.0" />
        ...
        <pages>
          ....
        </pages>
      </system.web>
    

    从控制器:

    [HttpPost]
    [ValidateInput(false)]
    public ActionResult SendMail(string param1)
    {
        // code omitted due to brewity.
    }
    

    【讨论】:

    • 在我的情况下没有任何改变。还有其他想法吗?
    • 好的,但是如果我在网页中写作呢?我必须使用某些东西而不是 [ValidateInput(false)],因为我没有控制器。我发现了一些关于“Validation.Exclude”方法here 的东西,但我既不能使用它,也找不到任何关于它的文档。
    • 您可以尝试在页面顶部将validateRequest="false" 添加到您的Page directive 吗? &lt;%@ Page validateRequest="false" %&gt;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-19
    • 1970-01-01
    • 2015-02-02
    • 2016-07-14
    • 2018-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多