Bagaimana cara menyimpan objek MailMessage ke disk? Objek MailMessage tidak mengekspos metode Save () apa pun.
Saya tidak punya masalah jika menyimpan dalam format apa pun, * .eml atau * .msg. Ada ide bagaimana caranya mengerjakan ini?
Bagaimana cara menyimpan objek MailMessage ke disk? Objek MailMessage tidak mengekspos metode Save () apa pun.
Saya tidak punya masalah jika menyimpan dalam format apa pun, * .eml atau * .msg. Ada ide bagaimana caranya mengerjakan ini?
Jawaban:
Untuk mempermudah, saya hanya akan mengutip penjelasan dari item Connect :
Anda sebenarnya dapat mengkonfigurasi SmtpClient untuk mengirim email ke sistem file, bukan ke jaringan. Anda dapat melakukan 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 mengaturnya di file konfigurasi aplikasi Anda seperti ini:
<configuration>
<system.net>
<mailSettings>
<smtp deliveryMethod="SpecifiedPickupDirectory">
<specifiedPickupDirectory pickupDirectoryLocation="C:\somedirectory" />
</smtp>
</mailSettings>
</system.net>
</configuration>
Setelah mengirim email, Anda akan melihat file email ditambahkan ke direktori yang Anda tentukan. Anda kemudian dapat memiliki proses terpisah untuk mengirimkan pesan email dalam mode batch.
Anda seharusnya dapat menggunakan konstruktor kosong daripada yang terdaftar, karena konstruktor tidak akan mengirimkannya.
Berikut adalah metode ekstensi untuk mengonversi MailMessage menjadi aliran yang berisi data EML. Ini jelas sedikit hack karena menggunakan sistem file, tetapi berfungsi.
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 aliran yang dikembalikan dan melakukan apa yang Anda inginkan, termasuk menyimpan ke lokasi lain di disk atau menyimpan di bidang database, atau bahkan mengirim email sebagai lampiran.
Karena satu dan lain alasan, klien.send gagal (tepat setelah pengiriman sebenarnya menggunakan metode itu) jadi saya memasang aliran CDO dan ADODB yang bagus. Saya juga harus memuat CDO.message dengan template.eml sebelum mengatur nilai .Message. Tapi 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)
coba ini
silakan gunakan 2 referensi ini (menggunakan MailBee;) (menggunakan 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;
}
}