SMTP Send هو قفل ملفاتي - C #
-
18-09-2019 - |
سؤال
لدي وظيفة إرسال رسائل (الكثير منها) ومرفقاتها.
إنها حلقات أساسا من خلال هيكل الدليل وإنشاء رسائل بريد إلكتروني من هيكل ملف على سبيل المثال
c:\emails\message01
\attachments
c:\emails\message02
\attachments
إنشاء الرسائل يحدث باستخدام .NET C #، الاشياء القياسية.
بعد إنشاء جميع الرسائل ... لدي وظيفة أخرى تعمل مباشرة بعد ذلك والتي تنسخ مجلد الرسائل إلى موقع آخر.
المشكلة هي - الملفات مغلقة ...
ملاحظة: أنا لا نقل الملفات، فقط نسخها ....
أي اقتراحات حول كيفية نسخ الملفات المقفلة، باستخدام C #؟
تحديث
لدي هذا إضافة طريقة المرفقات
private void AddAttachments(MailMessage mail)
{
string attachmentDirectoryPath = "c:\messages\message1";
DirectoryInfo attachmentDirectory = new DirectoryInfo(attachmentDirectoryPath);
FileInfo[] attachments = attachmentDirectory.GetFiles();
foreach (FileInfo attachment in attachments)
{
mail.Attachments.Add(new Attachment(attachment.FullName));
}
}
المحلول
كيف تقرأ الملفات لإنشاء رسالة البريد الإلكتروني؟ يجب فتحها كما للقراءة فقط، مع FileShare
ضبط ل FileShare.ReadWrite
... ثم لا ينبغي أن تكون مؤمنة. إذا كنت تستخدم FileStream
يجب عليك أيضا لف منطقك في using
الكلمة الرئيسية حتى يتم التخلص من المورد بشكل صحيح.
تحديث:
أعتقد التخلص من رسالة البريد نفسها ستغلق الموارد داخلها وفتح الملفات:
using (var mail = new MailMessage())
{
AddAttachments(mail);
}
// File copy code should work here
نصائح أخرى
أكره الرد على رسالتي الخاصة، ولكن نعم بالنسبة للرجل المستمر التالي الذي لديه هذه المشكلة هنا هو الإصلاح:
بعد إرسال الرسالة
// Send the mail
client.Send(message);
//Clean up attachments
foreach (Attachment attachment in message.Attachments)
{
attachment.Dispose();
}
قم بالتخلص من المرفقات ... مسح القفل، وسوف ترسل الرسائل مع المرفقات. لا يحذف التخلص من الملفات، فقط مسح المرفقات :)
هل تغلق الملفات بعد الانتهاء من قراءةها؟ إذا قمت بفتحها للقراءة، ولكن لا تغلقها عند الانتهاء، يجب أن تبقي قفل عليه حتى يتم إنهاء البرنامج وتغلق تلقائيا جميع الملفات.
MailMessage email = new MailMessage();
email.From = txtFrom.Text;
email.To = txtToEmail.Text;
email.Subject = txtMSubject.Text;
email.Body = txtBody.Text;
SmtpClient mailClient = new SmtpClient();
mailClient.Host = "smtp.emailAddress";
mailClient.Port = 2525;
mailClient.Send(email );
email.Dispose();
// After Disposing the email object you can call file delete
if (filePath != "")
{
if (System.IO.File.Exists(filePath))
{
System.IO.File.Delete(filePath);
}
}
أرى هذا كثيرا عند إرسال المرفقات. أنا عادة استخدام شيء مثل ما يلي:
في التعليمات البرمجية التي تتحرك الملفات إلى موقع مختلف، يمكنك استخدام النمط التالي:
داخل الحلقة للحلقات من خلال الملفات
bool FileOk = false;
while (!FileOk)
{
try
{
// code to move the file
FileOk = true;
}
catch(Exception)
{
// do nothing or write some code to pause the thread for a few seconds.
}
}