3

我有使用 HTML 和 asp.net HTTP 处理程序的邮件发送程序。

这是我的 html 页面,它向 .ashx 页面发送请求

<html>
<form id="ContactForm" action="EmailHandler.ashx" method="post">
    Name: <input class="input" type="text" id="contactname" name="contactname" autocomplete="on" required/>
    Email <input class="input" type="email" id="contactemail" name="contactemail" autocomplete="on" required />
    Comments<textarea cols="50" rows="5" id="contactmessage" name="contactmessage" required></textarea>

    <input type="submit" id="emailsubmit" name="emailsubmit" value="Send" />
</form>
</html>

这是我的 httphandler (EmailHandler.ashx)

public class EmailHandler : IHttpHandler {

    public void ProcessRequest (HttpContext context) {
        context.Response.ContentType = "text/plain";
        //context.Response.Write("Hello World");
        string name = context.Request.Form["contactname"];
        string email = context.Request.Form["contactemail"];
        string content = context.Request.Form["contactmessage"];
        try
        {
            SendEmail(name, email, content);

        }
        catch (Exception)
        {
           *******
        }
    }

    public bool IsReusable { get { return false; } }

    public void SendEmail(string name, string emailid, string emailcontent)
    {
        SmtpClient serverobj = new SmtpClient();
        MailMessage msgobj = new MailMessage();

        msgobj.To.Add("abc@ymail.com");
        msgobj.Subject = "Its From Guest";
        msgobj.Body = emailcontent;
        msgobj.IsBodyHtml = true;
        msgobj.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure;
        serverobj.Send(msgobj);

    }

现在如何处理来自这个处理程序的响应。

  1. 如果电子邮件发送成功,如何将成功消息反映到同一个 html 页面?

  2. 如果出现任何异常,如何处理异常或异常消息?

4

2 回答 2

1

您可以使用 将context值直接写回调用页面,如下所示:

public void ProcessRequest (HttpContext context) {
    context.Response.ContentType = "text/plain";
    //context.Response.Write("Hello World");
    string name = context.Request.Form["contactname"];
    string email = context.Request.Form["contactemail"];
    string content = context.Request.Form["contactmessage"];
    try
    {
        SendEmail(name, email, content);
    }
    catch (Exception ex)
    {
       // Write exception message to user
       // You can include some of the exception detail via the ex object, 
       // but be careful how much information you divulge to the user 
       context.Response.Write("There was a problem sending the email.");
    }

    // Email was sent successfully
    context.Response.Write("Email sent successfully.");
}
于 2013-09-12T15:39:16.333 回答
1

我知道这是一个相当古老的问题,但它仍然没有一个公认的答案,更不用说我认为最适合这种情况的答案了。OP 声明的表单的目的是根据 HTML 表单的输入简单地发送电子邮件,并根据需要提供成功/失败消息。这不是 ASP.NET HTTP 处理程序的合适情况。据我所知,HTTP 处理程序不会让您简单地通过 POST 回到 Web 表单,这并没有什么好处。但是,在 Web 表单中使用回发​​处理程序将使您能够轻松地执行以下操作:

  1. 成功后重定向
  2. 成功时显示消息
  3. 出现错误时显示带有详细信息的消息
  4. 出错时重定向,没有详细信息

例如,您可能有一个通常不可见的 ASP.NET 面板控件,但是当您在验证表单或发送电子邮件时遇到错误时,您可以在那里显示错误消息。如果您尝试使用 HTTP 处理程序来执行此操作,您要么必须做太多繁重的工作,将错误消息注入同一页面或另一个页面,要么您有一个非常平淡的纯文本消息要发送给客户端。

如果您必须使用 HTTP 处理程序,我建议您使用 Karl Anderson 的答案并至少 context.Response.StatusCode添加一个对错误有意义的 HTTP 状态代码。答案是,如果方法抛出异常,SendEmail()HTTP 处理程序会将错误消息作为 HTTP 200 (OK) 发送回客户端,如果出现异常并且无法发送电子邮件,则这是不正确的。我没有测试过这种方法(使用context.Response.Write()),但我相信您最终会得到非常基本的文本输出到浏览器,作为对提交表单产生的 POST 请求的响应。不会有任何 HTML,这取决于您的应用程序如何配置来处理 HTTP 错误。如果您有 HTTP 500 的自定义错误处理程序,并且您将catch块配置为设置StatusCode为 500,则必须将该自定义处理程序页面配置为读取响应消息,以便将该消息注入您的自定义处理程序页面内容。

于 2018-02-19T19:24:37.113 回答