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?
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:
Để đơ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ó.
Đâ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.
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)
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;
}
}