【问题标题】:Sending multiple emails with transaction behavior (if one fails no emails get send)发送多封具有交易行为的电子邮件(如果一封失败,则不会发送电子邮件)
【发布时间】:2016-01-04 18:20:35
【问题描述】:

抱歉,如果我未能找到与我的问题相关的现有帖子。

我想做的是如下:

我只是想向不同的人发送几封电子邮件 (2-3),更重要的是发送不同的内容。这些电子邮件是官方的、重要的,并且也登录了系统。长话短说,我需要他们中的一个由于某种原因未能阻止其他人的发送。我需要要么全部发送,要么一个都不发送。

到目前为止我做了什么

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

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

我希望有人可以建议我一种方法来实现这样的目标。我希望我的解释是足够的,如果没有,请告诉我,我将为您提供所需的所有详细信息。

如果使用 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\1\Archives\150812.1433.MMA.rar"));

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

        return mailMessage;
    }
}

【问题讨论】:

  • 你能展示你的实现吗?您能否缩小“发送失败”的含义?是 SMTP 连接有问题,还是退回电子邮件?
  • 如果我们谈论的是退回邮件/邮件特定的失败。我无法想到可以做到这一点的方法。当然,如果不尝试发送消息,我们无法确定消息是否发送失败,到那时,召回任何可能已经发送的消息为时已晚。你能分享一下你当前的实现/你已经尝试过的东西吗?
  • 当谈到我为实现我想要的目标而专门做的事情时......我没有,我想不出一种可行的方法或实现。在我所展示的内容中(这是使用 MvcMailer 发送的简单电子邮件),我将执行几次(这意味着我将发送相同的邮件,只是给它一个不同的模型 => 其中的不同数据,当然也可以将其发送给不同的用户(目前尚未实现))

标签: c# asp.net-mvc mvcmailer


【解决方案1】:

这实际上是一个很难解决的问题。这是因为当你发送邮件时,只要能找到 SMTP 服务器就可以工作(不会抛出异常)。

因此,您基本上必须等待一些任意时间,然后检查您发送邮件的收件箱是否有投递失败。如果发送失败,您将停止发送。

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

【讨论】:

  • 我会说不可能用电子邮件解决问题,并继续补充说,如果保证交付如此重要,那么您根本不应该使用电子邮件。 SMTP 协议不可靠(不保证送达,有时甚至没有送达/失败通知)和不安全(很容易被欺骗、拦截、更改等)。即使电子邮件被“送达”,它也可能最终出现在他们的垃圾邮件文件夹中,并且没见过。
【解决方案2】:

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

一种可能的解决方法(虽然很丑)是最初将电子邮件发送到您控制的电子邮件地址。如果在此步骤引发异常,请记录错误,并且在处理错误之前不要发送任何进一步的电子邮件。如果没有引发异常,请发送电子邮件。然而,这并不能也不能处理接收方可能发生的问题。

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

理想情况下,这应该在您向任何人发送任何文件之前在初始输入电子邮件地址时处理。您只需向相关电子邮件地址发送一封验证电子邮件,然后让用户单击验证链接返回您控制的 Web 服务。在完成此操作之前,您不会向目标收件人发送任何电子邮件。

【讨论】:

    猜你喜欢
    • 2011-02-08
    • 2016-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-17
    相关资源
    最近更新 更多