Bagaimana cara menyimpan objek MailMessage ke disk sebagai file * .eml atau * .msg

88

Bagaimana cara menyimpan objek MailMessage ke disk? Objek MailMessage tidak mengekspos metode Save () apa pun.

Saya tidak punya masalah jika menyimpan dalam format apa pun, * .eml atau * .msg. Ada ide bagaimana caranya mengerjakan ini?

ashwnacharya
sumber

Jawaban:

124

Untuk mempermudah, saya hanya akan mengutip penjelasan dari item Connect :

Anda sebenarnya dapat mengkonfigurasi SmtpClient untuk mengirim email ke sistem file, bukan ke jaringan. Anda dapat melakukan ini secara terprogram menggunakan kode berikut:

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

Anda juga dapat mengaturnya di file konfigurasi aplikasi Anda seperti ini:

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

Setelah mengirim email, Anda akan melihat file email ditambahkan ke direktori yang Anda tentukan. Anda kemudian dapat memiliki proses terpisah untuk mengirimkan pesan email dalam mode batch.

Anda seharusnya dapat menggunakan konstruktor kosong daripada yang terdaftar, karena konstruktor tidak akan mengirimkannya.

Ryan Versaw
sumber
1
Saya telah menemukan bahwa saya juga perlu menambahkan <network host = "...", dll. Selain yang disediakan Ryan.
Steven Rogers
10
Apakah ada cara untuk mengubah nama file dari file .eml keluaran? Saya lebih suka tidak terlihat seperti berikut: f80f4695-551c-47d7-8879-40ad89707b23.eml Terima kasih!
buzzzzjay
8
Meskipun posting lama, saya ingin menambahkan jawaban untuk pertanyaan terakhir dari @buzzzzjay: lihat di sini: tautan
Corné Hogerheijde
Terima kasih untuk tautannya, itu sangat membantu!
buzzzzjay
bagus, itu berhasil untuk saya. Selanjutnya bagaimana saya bisa membuka Outlook untuk membuka file yang baru saja disimpan di sisi klien.
Pembangun
29

Berikut adalah metode ekstensi untuk mengonversi MailMessage menjadi aliran yang berisi data EML. Ini jelas sedikit hack karena menggunakan sistem file, tetapi berfungsi.

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

Anda kemudian dapat mengambil aliran yang dikembalikan dan melakukan apa yang Anda inginkan, termasuk menyimpan ke lokasi lain di disk atau menyimpan di bidang database, atau bahkan mengirim email sebagai lampiran.

layar
sumber
1
Hai Saille ... Kode Anda berfungsi dengan baik dan ya itu membuat file eml atau Msg tetapi saya tidak dapat membukanya di MS outlook :( Butuh bantuan Anda untuk melakukan itu.
Rahul Jain
2
File .EML akan terbuka di Outlook, tetapi jika Anda tidak bisa, coba ganti nama ekstensi file menjadi .MHT, lalu buka di Internet Explorer.
saille
Saille - apakah mungkin untuk menyimpan tanpa alamat "dari", sehingga dapat dikirim dari pengguna yang membukanya? Bersulang.
Andy Jones
Anda harus mencobanya. Saya membayangkan klien email Anda ingin menyetel alamat balas-ke sesuai dengan setelannya.
saille
7

Jika Anda menggunakan Mailkit . Cukup tulis kode di bawah ini

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

Karena satu dan lain alasan, klien.send gagal (tepat setelah pengiriman sebenarnya menggunakan metode itu) jadi saya memasang aliran CDO dan ADODB yang bagus. Saya juga harus memuat CDO.message dengan template.eml sebelum mengatur nilai .Message. Tapi itu berhasil.

Karena yang di atas adalah C di sini adalah satu untuk 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)
Gregory Way
sumber
Selamat datang di StackOverflow! Karena pertanyaannya adalah dengan tag c # , jawaban dalam bahasa lain tidak membantu, maaf.
Hille
0

coba ini

silakan gunakan 2 referensi ini (menggunakan MailBee;) (menggunakan 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;
        }

    }
Mohamed Husama
sumber