4 ответов:
для простоты, я просто процитирую объяснение с подключить пункт:
вы можете фактически настроить SmtpClient для отправки писем в файл система вместо сети. Вы можете сделайте это программно с помощью следующий код:
SmtpClient client = new SmtpClient("mysmtphost"); client.DeliveryMethod = SmtpDeliveryMethod.SpecifiedPickupDirectory; client.PickupDirectoryLocation = @"C:\somedirectory"; client.Send(message);вы также можете настроить это в вашем файл конфигурации приложения, например это:
<configuration> <system.net> <mailSettings> <smtp deliveryMethod="SpecifiedPickupDirectory"> <specifiedPickupDirectory pickupDirectoryLocation="C:\somedirectory" /> </smtp> </mailSettings> </system.net> </configuration>после отправки электронной почты, вы должны смотрите электронную почту файлы добавляются в каталог, который вы указали. Тогда вы можете есть отдельный процесс отправить сообщения электронной почты в пакетном режиме.
вы должны иметь возможность использовать пустой конструктор вместо одного из перечисленных, так как он не будет отправлять его в любом случае.
вот метод расширения для преобразования MailMessage в поток, содержащий данные EML. Его, очевидно, немного взломать, как он использует файловую систему, но это работает.
public static void SaveMailMessage(this MailMessage msg, string filePath) { using (var fs = new FileStream(filePath, FileMode.Create)) { msg.ToEMLStream(fs); } } /// <summary> /// Converts a MailMessage to an EML file stream. /// </summary> /// <param name="msg"></param> /// <returns></returns> public static void ToEMLStream(this MailMessage msg, Stream str) { using (var client = new SmtpClient()) { var id = Guid.NewGuid(); var tempFolder = Path.Combine(Path.GetTempPath(), Assembly.GetExecutingAssembly().GetName().Name); tempFolder = Path.Combine(tempFolder, "MailMessageToEMLTemp"); // create a temp folder to hold just this .eml file so that we can find it easily. tempFolder = Path.Combine(tempFolder, id.ToString()); if (!Directory.Exists(tempFolder)) { Directory.CreateDirectory(tempFolder); } client.UseDefaultCredentials = true; client.DeliveryMethod = SmtpDeliveryMethod.SpecifiedPickupDirectory; client.PickupDirectoryLocation = tempFolder; client.Send(msg); // tempFolder should contain 1 eml file var filePath = Directory.GetFiles(tempFolder).Single(); // stream out the contents using (var fs = new FileStream(filePath, FileMode.Open)) { fs.CopyTo(str); } if (Directory.Exists(tempFolder)) { Directory.Delete(tempFolder, true); } } }затем вы можете взять поток, который возвращается, и делать с ним все, что хотите, включая сохранение в другое место на диске или хранение в поле базы данных или даже отправку по электронной почте в качестве вложения.
по той или иной причине клиент.отправить не удалось (сразу после фактической отправки с помощью этого метода), поэтому я подключил good 'ole CDO и adodb stream. Мне также пришлось загрузить CDO.сообщение с шаблоном.эмл перед установкой .Значения сообщений. Но это работает.
Так как выше один C здесь один для VB
MyMessage.From = New Net.Mail.MailAddress(mEmailAddress) MyMessage.To.Add(mToAddress) MyMessage.Subject = mSubject MyMessage.Body = mBody Smtp.Host = "------" Smtp.Port = "2525" Smtp.Credentials = New NetworkCredential(------) Smtp.Send(MyMessage) ' Actual Send Dim oldCDO As CDO.Message oldCDO = MyLoadEmlFromFile("template.eml") ' just put from, to, subject blank. leave first line blank oldCDO.To = mToAddress oldCDO.From = mEmailAddress oldCDO.Subject = mSubject oldCDO.TextBody = mBody oldCDO.HTMLBody = mBody oldCDO.GetStream.Flush() oldCDO.GetStream.SaveToFile(yourPath)
Если вы используете Mailkit. Просто напишите ниже код
string fileName = "your filename full path"; MimeKit.MimeMessage message = CreateMyMessage (); message.WriteTo (fileName);
Comments