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


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

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


75
2017-08-12 07:16


asal


Jawaban:


Untuk kesederhanaan, saya hanya akan mengutip penjelasan dari a Hubungkan item:

Anda benar-benar dapat mengkonfigurasi   SmtpClient mengirim email ke file   sistem bukan jaringan. Kamu bisa   lakukan 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 mengatur ini di Anda   file konfigurasi aplikasi seperti   ini:

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

Setelah mengirim email, Anda harus   lihat file email ditambahkan ke   direktori yang Anda tentukan. Anda bisa melakukannya   memiliki proses terpisah untuk mengirimkan   pesan email dalam mode batch.

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


105
2017-08-12 07:29



Berikut ini metode ekstensi untuk mengonversi MailMessage ke aliran yang berisi data EML. Ini jelas sedikit hack karena menggunakan sistem file, tetapi itu berhasil.

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 streaming yang dikembalikan dan melakukan apa yang Anda inginkan, termasuk menyimpan ke lokasi lain di disk atau menyimpan di bidang basis data, atau bahkan mengirim email sebagai lampiran.


23
2018-05-28 23:26



Untuk satu alasan atau yang lain, client.send gagal (tepat setelah pengiriman yang sebenarnya menggunakan metode itu) jadi saya mencolokkan aliran 'ole CDO dan ADODB yang baik. Saya juga harus memuat CDO.message dengan template.eml sebelum mengatur nilai .Message. Tetapi 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)

0
2018-03-10 07:49