用MailKit发送电子邮件到指定的pickupdirectory



我一直使用SmtpClient到现在与ASP。asp.net MVC 5。为了在本地系统上测试电子邮件发送功能,我使用client.DeliveryMethod = SmtpDeliveryMethod.SpecifiedPickupDirectory;

现在,我想在ASP中做同样的事情。到目前为止,它还没有实现SmtpClient类。所有的搜索结果都出现在MailKit上。我使用了他们的邮件发送代码,它在gmail中工作得很好。

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

我不确定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);
}

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

根据微软的参考资源,当使用SpecifiedPickupDirectory时,他们实际上也使用Guid.NewGuid ().ToString () + ".eml",所以这可能是可行的方法。

相关内容

  • 没有找到相关文章

最新更新