从控制器发送电子邮件时延迟

杰普·克里斯滕森(Jeppe Christensen)

我有一个控制器,该控制器发送电子邮件,并向我的ajax脚本返回“成功” json响应。

控制器如下所示:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult EmailSend(string input1)
    {

        EmailSignup person = new EmailSignup { emailhasbeensent = false, Email = input1 };

        try
        {
            SmtpClient client = new SmtpClient("smtp.gmail.com", 587);
            client.EnableSsl = true;
            client.UseDefaultCredentials = false;
            client.DeliveryMethod = SmtpDeliveryMethod.Network;
            client.Credentials = new NetworkCredential("Email", "PW");

            MailMessage message = new MailMessage();
            message.From = new MailAddress("Email");
            message.To.Add(person.Email);
            message.Subject = "Thank you for subscribing";
            message.Body = "You have now subscribed for our newsletter";
            message.IsBodyHtml = true;
            client.Send(message);
            person.emailhasbeensent = true;
            return Json(new { status = "success" });
        }

        catch (Exception ex)
        {
            return Json(new { status = "error" });
        }
    }

不幸的是,在发送成功响应之前会有一个延迟,这意味着在接收到成功响应之前,正在其中输入电子邮件的页面有点“空”。

有没有一种方法可以加快此过程,以便立即发送响应?如果不是,是否可以实现加载栏,以向用户显示“幕后”正在发生什么?

y州

理想情况下,您应该考虑将耗时的过程移出UI线程,并将此工作转移到其他过程。例如,您可以将此信息(对于toAddress您的情况,为电子邮件所需要的最少信息)发送到队列,其他进程将从该队列中读取并发送电子邮件。正确使用跨国队列还可以确保容错能力。

另一个解决方案是将这项工作从ThreadPool交给另一个线程,以便您的UI线程无需等待代码完成执行即可。很难跟踪其他线程何时未能成功完成操作!

private void SendEmail(string emailAddress)
{
    // Your existing code to send email goes here 
    // Make sure you handle(LOG) exceptions

}

[HttpPost]
public ActionResult EmailSend(string input1)
{
    try
    {
        // Have another thread executes the SendEmail method
        Task.Run(() => { SendEmail(input1); });  
        return Json(new { status = "success" });
    }
    catch (Exception ex)
    {
        //to do : LOG exceptions
        return Json(new { status = "error" });
    }
}

现在,如果您不想执行所有这些操作,则可以在客户端显示一些“正在加载”消息,以便用户知道正在发生的事情。下面的示例将按钮文本更改为“请稍候...”。并禁用该按钮,以便用户在我们从ajax调用返回响应之前不会再次单击它。

$(function () {
    $("#emailSignup").click(function (e) {
        e.preventDefault();
        var _this = $(this);
        _this.text("Please wait...").attr("disabled", "disabled");

        $.ajax({
            type: 'POST',
            url: "@Url.Action("EmailSend", "Home")",
            data: { input1: "Some value" },
        }).done(function (res) {
            if (res.status === "success") {
                $("#MailFoot").hide();
                $("#ty").show();
            }
            else {
                _this.text("Please wait...").removeAttr("disabled");
                alert("Error sending email");
            }
        });
    });
})

除了简单地更新按钮文本,您还可以做任何您想做的事情!也许显示进度条?微调器?只需在页面中保留一个微调器图像(最初隐藏),并在ajax调用开始/结束/时根据需要显示/隐藏

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

您如何在Shopware 6控制器中发送电子邮件?

如何使用MVC通过控制器发送电子邮件

从codeigniter控制器发送电子邮件后,无法在jquery中获得响应

NodeJS延迟发送电子邮件

延迟发送电子邮件(外观)

电子邮件未在注册控制器中发送

测试没有控制器的电子邮件发送

Symfony3-后台任务由控制器启动,完成后发送电子邮件

Asp.Net Core 创建一个控制器来使用 SendGrid 发送电子邮件

Postfix延迟几天发送电子邮件

通过计时器控制自动发送电子邮件

回送电子邮件连接器不发送电子邮件

使用回送电子邮件连接器发送电子邮件

无法发送电子邮件 - Azure MVC 站点在尝试通过控制器将表单发布到 ajax 请求时从 jquery.min.js:2 返回 404

注册用户时发送电子邮件时出错

发送电子邮件时隐藏“发送至电子邮件”地址

Django:为什么控制台电子邮件后端不发送电子邮件?

当传感器有一定水位时,Python发送电子邮件

在GoDaddy服务器上发送电子邮件时出错:Laravel 5.1

当我尝试发送电子邮件时,SMTP服务器需要安全的连接

Postfix 在发送电子邮件时尝试联系错误的服务器?

表更新时从MySQL触发器发送电子邮件

有安全更新时,如何使服务器向我发送电子邮件?

呼叫身份服务器4登录时如何发送电子邮件ID

仅在磁盘驱动器低于阈值时发送电子邮件

Powershell脚本-仅在驱动器空间低于MinThreshold时发送电子邮件

运行远程服务器时无法使用Java代码发送电子邮件

发送电子邮件时 Laravel 7 内部服务器错误 500

如何从Ubuntu服务器发送电子邮件?