Cách lưu đối tượng MailMessage vào đĩa dưới dạng tệp * .eml hoặc * .msg


87

Làm cách nào để lưu đối tượng MailMessage vào đĩa? Đối tượng MailMessage không hiển thị bất kỳ phương thức Save () nào.

Tôi không gặp sự cố nếu nó lưu ở bất kỳ định dạng nào, * .eml hoặc * .msg. Bất kỳ ý tưởng làm thế nào để làm điều này?

Câu trả lời:


123

Để đơn giản, tôi sẽ chỉ trích dẫn lời giải thích từ mục Connect :

Bạn thực sự có thể định cấu hình SmtpClient để gửi email đến hệ thống tệp thay vì mạng. Bạn có thể làm điều này theo chương trình bằng cách sử dụng mã sau:

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

Bạn cũng có thể thiết lập điều này trong tệp cấu hình ứng dụng của mình như sau:

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

Sau khi gửi email, bạn sẽ thấy các tệp email được thêm vào thư mục bạn đã chỉ định. Sau đó, bạn có thể có một quy trình riêng để gửi email ở chế độ hàng loạt.

Bạn sẽ có thể sử dụng phương thức khởi tạo trống thay vì phương thức được liệt kê, vì nó sẽ không gửi nó.


1
Tôi thấy rằng tôi cũng cần thêm <network host = "...", v.v. ngoài những gì Ryan đã cung cấp.
Steven Rogers

10
Có cách nào để thay đổi tên tệp của tệp .eml đầu ra không? Tôi không muốn nó trông giống như sau: f80f4695-551c-47d7-8879-40ad89707b23.eml Cảm ơn!
buzzzzjay

8
Mặc dù một bài cũ, tôi muốn nói thêm một câu trả lời cho câu hỏi cuối cùng từ @buzzzzjay: có một cái nhìn ở đây: link
Corné Hogerheijde

Cảm ơn vì liên kết, nó thực sự hữu ích!
buzzzzjay

tốt, nó làm việc cho tôi. Hơn nữa, làm cách nào tôi có thể mở Outlook để mở tệp vừa lưu ở phía máy khách.
Builder

29

Đây là một phương pháp mở rộng để chuyển đổi một MailMessage thành một luồng chứa dữ liệu EML. Rõ ràng là nó có một chút hack vì nó sử dụng hệ thống tệp, nhưng nó hoạt động.

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

Sau đó, bạn có thể lấy luồng được trả về và làm như bạn muốn với nó, bao gồm lưu vào vị trí khác trên đĩa hoặc lưu trữ trong trường cơ sở dữ liệu hoặc thậm chí gửi email dưới dạng tệp đính kèm.


1
Hi Saille ... Mã của bạn hoạt động tốt và có nó được tạo ra eml hoặc Msg tập tin nhưng tôi không thể mở rằng trong MS Outlook :( Cần giúp đỡ của bạn trong việc đó.
Rahul Jain

2
Tệp .EML sẽ mở trong Outlook, nhưng nếu bạn không thể, hãy thử đổi tên phần mở rộng tệp thành .MHT, sau đó mở nó trong Internet Explorer.
saille

Saille - có thể lưu mà không có địa chỉ "từ", vì vậy nó có thể được gửi từ người dùng mở nó không? Chúc mừng.
Andy Jones

Bạn phải thử nó. Tôi tưởng tượng ứng dụng thư của bạn sẽ muốn đặt địa chỉ trả lời theo cài đặt của nó.
saille

7

Nếu bạn đang sử dụng Mailkit . Chỉ cần viết mã dưới đây

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

0

Vì lý do này hay lý do khác mà client.send không thành công (ngay sau khi gửi thực tế bằng phương pháp đó) vì vậy tôi đã cắm luồng CDO và ADODB tốt. Tôi cũng phải tải CDO.message bằng template.eml trước khi đặt các giá trị .Message. Nhưng nó đã có tác dụng.

Vì cái ở trên là C ở đây là cái cho 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)

Chào mừng bạn đến với StackOverflow! Vì câu hỏi có thẻ c # , câu trả lời bằng các ngôn ngữ khác không hữu ích, xin lỗi.
Hille

0

thử đi

vui lòng sử dụng 2 tham chiếu này (sử dụng MailBee;) (sử dụng 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;
        }

    }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.