我一直使用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"
,所以这可能是可行的方法。