发送多封具有交易行为的电子邮件(如果失败,则不会发送任何电子邮件)

Sending multiple emails with transaction behavior (if one fails no emails get send)

抱歉,如果我找不到现有的 post 我的问题。

我想做的事情如下:

我只想发送几封电子邮件 (2-3) 给不同的人,更重要的是,内容不同。这些电子邮件是官方的、重要的并且也记录在系统中。长话短说,当由于某种原因其中一个无法阻止其他人的发送时,我需要。我需要全部发送或 none 个。

到目前为止我做了什么

我工作的系统已经不是第一次自动发送邮件了。该应用程序是一个 ASP MVC 网站。所以前段时间,我安装了 MvcMailer(MvcMailer) 并按照解释的方式使用它。它工作得很好,所以我喜欢预览电子邮件的想法(因为你可以给它一个发送视图)。

所以,鉴于我的新问题,我仔细阅读了 MvcMailer 文档,没有找到任何关于以类似事务的方式发送多封电子邮件的信息。想不出一种方法来强迫他们以这种方式行事。在我发送电子邮件的测试中,即使它是一封带有几个抄送的电子邮件,所有工作邮件都会发送,只有其中一封失败(错误的电子邮件名称,关闭的端口......等等)。

我希望有人能建议我实现这样的目标的方法。我希望我的解释足够,如果不够,请告诉我,我会为您提供所需的所有详细信息。

如果用 MvcMailer 做不到,那么用其他工具可以吗?

到目前为止我的实施:(请记住我仍处于测试阶段)

public class MailerController : Controller
{
   private MailerRepository mailerRep;

   public MailerController()
   {
       this.mailerRep = new MailerRepository();
   }

   public void TestTransmittalEmail()
   {
       var model = this.mailerRep.GetTransmittalModel(1234); //I've stucked a specific clientId
       var mailer = new TransmittalsMailer();
       mailer.TransmittalEmail(model).Send();
   }
}

public class TransmittalsMailer : MailerBase
{
    public TransmittalsMailer()
    {

    }

    public MvcMailMessage TransmittalEmail(TransmittalManifestModel model)
    {
        var mailMessage = new MvcMailMessage() { Subject = "Transmittals - TESTING EMAIL" };
        //embedding a few images in the email
        var resources = new Dictionary<string, string>();
        resources["logo"] = PDFResourcePaths.VripackLogo;
        resources["companyInfo"] = PDFResourcePaths.CompanyInfoBlock;

        mailMessage.To.Add("test1@email.com");

        mailMessage.Attachments.Add(new Attachment(@"D:\ASD\TransmittalFolders\Archives0812.1433.MMA.rar"));

        ViewData["model"] = model;
        this.PopulateBody(mailMessage, "TransmittalEmailView", resources);

        return mailMessage;
    }
}

这其实是一个比较难解决的问题。这是因为当您发送电子邮件时,只要可以找到 SMTP 服务器,它就会工作(不会抛出异常)。

所以您基本上必须等待任意时间,并检查您发送邮件的收件箱是否存在投递失败。如果交付失败,您将停止发送。

长话短说,您可能不应该这样做。您应该简单地发送所有这三个并通过其他方式(可能是另一封电子邮件)通知自己失败以及哪封电子邮件失败。

您可以检查是否抛出异常,然后取消发送后续邮件,直到问题得到解决。但是,这仅处理您发送每封电子邮件的问题。如果前两封邮件发送成功,最后一封抛出异常,则无法取消发送第一封邮件。

一个可能的解决方法(虽然很丑陋)是首先将电子邮件发送到您控制的电子邮件地址。如果在此步骤抛出异常,请记录错误,并且在处理错误之前不要发送任何进一步的电子邮件。如果没有出现异常,请发送电子邮件。但是,这不能也不能处理收件人方面可能发生的问题。

不能保证发送失败通知,因为根据您的 SMTP 和收件人 SMTP 的配置,可能不会发送发送失败通知。即使启用了发送失败通知,也可能几天都不会发送通知(在我之前的一份工作中,电子邮件发送失败通知直到 14 天后才发送)。

理想情况下,在您向任何人发送任何文档之前,应在初始输入电子邮件地址时处理此问题。您只需向相关电子邮件地址发送一封验证电子邮件,然后让用户点击验证 link 返回您控制的 Web 服务。在此之前,您不会向预期的收件人发送任何电子邮件。