2009-08-12 1 views

ответ

102

Для простоты, я просто процитирую объяснение от Connect item:

Вы действительно можете настроить 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> 

После отправки электронной почты , вы должны см. файлы электронной почты, которые будут добавлены в каталог , который вы указали. После этого вы можете отправить сообщения электронной почты в пакетном режиме.

Вы должны иметь возможность использовать пустой конструктор вместо указанного в списке, так как он все равно не отправит его.

+1

Я обнаружил, что мне нужно, чтобы добавить <сетевой хост = «...» и т.д., в дополнение к тому, что при условии, Райан , –

+8

Есть ли способ изменить имя файла выходного файла .eml? Я бы предпочел, чтобы это не выглядело так: f80f4695-551c-47d7-8879-40ad89707b23.eml Спасибо! – buzzzzjay

+6

Хотя старый пост, я хотел бы добавить ответ на последний вопрос из @buzzzzjay: посмотрите здесь: [link] (http://www.codeproject.com/Articles/32434/Adding-Save-functionality- to-Microsoft-Net-Mail-Ma) –

22

Вот метод расширения для преобразования 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); 
     } 
    } 
} 

Вы можете взять поток Thats возвратили и делать, как вы хотите с ним, в том числе сохранение в другое место на диске или хранить в поле базы данных, или даже по электронной почте в качестве вложения.

+1

Hi Saille ... Ваш код работает хорошо, и да, он создает файл eml или Msg, но я не могу открыть его в Outlook. (Нужна ваша помощь в этом. –

+2

. Файл в формате .EML должен открыться в Outlook, но если вы не можете, попробуйте переименовать расширение файла.MHT, затем откройте его в Internet Explorer. – saille

+0

Saille - можно ли сохранить его без адреса «от», чтобы его можно было отправить от пользователя, который его открывает? Приветствия. –

0

По той или иной причине клиент.send не удалось (сразу после фактической отправки с использованием этого метода), поэтому я подключил хороший поток OO CDO и ADODB. Мне также пришлось загрузить CDO.message с шаблоном.eml перед установкой значений .Message. Но это работает.

Поскольку выше один 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) 
Смежные вопросы