2

我添加了一个评论框,每次用户添加新评论时,我都会调用插入处理程序将其应用到数据库中。我喜欢这里是快速完成的事情。

我现在想做的是每次插入新评论时都发送,没有延迟。

所以我添加了SmtpClient并在同一个插入处理程序上使用SendAsync发送邮件。这对我来说还不够好,因为即使是最简单的电子邮件正文(“hello world”)也需要 5 秒才能回复!也许我需要添加一个新线程?

有没有其他方法可以克服发送电子邮件的延迟?我想创建一个新的处理程序,它将在插入处理程序的onComplete上运行,它将调用另一个处理程序,该处理程序将在后台发送邮件,用户不会注意到。这个问题可能是垃圾邮件,但一遍又一遍地重新调用同一个处理程序。

4

3 回答 3

1

有无数种方法可以解决这个问题,但我的方法一直是使用完全不同的定时进程或服务,它可以直接从数据库中读取数据,并独立于 ASP.NET 应用程序发送电子邮件。

在理想的大型应用程序中,您将在接收端使用带有 MSMQ - Microsoft 消息队列之类的单独进程。

编辑:

好的,所以在网上有几个地方提到了另一种方法(我强烈反对使用它,因为它非常脆弱),但基本上它涉及创建一个 ASP.NET 网络服务,其中包含您发送电子邮件的代码和使用 jQuery 调用该服务。所以你最终会得到一个像这样声明的网络服务

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
[System.Web.Script.Services.ScriptService]
public class EmailSender : System.Web.Services.WebService
{
    [WebMethod]
    public void SendEmail(string email, string message)
    {
        //Send my email
    }
}

在提交或表单回发时,您会按照这些方式调用它。

$.ajax({
    type: "POST",
    contentType: "application/json; charset=utf-8;",
    url: "EmailSender.asmx",
    data: JSON.stringify({ email: "mail@email.com",
        message: "this is a test message"
    }),
    dataType: "json",
    success: function (data, textStatus, jqXHR) {
        //Do success stuff
    },
    error: function (jqXHR, textStatus, errorThrown) {
        //Do error stuff
    }
});
于 2012-07-03T06:52:08.120 回答
0

我在一个项目中遇到了同样的问题。我对这个问题的解决方案是让一个单独的 SMTP 服务器运行,并为我的主页提供一个取件位置,以转储任何必须发送的电子邮件。这样做时,从 ASP .Net 端即时创建电子邮件。然后 SMTP 服务器处理实际的发送过程。

这确保了我的网页快速响应,并且我不会一次性发送太多电子邮件,以至于我的 SMTP 服务器被其他 SMTP 服务器列入黑名单。

http://msdn.microsoft.com/en-us/library/system.net.mail.smtpdeliverymethod.aspx

于 2012-07-03T07:01:54.570 回答
0

也许您可以使用此代码,即 SendMailMessageAsync() 方法。这是来自 BlogEngine 的源代码。

public static string SendMailMessage(MailMessage message)
{
    if (message == null)
    {
        throw new ArgumentNullException("message");
    }

    StringBuilder errorMsg = new StringBuilder();

    try
    {
        message.IsBodyHtml = true;
        message.BodyEncoding = Encoding.UTF8;
        var smtp = new SmtpClient(Settings.Instance.SmtpServer);

        // don't send credentials if a server doesn't require it,
        // linux smtp servers don't like that 
        if (!string.IsNullOrEmpty(Settings.Instance.SmtpUserName))
        {
            smtp.Credentials = new NetworkCredential(yourusername, yourpassword));
        }

        smtp.Port = Settings.Instance.SmtpServerPort;
        smtp.EnableSsl = Settings.Instance.EnableSsl;
        smtp.Send(message);
    }
    catch (Exception ex)
    {
        errorMsg.Append("Error sending email in SendMailMessage: ");
        Exception current = ex;

        while (current != null)
        {
            if (errorMsg.Length > 0) { errorMsg.Append(" "); }
            errorMsg.Append(current.Message);
            current = current.InnerException;

            Logger.Error("Error sending email in SendMailMessage.", ex);
        }
    }
    finally
    {
        // Remove the pointer to the message object so the GC can close the thread.
        message.Dispose();
    }

    return errorMsg.ToString();
}

public static void SendMailMessageAsync(MailMessage message)
{
    ThreadPool.QueueUserWorkItem(delegate { SendMailMessage(message); });
}
于 2012-07-03T07:58:04.673 回答