【问题标题】:Sending Email to SpecifiedPickupDirectory with MailKit使用 MailKit 向 SpecifiedPickupDirectory 发送电子邮件
【发布时间】:2017-02-17 05:05:33
【问题描述】:

到目前为止,我一直在使用 SmtpClient 和 ASP.NET MVC 5。为了在本地系统上测试电子邮件发送功能,我使用的是 client.DeliveryMethod = SmtpDeliveryMethod.SpecifiedPickupDirectory;

现在,我想在目前还没有实现 SmtpClient 类的 ASP.NET Core 中做同样的事情。对此的所有搜索都以MailKit 结束。我使用了他们的发送邮件代码,该代码在 gmail 上运行良好。

我不想每次都发送测试邮件,我的项目中可能有很多场景需要发送邮件。如何通过 MailKit 使用本地电子邮件发送功能。任何链接或少量源代码都会有所帮助。谢谢

【问题讨论】:

    标签: c# email smtp asp.net-core mailkit


    【解决方案1】:

    我不确定SmtpDeliveryMethod.SpecifiedPickupDirectory 的工作原理和具体作用的详细信息,但我怀疑它可能只是将邮件保存在本地 Exchange 服务器定期检查要发送的邮件的目录中。

    假设是这样,你可以这样做:

    public static void SaveToPickupDirectory (MimeMessage message, string pickupDirectory)
    {
        do {
            // Generate a random file name to save the message to.
            var path = Path.Combine (pickupDirectory, Guid.NewGuid ().ToString () + ".eml");
            Stream stream;
    
            try {
                // Attempt to create the new file.
                stream = File.Open (path, FileMode.CreateNew);
            } catch (IOException) {
                // If the file already exists, try again with a new Guid.
                if (File.Exists (path))
                    continue;
    
                // Otherwise, fail immediately since it probably means that there is
                // no graceful way to recover from this error.
                throw;
            }
    
            try {
                using (stream) {
                    // IIS pickup directories expect the message to be "byte-stuffed"
                    // which means that lines beginning with "." need to be escaped
                    // by adding an extra "." to the beginning of the line.
                    //
                    // Use an SmtpDataFilter "byte-stuff" the message as it is written
                    // to the file stream. This is the same process that an SmtpClient
                    // would use when sending the message in a `DATA` command.
                    using (var filtered = new FilteredStream (stream)) {
                        filtered.Add (new SmtpDataFilter ());
    
                        // Make sure to write the message in DOS (<CR><LF>) format.
                        var options = FormatOptions.Default.Clone ();
                        options.NewLineFormat = NewLineFormat.Dos;
    
                        message.WriteTo (options, filtered);
                        filtered.Flush ();
                        return;
                    }
                }
            } catch {
                // An exception here probably means that the disk is full.
                //
                // Delete the file that was created above so that incomplete files are not
                // left behind for IIS to send accidentally.
                File.Delete (path);
                throw;
            }
        } while (true);
    }
    

    上面的代码 sn-p 使用Guid.NewGuid () 作为生成临时文件名的一种方式,但您可以使用任何您想要的方法(例如,您也可以选择使用message.MessageId + ".eml")。

    基于微软的referencesource,当使用SpecifiedPickupDirectory时,他们实际上也使用Guid.NewGuid ().ToString () + ".eml",所以这可能是要走的路。

    【讨论】:

    • 感谢“Mailkit”的工作和这个答案。它工作正常。
    • 这个答案也在 jstedfast 的 MailKit FAQ page.
    猜你喜欢
    • 2020-01-17
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 2021-08-25
    • 2019-10-14
    • 1970-01-01
    • 2015-09-21
    • 2023-03-18
    相关资源
    最近更新 更多