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


77
32
Phan Phước Bình
10 năm trước

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 vấn đề gì 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?

Hữu ích 77 Yêu thích 32 Chia sẻ Viết bình luận 0
Không hữu ích

4 Trả lời


114
Ngô Bình Dương
10 năm trước

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

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ể thực hiện việc này bằng cách sử dụng mã sau đây:

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 bạn như thế này:

 <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 biệt gửi các email trong chế độ hàng loạt.

Bạn sẽ có thể sử dụng hàm tạo rỗng thay vì hàm được liệt kê, vì dù sao nó cũng sẽ không gửi nó.

Hữu ích 114 Trả lời hay nhất Chia sẻ Viết bình luận 5
Không hữu ích

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

Hữu ích 9 · Không hữu ích · Trả lời 0

Mặc dù một bài viết cũ, tôi muốn thêm một câu trả lời cho câu hỏi cuối cùng từ @buzzzzjay: hãy xem tại đây: link

Hữu ích 7 · Không hữu ích · Trả lời 0

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

Hữu ích 1 · Không hữu ích · Trả lời 0

Cảm ơn các liên kết, đó là thực sự hữu ích!

Hữu ích 0 · Không hữu ích · Trả lời 0

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

Hữu ích 0 · Không hữu ích · Trả lời 0

24
Trần Hương Xuân
6 năm trước

Đây là một phương thức mở rộng để chuyển đổi MailMessage thành luồng chứa dữ liệu EML. Nó rõ ràng là một chút hack vì nó sử dụng hệ thống tập tin, 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à thực hiện theo ý muố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.

Hữu ích 24 Chia sẻ Viết bình luận 4
Không hữu ích

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ở tệp đó trong Internet Explorer.

Hữu ích 2 · Không hữu ích · Trả lời 0

Xin chào saille ... Mã của bạn hoạt động tốt và có, nó đang tạo tệp eml hoặc Msg nhưng tôi không thể mở nó trong triển vọng của MS :( Cần sự giúp đỡ của bạn trong việc đó.

Hữu ích 1 · Không hữu ích · Trả lời 0

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.

Hữu ích 0 · Không hữu ích · Trả lời 0

Bạn sẽ 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ó.

Hữu ích 0 · Không hữu ích · Trả lời 0

2
Ngô Quang Ngọc
1 năm trước

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);
Hữu ích 2 Chia sẻ Viết bình luận 0
Không hữu ích

0
Ngô Minh Huy
2 năm trước

Vì lý do này hay lý do khác, client.send không thành công (ngay sau khi gửi thực tế bằng phương thức đó), vì vậy tôi đã cắm vào luồng 'ole 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 nên đây là một 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)
Hữu ích 0 Chia sẻ Viết bình luận 0
Không hữu ích

Trả lời của bạn

Xem trước nội dung