Invia file eml salvati su disco

Sto creando eml e salvandoli in una directory usando la procedura menzionata qui . Voglio sapere come inviare questi file eml? Ho provato a usare l’object della class SMTPClient ma ci vuole l’object MailMessage come parametro e non sono riuscito a trovare il modo per creare un object di tipo MailMessage usando questi file eml salvati.

Caricare un file EML correttamente non è così facile come sembra. Puoi scrivere un’implementazione che funziona nel 95% dei casi entro pochi giorni. Il restante 5% richiederebbe almeno diversi mesi ;-). Lo so, perché sono coinvolto nello sviluppo di uno.

Prendi in considerazione le seguenti dificities:

  • e-mail unicode
  • lingue da destra a sinistra
  • correggere file EML malformati causati da errori ben noti nei client e server di posta più diffusi
  • gestione di S / MIME (messaggi e-mail crittografati e firmati)
  • trattare correttamente con diversi metodi di codifica degli allegati
  • occuparsi di immagini e fogli di stile incorporati incorporati in e-mail HTML
  • assicurandosi che analizzi correttamente un messaggio di tortura MIME di Mike Crispin (coautore di Mime e IMAP RFC)
  • assicurandosi che il messaggio non valido non causi overun del buffer o altro arresto anomalo dell’applicazione
  • gestione dei messaggi gerarchici (messaggio con messaggi allegati)
  • assicurandosi che gestisca correttamente email molto grandi

La maturazione di tale parser richiede anni e feedback continui per i suoi utenti. Al momento non esiste un analizzatore di questo tipo incluso in .NET Framework. Fino a quando non cambierebbe sarebbe meglio ottenere un parser MIME di terze parti partito da un fornitore affermato.

Il codice seguente utilizza il nostro componente Rebex Secure Mail , ma sono sicuro che un’attività simile potrebbe essere replicata facilmente anche con componenti di altri fornitori.

Il codice è basato sul tutorial Mail Message .

// create an instance of MailMessage MailMessage message = new MailMessage(); // load the message from a local disk file message.Load("c:\\message.eml"); // send message Smtp.Send(message, "smtp.example.org"); 

Utilizzare EMLReader per recuperare i dati dal file .eml. Contiene tutti i dati necessari per creare un object MailMessage come Da, A, Oggetto, Corpo e molto altro ancora.

 FileStream fs = File.Open(filePath, FileMode.Open, FileAccess.ReadWrite); EMLReader reader = new EMLReader(fs); fs.Close(); MailMessage message = new System.Net.Mail.MailMessage(reader.From, reader.To, reader.Subject, reader.Body); 

Fai quello che ho fatto … rinunciare.

Costruire l’object MailMessage sembra essere il punto focale in cui ho una domanda simile in sospeso anche qui … Come faccio a mandare un’email quando ho già una stringa?

Da quello che ho visto il modo più semplice per farlo è usare un socket raw per scaricare l’intero contenuto di file .eml fino al server di posta così com’è e lasciare che il server di posta capisca le cose difficili come da, a subject, ect analizzando l’email usando il suo motore.

L’unico problema … RFC 821 … un tale dolore, sto cercando di capire un modo pulito per farlo e leggere anche la posta già nella casella di posta.

MODIFICARE:

Ho trovato una soluzione pulita e l’ho coperta nel mio thread 🙂

Come posso inviare una e-mail quando la ho già come stringa?

Se sei un negozio Microsoft e hai comunque un server Exchange, allora c’è un’altra soluzione che è molto, molto più semplice di qualsiasi altra cosa suggerita qui:

Ogni server di Exchange ha una directory di prelievo configurata immediatamente.
Per impostazione predefinita, è %ExchangeInstallPath%TransportRoles\Pickup .

Basta copiare i file .eml in quella directory e Exchange automaticamente invierà i messaggi.


Leggi questo articolo su TechNet per maggiori informazioni:
Directory di prelievo e directory di riproduzione

Per i record:

Nella console Nuget Packager scrivi:

 Install-Package LumiSoft.Net.dll 

Quindi nel tuo codice:

 using (FileStream fs = new FileStream( cacheFileName, FileMode.Open, FileAccess.Read )) using (LumiSoft.Net.SMTP.Client.SMTP_Client client = new LumiSoft.Net.SMTP.Client.SMTP_Client()) { client.SendMessage( fs ); } 

Come altri hanno dimostrato, EML non è un buon modo per serialize un messaggio di posta. Potresti stare meglio salvando i tuoi messaggi in un altro formato. Mentre ci sono diversi motori di serializzazione nel framework .Net per serializzare qualsiasi object, potresti anche considerare di salvare i componenti delle tue mail, come indirizzi, corpo, file da colbind in base64, in un file Xml di tua progettazione.

Di seguito è riportato un esempio per iniziare:

      Hi Thomas, How are you doing? Bye   cmF0aWUgYWFuIGluIFBERi1mb3JtYWF0LiBEZSBmYWN0dXVyIGlzIGVlbiBvZmZpY2ll ZWwgZ2VzaWduZWVyZA0KZG9jdW1lbnQgdmFuIEV1cm9maW5zIE9tZWdhbSBCVi4gRGUg c2lnbmF0dXJlIGt1bnQgdSB2ZXJpZmnDq3Jlbi4NCg0KVm9vciBoZXQgdmVyaWZpw6ty ...   

Il vantaggio aggiunto sarebbe che, a differenza della creazione di EML, non è necessario smtpClient per creare i file di concetto di posta elettronica.

Xml è estremamente facile da creare e analizzare in C #.

Non hai detto la logica del salvataggio di EML. Se l’archiviazione a lungo termine sarebbe un objective, xml potrebbe avere un vantaggio.

È ansible farlo con il server SMTP integrato di Windows Server, allo stesso modo della risposta precedente utilizzando Exchange.

Trascina il file .eml in C:\inetpub\mailroot\Pickup e il messaggio non elaborato verrà inviato (locale o remoto).

Puoi inoltrare i messaggi semplicemente inserendo una linea in alto:

 To: [email protected] 

È ansible modificare ulteriormente l’intestazione della posta se necessario.