MailMessage nesnesini diske * .eml veya * .msg dosyası olarak kaydetme


88

MailMessage nesnesini diske nasıl kaydederim? MailMessage nesnesi, herhangi bir Save () yöntemini açığa çıkarmaz.

* .Eml veya * .msg gibi herhangi bir formatta kaydederse bir sorun yaşamıyorum. Bunu nasıl yapacağına dair bir fikrin var mı?

Yanıtlar:


124

Basit olması için, Connect öğesinden bir açıklamadan alıntı yapacağım :

SmtpClient'i ağ yerine dosya sistemine e-posta gönderecek şekilde yapılandırabilirsiniz. Bunu, aşağıdaki kodu kullanarak programlı olarak yapabilirsiniz:

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

Bunu ayrıca uygulama yapılandırma dosyanızda şu şekilde ayarlayabilirsiniz:

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

E-postayı gönderdikten sonra, belirttiğiniz dizine e-posta dosyalarının eklendiğini görmelisiniz. Daha sonra ayrı bir işlemin e-posta mesajlarını toplu modda göndermesini sağlayabilirsiniz.

Zaten göndermeyeceğinden, listelenen yerine boş kurucuyu kullanabilmelisiniz.


1
Ryan'ın sağladığına ek olarak <network host = "..." vb. Eklemem gerektiğini de fark ettim.
Steven Rogers

10
Çıktı .eml dosyasının dosya adını değiştirmenin herhangi bir yolu var mı? Aşağıdaki gibi görünmemesini tercih ederim: f80f4695-551c-47d7-8879-40ad89707b23.eml Teşekkürler!
buzzzzjay

8
Eski bir gönderi olmasına rağmen, @buzzzzjay'den gelen son soruya bir cevap eklemek istiyorum: buraya bir göz atın: bağlantı
Corné Hogerheijde

Bağlantı için teşekkürler, bu gerçekten yardımcı oldu!
buzzzzjay

iyi, benim için çalışıyor. Ayrıca, istemci tarafında yeni kaydedilmiş dosyayı açmak için Outlook'u nasıl açabilirim.
Builder

29

Bir MailMessage'ı EML verilerini içeren bir akışa dönüştürmek için bir uzantı yöntemi. Açıkçası, dosya sistemini kullandığı için biraz hack, ama işe yarıyor.

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

Daha sonra, geri dönen akışı alıp istediğiniz gibi yapabilirsiniz, diskte başka bir konuma kaydetme veya bir veritabanı alanında depolama, hatta bir ek olarak e-posta gönderme dahil.


1
Merhaba Saille ... Kodunuz iyi çalışıyor ve evet eml veya Msg dosyasını oluşturuyor ancak bunu MS görünümünde açamıyorum :( Bunu yapmak için yardımınıza ihtiyacım var.
Rahul Jain

2
.EML dosyası Outlook'ta açılmalıdır, ancak açamazsanız, dosya uzantısını .MHT olarak yeniden adlandırmayı deneyin, ardından Internet Explorer'da açın.
2014

Saille - "gönderen" adresi olmadan kaydetmek mümkün mü, böylece onu açan kullanıcıdan gönderilebilir mi? Şerefe.
Andy Jones

Denemelisin. Posta istemcinizin yanıt adresini ayarlarına göre ayarlamak isteyeceğini tahmin ediyorum.
Saille

7

Mailkit kullanıyorsanız . Sadece aşağıdaki kodu yazın

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

0

Bir nedenden ötürü client.send başarısız oldu (bu yöntemi kullanarak gerçek bir gönderimden hemen sonra), bu yüzden iyi 'ole CDO ve ADODB akışını taktım. Ayrıca .Message değerlerini ayarlamadan önce bir template.eml ile CDO.message'ı yüklemem gerekiyordu. Ama işe yarıyor.

Yukarıdakiler C olduğundan, burada VB için bir

    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)

StackOverflow'a hoş geldiniz! Soru c # etiketinde olduğu için, diğer dillerdeki cevaplar maalesef yardımcı olmuyor.
Hille

0

bunu dene

lütfen bu 2 referansı kullanın (MailBee kullanarak;) (MailBee.Mime kullanarak;)

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

    }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.