كيفية حفظ كائن MailMessage على القرص باسم * .ml أو * .msg
-
13-09-2019 - |
سؤال
كيف يمكنني حفظ كائن MailMessage على القرص؟ لا يعرض كائن MailMessage أي طرق حفظ ().
ليس لدي مشكلة إذا كان يحفظ بأي شكل، * .eml أو * .msg. أي فكرة عن كيفية القيام بذلك؟
المحلول
للبساطة، سأقتبس فقط تفسيرا من ربط البند:
يمكنك بالفعل تكوين SMTPClient لإرسال رسائل البريد الإلكتروني إلى نظام الملفات بدلا من الشبكة. يمكنك القيام بذلك برمجيا باستخدام التعليمات البرمجية التالية:
SmtpClient client = new SmtpClient("mysmtphost"); client.DeliveryMethod = SmtpDeliveryMethod.SpecifiedPickupDirectory; client.PickupDirectoryLocation = @"C:\somedirectory"; client.Send(message);
يمكنك أيضا ضبط هذا في ملف تكوين التطبيق الخاص بك مثل هذا:
<configuration>
<system.net>
<mailSettings>
<smtp deliveryMethod="SpecifiedPickupDirectory">
<specifiedPickupDirectory pickupDirectoryLocation="C:\somedirectory" />
</smtp>
</mailSettings>
</system.net>
</configuration>
بعد إرسال البريد الإلكتروني، يجب أن تشاهد إضافة ملفات البريد الإلكتروني إلى الدليل الذي حددته. يمكنك بعد ذلك الحصول على عملية منفصلة إرسال رسائل البريد الإلكتروني في وضع الدفعات.
يجب أن تكون قادرا على استخدام المنشئ الفارغ بدلا من المرء المذكور، لأنه لن يرسله على أي حال.
نصائح أخرى
فيما يلي طريقة تمديد لتحويل MailMessage إلى دفق يحتوي على بيانات EML. من الواضح أنه قليلا من الاختراق لأنه يستخدم نظام الملفات، لكنه يعمل.
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);
}
}
}
يمكنك بعد ذلك تناول الدفق الذي تم إرجاعه ويفعله كما تريد معه، بما في ذلك حفظ موقع آخر على القرص أو تخزينه في حقل قاعدة بيانات، أو حتى إرسال بريد إلكتروني كمرفق.
إذا كنت تستخدم mailkit.. وبعد فقط اكتب أدناه الرمز
string fileName = "your filename full path";
MimeKit.MimeMessage message = CreateMyMessage ();
message.WriteTo(fileName);
لسبب واحد أو آخر العميل. فشلت SENTEND (مباشرة بعد إرسال الفعلي باستخدام هذه الطريقة) لذلك قمت بتوصيل جيد "OLE CDO و ADODB Stream. كان علي أيضا تحميل CDO.Message مع template.eml قبل ضبط قيم .Message. لكنها تعمل.
منذ ما سبق هو C هنا هو واحد ل 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)