Come salvare l'oggetto MailMessage su disco come file * .eml o * .msg


88

Come si salva l'oggetto MailMessage sul disco? L'oggetto MailMessage non espone alcun metodo Save ().

Non ho problemi se salva in qualsiasi formato, * .eml o * .msg. Qualche idea su come farlo?

Risposte:


124

Per semplicità, citerò solo una spiegazione da un elemento Connect :

Puoi effettivamente configurare SmtpClient per inviare e-mail al file system invece che alla rete. Puoi farlo a livello di codice utilizzando il codice seguente:

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

Puoi anche impostarlo nel file di configurazione dell'applicazione in questo modo:

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

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

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


1
Ho scoperto che avevo anche bisogno di aggiungere <network host = "...", ecc. Oltre a quanto fornito da Ryan.
Steven Rogers

10
C'è un modo per cambiare il nome del file .eml di output? Preferirei che non assomigliasse al seguente: f80f4695-551c-47d7-8879-40ad89707b23.eml Grazie!
buzzzzjay

8
Sebbene sia un vecchio post, vorrei aggiungere una risposta all'ultima domanda di @buzzzzjay: dai un'occhiata qui: link
Corné Hogerheijde

Grazie per il link, è davvero utile!
buzzzzjay

bene, per me funziona. Inoltre come posso aprire Outlook per aprire il file appena salvato sul lato client.
Costruttore

29

Ecco un metodo di estensione per convertire un MailMessage in un flusso contenente i dati EML. È ovviamente un po 'un trucco in quanto utilizza 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);
        }
    }
}

È quindi possibile prendere il flusso restituito e fare ciò che si desidera, incluso il salvataggio in un'altra posizione su disco o l'archiviazione in un campo del database o persino l'invio di e-mail 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.
Rahul Jain

2
Il file .EML dovrebbe aprirsi in Outlook, ma se non è possibile, prova a rinominare l'estensione del file in .MHT, quindi aprilo in Internet Explorer.
salpano il

Saille - è possibile salvare senza un indirizzo "da", in modo che possa essere inviato dall'utente che lo apre? Saluti.
Andy Jones

Dovresti provarlo. Immagino che il tuo client di posta voglia impostare l'indirizzo di risposta in base alle sue impostazioni.
partenza il

7

Se stai usando Mailkit . Basta scrivere sotto il codice

string fileName = "your filename full path";
MimeKit.MimeMessage message = CreateMyMessage ();
message.WriteTo(fileName);

0

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

Poiché quello sopra è C, ecco 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)

Benvenuto in StackOverflow! Poiché la domanda è con il tag c # , le risposte in altre lingue non sono utili, mi dispiace.
Hille

0

prova questo

si prega di utilizzare questi 2 riferimenti (utilizzando MailBee;) (utilizzando MailBee.Mime;)

    public static string load(string to,string from,string cc,string bcc,string subject,string body, List<string> reportList,string path, bool HtmlbodyType)
    {
        try
        {
            MailBee.Mime.MailMessage msg = new MailBee.Mime.MailMessage();
            msg.From.AsString = from;
            msg.Subject = subject;
            if (HtmlbodyType == true)
            {
                msg.BodyHtmlText = body;
            }
            else
            {
                msg.BodyPlainText = body;
            }
            
            string[] receptionEmail = to.Split(new string[] { ",", ";" }, StringSplitOptions.RemoveEmptyEntries);
            string[] ccEmail = cc.Split(new string[] { ",", ";" }, StringSplitOptions.RemoveEmptyEntries);
            string[] bccEmail = bcc.Split(new string[] { ",", ";" }, StringSplitOptions.RemoveEmptyEntries);
            string message = "";
            foreach (string To in receptionEmail)
            {
                msg.To.Add(To);
            }
            foreach (string CC in ccEmail)
            {
                    msg.Cc.Add(CC);
            }
            foreach (string Bcc in bccEmail)
            {
                    msg.Bcc.Add(Bcc);

            }
                for (int x = 0; x < reportList.Count; x++)
                {
                    string fileName = reportList[x];
                    msg.Attachments.Add(fileName);
                }

                msg.SaveMessage(path);
                return "Success";
            
        }
        catch (Exception ex)
        {
            return ex.Message;
        }

    }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.