سؤال

كيف يمكنني حفظ كائن 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)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top