2011-11-22 12 views
5

मैं व्यक्तिगत उपयोग-केवल एप्लिकेशन में अनुलग्नक के साथ एक ईमेल संदेश बनाने और भेजने के लिए डेल्फी 2006 का उपयोग कर रहा हूं। मैं संदेश को TIdSMTP के उदाहरण के साथ भेजता हूं, और फिर एक प्रतिलिपि को एक विशिष्ट IMAP फ़ोल्डर में TIdIMAP4 के उदाहरण के साथ भी डालता हूं। यह सब इंडी 10 के संस्करण के साथ बहुत अच्छी तरह से काम करता है जिसे एक अपवाद के साथ बीडीएस2006 के साथ वितरित किया गया था: ईमेल हेडर में समय हमेशा गलत होता है।मल्टीपार्ट/मिश्रित संदेश में गलत सीमा स्ट्रिंग

मैंने यह तय करने का फैसला किया कि यदि मैं कर सकता हूं, और समाधान खोजने के बाद यह नवीनतम इंडी 10 स्नैपशॉट प्राप्त करने और इसका उपयोग करने के लिए सबसे उचित लग रहा था।

जो ईमेल हेडर में सही समय डालता है, लेकिन एक नई समस्या है। सीमा स्ट्रिंग अब संदेश के शीर्षलेख में अलग है जो ईमेल के बॉडी में आने वाले आईएमएपी फ़ोल्डर में जोड़ा जाता है! (कृपया ध्यान दें कि संदेश यह है कि SMTP के माध्यम से भेजा गया था सही है।)

इस इंडी 10 में पुराने संस्करण से प्रासंगिक हेडर सूचना है:

Content-Type: multipart/mixed; boundary="XNlC6OyS4QSiHY2U=_jsXyps6TR34pFNsh" 
MIME-Version: 1.0 
Date: Tue, 22 Nov 2011 09:11:58 +0000 

A test of the BDS2006-bundled version of Indy 

--XNlC6OyS4QSiHY2U=_jsXyps6TR34pFNsh 
Content-Type: application/octet-stream; 
     name="20111122.xls" 

और यह इंडी 10.5 से एक ही हेडर सूचना है .8 (स्नैपशॉट 10_4702 जो मैं कल स्थापित):

Content-Type: multipart/mixed; boundary="CDbEncbFvL7RZdOJ3DOIRoRBs=_nBsbZms" 
MIME-Version: 1.0 
Date: Tue, 22 Nov 2011 07:33:46 -0600 

investigating more deeply, why does the boundary indicator change? 

--h=_WzGWJei29fng7SqdPpDh1nkJxJZhiGc 
Content-Type: application/octet-stream; 
    name="20111122.xls" 

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

यहाँ प्रासंगिक कोड है कि ई-मेल संदेश और लगाव, भेजता है बनाता है, और IMAP फ़ोल्डर में एक प्रति कहते हैं:

FTheMsg.Date := Now; // FTheMsg is a component dropped onto the form 
    FTheMsg.Recipients.EMailAddresses := edMailTo.Text; 
    FTheMsg.ClearBody; 
    FTheMsg.Subject := 'Glucose Readings ' + FormatDateTime('mm/dd/yy', FStartDate) + ' - ' + 
       FormatDateTime('mm/dd/yy', FEndDate); 
    FTheMsg.Body.Assign(FMemo.Lines); 

    // create the attachment 
    TIdAttachmentFile.Create(FTheMsg.MessageParts, fileName); 

    // send the mail! 
    FSmtp.Host := FSMTPHost; // values set up elsewhere, FSmtp is a component on the form 
    FImap.Host := FIMAPHost; // FImap is also a component on the form 

    FSmtp.Connect; 
    try 
    FSmtp.Send(FTheMsg); 
    FImap.Connect; 
    try 
     if (not FImap.AppendMsg('Sent Items', FTheMsg, FTheMsg.LastGeneratedHeaders, [mfSeen]))  then 
     StatusBar1.Panels[4].Text := 'Failed append msg'; 
    finally 
     FImap.Disconnect; 
    end; 
    finally 
    FSmtp.Disconnect; 
    end; 

जैसा कि मैंने कहा, ईमेल भेजा जाता है कि ठीक है और ठीक से प्रदर्शित करता है । लेकिन जो मेरे आईएमएपी फ़ोल्डर में जोड़ा गया है (उपरोक्त FImap.AppendMsg() में) गलत है। मैंने यह देखने के लिए कोड के माध्यम से पता लगाने का प्रयास किया है कि यह कहां गलत हो रहा है, लेकिन स्पष्ट रूप से, मैं इंडी और विभिन्न ईमेल प्रोटोकॉल/आरएफसी के साथ पर्याप्त परिचित नहीं हूं कि यह निर्धारित करने में सक्षम हो कि क्या गलत हो रहा है। मैं बस इतना कह सकता हूं कि पुराने संस्करण फ़ोल्डर में इसे जोड़ने से पहले एक अस्थायी फ़ाइल में संदेश सहेजता है, जबकि नया संस्करण इसके बजाय मेमोरी स्ट्रीम में सहेजता है। जाहिर है, इसके बारे में कुछ अलग है, लेकिन मैं वर्तमान में यह निर्धारित करने के लिए बहुत अज्ञानी हूं।

क्या पुराने संस्करण में टाइमस्टैम्प समस्या को ठीक करने का कोई आसान तरीका है? यदि ऐसा है, तो यह मेरे उपयोग के लिए ठीक होगा, क्योंकि बाकी सब कुछ सही प्रतीत होता है। यदि नहीं, तो गलत सीमा स्ट्रिंग के साथ यहां प्रदर्शित समस्या को ठीक करने के लिए मुझे और क्या करने की आवश्यकता है?

(यह मेरा स्वयं के उपयोग के लिए सख्ती से एक आवेदन पत्र है, मैं गलत तारीख के साथ अगर मैं करने के लिए है रह सकते हैं, लेकिन मेरे 'भेजे गए आइटम' फ़ोल्डर में "खाली दिखाई दे रहा" प्रति के साथ नहीं।)

यदि अधिक जानकारी की आवश्यकता है, तो मैं खुशी से आपूर्ति कर सकता हूं जो भी मैं कर सकता हूं।

[संपादित करें: मैंने इंडी के पुराने संस्करण का उपयोग करके, मेरे कोड में एक क्लज का कुछ शामिल किया था। मैंने इसे संदेश भेजने से पहले यूटीसी/जीएमटी समय पर संदेश की तारीख/समय निर्धारित किया है, और कम से कम, संदेश को रिसीवर के अंत में सही समय रखने की अनुमति देता है। मुझे विशेष रूप से उस फिक्स की परवाह नहीं है, लेकिन यह चाल है।]

उत्तर

4

अनुलग्नक मौजूद होने पर TIdMessage.Body संपत्ति का उपयोग अपने टेक्स्ट को पकड़ने के लिए न करें। पाठ को इसके बजाय TIdText ऑब्जेक्ट में रखें। इससे भी बेहतर, TIdMessageBuilder... कक्षाओं का उपयोग करें, जैसे TIdMessageBuilderPlain, TIdMessage आपके लिए शरीर तैयार करने के लिए।

इस प्रयास करें:

FTheMsg.Clear; 
FTheMsg.Date := Now; // FTheMsg is a component dropped onto the form 
FTheMsg.Recipients.EMailAddresses := edMailTo.Text; 
FTheMsg.Subject := 'Glucose Readings ' + FormatDateTime('mm/dd/yy', FStartDate) + ' - ' + FormatDateTime('mm/dd/yy', FEndDate); 
FTheMsg.ContentType := 'multipart/mixed'; 

TIdText.Create(FTheMsg.MessageParts, FMemo.Lines).ContentType := 'text/plain'; 
TIdAttachmentFile.Create(FTheMsg.MessageParts, fileName); 

FSmtp.Connect; 
try 
    FSmtp.Send(FTheMsg); 
    FImap.Connect; 
    try 
    if (not FImap.AppendMsg('Sent Items', FTheMsg, nil, [mfSeen])) then 
     StatusBar1.Panels[4].Text := 'Failed append msg'; 
    finally 
    FImap.Disconnect; 
    end; 
finally 
    FSmtp.Disconnect; 
end; 

या:

FTheMsg.Clear; 
FTheMsg.Date := Now; // FTheMsg is a component dropped onto the form 
FTheMsg.Recipients.EMailAddresses := edMailTo.Text; 
FTheMsg.Subject := 'Glucose Readings ' + FormatDateTime('mm/dd/yy', FStartDate) + ' - ' + FormatDateTime('mm/dd/yy', FEndDate); 

with TIdMessageBuilderPlain.Create do 
try 
    PlainText.Assign(FMemo.Lines); 
    Attachments.Add(fileName); 
    FillMessage(FTheMsg); 
finally 
    Free; 
end; 

FSmtp.Connect; 
try 
    FSmtp.Send(FTheMsg); 
    FImap.Connect; 
    try 
    if (not FImap.AppendMsg('Sent Items', FTheMsg, nil, [mfSeen])) then 
     StatusBar1.Panels[4].Text := 'Failed append msg'; 
    finally 
    FImap.Disconnect; 
    end; 
finally 
    FSmtp.Disconnect; 
end; 

अब, उस के साथ कहा, यह संभावना है कि यह अभी भी सही ढंग से किसी भी तरह से काम नहीं करेगा। TIdIMAP4.AppendMsg() आंतरिक रूप से TIdMessage.SaveToStream() पर कॉल करता है, जो ईमेल सामग्री को ताज़ा करता है (और इस प्रकार शरीर में उपयोग की जाने वाली सीमा को बदल देता है)। चाहे आप पूर्व-मौजूदा TIdMessage.LastGeneratedHeaders में पास हों या TIdIMAP4.AppendMsg() वर्तमान TIdMessage.Headers को पकड़ें, वे नई सीमा के साथ सिंक हो जाएंगे जो TIdMessage.SaveToStream() उत्पन्न करता है।

यह सुनिश्चित करने के लिए कि दोनों SMTP और IMAP4 समन्वयित हैं, उन्हें एक ही डेटा प्राप्त करने की आवश्यकता है। TIdMessage.SaveToStream() बुला मैन्युअल TIdMessage.NoEncode संपत्ति गलत पर सेट के साथ पहली कोशिश करें, फिर सही पर TIdMessage.NoDecode गुण सेट और TIdMessage.LoadFromStream() फोन TIdMessage.Headers और TIdMessage.Body गुण में के रूप में है सहेजे गए डेटा को फिर से लोड करने, तो TIdSMTP.Send() और TIdIMAP4.AppendMsg() फोन TIdMessage.NoEncode संपत्ति सही पर सेट होने के साथ इसलिए TIdMessage.Headers और TIdMessage.Body को भेजा गया है।

मुझे पता है, यह TIdIMAP4.AppendMsg() टिप्पणियों/दस्तावेज़ों के अनुसार कहता है। AppendMsg() वर्तमान में एमआईएम को खाते में नहीं लेता है, इसलिए यह सुनिश्चित नहीं करता है कि हेडर और बॉडी में एमआईएमई सीमा एक दूसरे से मेल खाती है। मैं इसके लिए एक फिक्स में जांच करने की कोशिश करूंगा। इंडी 11 के लिए, इंडी की पूरी एमआईएम हैंडलिंग सिस्टम को फिर से डिजाइन किया जा रहा है, इसलिए मैं सुनिश्चित कर दूंगा कि सीमाओं को संरक्षित करना और/या कस्टम सीमाएं निर्दिष्ट करना संभव है, इसलिए AppendMsg() हेडर सीमा से शरीर की सीमा से बेहतर मिलान कर सकते हैं।

IMAP4 सामान्य रूप से काम करने के लिए एक बहुत ही मुश्किल प्रोटोकॉल है।

+0

ठीक है, इसका असर पड़ा, लेकिन वास्तव में मैं जो खोज रहा था वह बिल्कुल नहीं था। मैंने एक मेमोरी स्ट्रीम बनाया है, FTheMsg सेट करें। एनकोड: = गलत, संदेश को स्ट्रीम में सहेजा गया, FTheMsg को रीसेट करें। एनकोड: = सही और संदेश को पुनः लोड किया गया, फिर इसे TIdSMTP.Send() और TIdIMAP4.AppendMsg() से पास किया गया 'अतिरिक्त हेडर' पैरामीटर के रूप में शून्य। नतीजा यह है कि मुझे कोई अनुलग्नक नहीं मिला, और संदेश में कोई पाठ दिखाई नहीं दे रहा है! – pejurgenson

+0

यह पूर्ण संदेश है जब इसे NoEncode = False से सहेजा गया था, फिर NoEncode = True 'code' विषय के साथ पुनः लोड किया गया: ग्लूकोज रीडिंग्स 11/07/11 - 11/20/11 करने के लिए: [email protected] सामग्री-प्रकार: मल्टीपार्ट/मिश्रित; सीमा = "D9uTCLury1wVu8hlPEcf = _0afpyB9eNLrK" माइम-संस्करण: 1.0 दिनांक: मंगल, 22 नवंबर 2011 15:00:10 -0600 इस MIME प्रारूप में एक बहु-भाग संदेश है। NoEncode = गलत के साथ, सहेजा गया संदेश पूरा दिखाई देता है। – pejurgenson

+0

क्षमा करें, मैं NoEncode सेट करने के बारे में थोड़ा गलत पढ़ता हूं - मैंने इसे NoDecode के रूप में पढ़ा है! उफ़। अगर मैं आपके नोट में सही तरीके से ऐसा करता हूं, तो प्राप्तकर्ता और मेरे 'प्रेषित आइटम' फ़ोल्डर में संदेश सही ढंग से आता है। मदद के लिए बहुत बहुत धन्यवाद, यह बहुत सराहना की है! मैं निश्चित रूप से इस जवाब को स्वीकार करूंगा। – pejurgenson

संबंधित मुद्दे