2010-05-18 18 views
14

मैं asp.net में मेल भेजने के लिए System.Net.Mail का उपयोग कर रहा हूं .. अनुलग्नक मेल के रूप में भेजने के बाद अनुलग्नक फ़ाइल को कैसे हटाएं .. मैंने फ़ाइल.डिलेट विधि का उपयोग करने का प्रयास किया .. लेकिन मुझे यह त्रुटि मिल रही है .. प्रक्रिया फ़ाइल पथ \ fun.jpg 'तक नहीं पहुंच सकती है क्योंकि इसका उपयोग किसी अन्य प्रक्रिया द्वारा किया जा रहा है। धन्यवादअटैचमेंट फ़ाइल हटाएं

उत्तर

26

MailMessage के निपटान जब आप इसे पूरा कर चुके हैं। यह तब भी आपके द्वारा अटैचमेंट के रूप में जोड़े गए फ़ाइल पर लॉक है जब तक आप ऐसा नहीं कर लेते।

var filePath = "C:\\path\\to\\file.txt"; 
var smtpClient = new SmtpClient("mailhost"); 
using (var message = new MailMessage()) 
{ 
    message.To.Add("[email protected]"); 
    message.From = new MailAddress("[email protected]"); 
    message.Subject = "Test"; 
    message.SubjectEncoding = Encoding.UTF8; 
    message.Body = "Test " + DateTime.Now; 
    message.Attachments.Add(new Attachment(filePath)); 
} 
if (File.Exists(filePath)) File.Delete(filePath); 
Console.WriteLine(File.Exists(filePath)); 

आउटपुट: झूठी

मैं कल्पना कर सकते हैं कि अगर आप अभी भी कुछ संदेश निपटाने के बाद फ़ाइल ताला लगा है, कि आप की संभावना फ़ाइल पर एक और ताला लगा है, लेकिन कोड के बिना, हम मदद नहीं कर सकता आप।

1

आप मेल भेजने के बाद एक संलग्न फ़ाइल को हटा नहीं सकते हैं। भेजने से पहले आप हटा सकते हैं।

त्रुटि क्या कहती है कि, जिस मार्ग का आपने उल्लेख किया है वह किसी अन्य प्रक्रिया का उपयोग कर रहा है।

MailMessage Message = new MailMessage(); 

Message.Subject = "Attachment Test"; 
Message.Body = "Check out the attachment!"; 
Message.To.Add("[email protected]"); 
Message.From = "[email protected]"; 

Message.Attachments.Add(new Attachment(memorystream, "test.txt", MediaTypeNames.Application.Text)); 

सूचना है कि हम MemoryStream से लगाव बनाया है और हम लगाव कुछ भी हम नाम देने के लिए मिला है। दूसरे पैरामीटर में अनुलग्नक का नाम ईमेल में फ़ाइल का नाम है, न कि स्थानीय सिस्टम हार्ड ड्राइव पर नाम। वास्तव में अटैचमेंट स्थानीय हार्ड ड्राइव पर कभी नहीं जाता है। तीसरा पैरामीटर अटैचमेंट का माइम प्रकार है, हमारे मामले में यह टेक्स्ट है।

संपादित करें: use Dispose() the mail

+0

मुझे लगता है कि आप अनुलग्नक वस्तुओं निपटान के लिए की जरूरत है। – anishMarokey

0

MailMessage कक्षा का विस्तार इस को हल करने और इस समस्या को फिर से में चल रहे की संभावना को कम करने के लिए एक अच्छा तरीका है ...

class MyMailMessage : MailMessage, IDisposable 
{ 
    private List<string> _tempFiles = new List<string>(); 

    public void Attach(string filename) 
    { 
     base.Attachments.Add(new Attachment(filename)); 
     this._tempFiles.add(filename); 
    } 

    new public void Dispose() 
    { 
     base.Dispose(); 
     this._tempFiles.Foreach(x => File.Delete(x)); 
    } 
} 

... और (एक 'का उपयोग कर' निर्माण के साथ उपयोग करने के लिए याद है जो आपको वैसे भी उपयोग करना चाहिए) ...

using(SmtpClient client = GetMySmtpClient()) 
using(MyMailMessage msd = new MyMailMessage()) 
{ 
    msg.Attach(filename); 
    client.send(msg); 
} 
0

आपको फ़ाइल को हटाने से पहले संदेश ऑब्जेक्ट को निपटाने की आवश्यकता है। उदा:

Dim message As New MailMessage 
    message.From = New MailAddress(fromEmail, fromName) 
    message.Subject = subject 
    message.CC.Add(toCCEmail) 
    message.Bcc.Add(toBCCEmail) 
    Dim attach As Attachment = New Attachment(attachmentPath) 
    message.Attachments.Add(attach) 
    message.IsBodyHtml = True 
    message.Body = body 
    mailClient.Send(message) 

    message.Dispose() 'Add this line to dispose the message! 
0

आपके मेल बहुत सारे संलग्नक

List<Attachments> lstAtt = new List<Attachments>(); 
Attachment att = new Attachment(file); 
lstAtt.Add(att); 

//finally 
foreach(var a in lstAtt) 
{ 
    a.Dispose(); 
} 

//delete file 
संबंधित मुद्दे