2009-08-12 20 views

risposta

102

Per semplicità, mi limiterò a citare un chiarimento da un Connect item:

Si può effettivamente configurare il SmtpClient per inviare messaggi di posta elettronica al sistema anziché la rete di file . È possibile fare questo a livello di codice utilizzando il seguente codice:

SmtpClient client = new SmtpClient("mysmtphost"); 
client.DeliveryMethod = SmtpDeliveryMethod.SpecifiedPickupDirectory; 
client.PickupDirectoryLocation = @"C:\somedirectory"; 
client.Send(message); 

È inoltre possibile impostare questa funzione nel file di configurazione un'applicazione come questo:

<configuration> 
    <system.net> 
     <mailSettings> 
      <smtp deliveryMethod="SpecifiedPickupDirectory"> 
       <specifiedPickupDirectory pickupDirectoryLocation="C:\somedirectory" /> 
      </smtp> 
     </mailSettings> 
    </system.net> 
</configuration> 

Dopo aver inviato l'e-mail , devi vedere i file di posta elettronica aggiunti alla directory specificata. È quindi possibile fare in modo che invii i messaggi e-mail in modalità batch.

Dovresti essere in grado di utilizzare il costruttore vuoto anziché quello elencato, in quanto non lo invierà comunque.

+1

Ho scoperto che ho anche bisogno di aggiungere il

+8

C'è un modo per cambiare il nome del file .eml in uscita? Preferisco che non assomigli al seguente: f80f4695-551c-47d7-8879-40ad89707b23.eml Grazie! – buzzzzjay

+6

Sebbene sia un vecchio post, vorrei aggiungere una risposta all'ultima domanda da @buzzzzjay: dai uno sguardo qui: [link] (http://www.codeproject.com/Articles/32434/Adding-Save-functionality- to-Microsoft-Net-Mail-Ma) –

22

Ecco un metodo di estensione per convertire un oggetto MailMessage in un flusso contenente i dati EML. Ovviamente è un po 'un hack perché usa il file system, ma funziona.

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); 
     } 
    } 
} 

Si può quindi prendere il flusso questo è restituiti e fare quello che vuoi con esso, tra cui il salvataggio in un'altra posizione sul disco o la memorizzazione in un campo di database, o anche via email come allegato.

+1

Ciao Saille ... Il tuo codice funziona bene e sì sta creando il file eml o Msg ma non posso aprirlo in Outlook MS :(Ho bisogno del tuo aiuto per farlo. –

+2

Il file .EML dovrebbe aprirsi in Outlook, ma se non puoi, prova a rinominare l'estensione del file in.MHT, quindi aprilo in Internet Explorer. – saille

+0

Saille - è possibile salvare senza un indirizzo "from", quindi può essere inviato dall'utente che lo apre? Saluti. –

0

Per un motivo o per un altro il client.send non è riuscito (subito dopo l'invio effettivo utilizzando tale metodo), quindi ho inserito un buon flusso di CDO e ADODB. Ho anche dovuto caricare CDO.message con un template.eml prima di impostare i valori .Message. Ma funziona.

Dato quanto sopra uno è C qui è uno per 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) 
Problemi correlati