2009-05-05 17 views
6

मेरे पास एक रेल एप्लिकेशन है जो आईएमएपी के माध्यम से इनकमिंग ईमेल को संसाधित करता है। वर्तमान में एक विधि प्रयोग किया जाता है कि किसी दिए गए content_type के लिए एक TMail वस्तु के कुछ हिस्सों खोज:ईमेल उत्तर संसाधित करते समय मैं किसी भी ईमेल क्लाइंट विशिष्टताओं और इतिहास को कैसे अनदेखा कर सकता हूं?

def self.search_parts_for_content_type(parts, content_type = 'text/html') 
    parts.each do |part| 
     if part.content_type == content_type 
     return part.body 
     else 
     if part.multipart? 
      if body = self.search_parts_for_content_type(part.parts, content_type) 
      return body 
      end 
     end 
     end 
    end 

    return false 
end 

ये ईमेल एक एचटीएमएल के जवाब में आम तौर पर कर रहे हैं ईमेल यह पहली जगह में बाहर भेज दिया। (मूल आउटबाउंड ईमेल कभी भी समान नहीं होता है।) बॉडी टेक्स्ट उपर्युक्त विधि में ईमेल का पूरा इतिहास होता है और मैं केवल उत्तर टेक्स्ट को पार्स करना चाहता हूं।

  1. मैं सोच रहा हूँ कि क्या यह कुछ जगह उचित है मेल के शीर्ष पर पाठ '--- इस रेखा से ऊपर जवाब दें ---' के रूप में मैं एक 37 संकेतों आवेदन में देखा है।

  2. क्या प्रत्येक मेल क्लाइंट के लिए नियमित अभिव्यक्तियों की एक भीड़ (जिसे मैंने अभी तक प्रयास नहीं किया है) लिखने के अलावा, ईमेल में क्लाइंट विशिष्ट परिवर्धन को अनदेखा करने का कोई और तरीका है? वे सभी किसी भी उत्तर के शीर्ष पर अपने स्वयं के बिट पर लगने लगते हैं।

उत्तर

9

मुझे अभी एक परियोजना पर ईमेल उत्तर पार्सिंग करना है जो मैं अभी काम कर रहा हूं। मैं प्रतिक्रिया भाग की पहचान करने के लिए पैटर्न मिलान का उपयोग कर समाप्त हुआ, इसलिए उपयोगकर्ताओं को चिंता करने की आवश्यकता नहीं होगी कि उनका जवाब कहां डालना है।

अच्छी खबर यह है कि कार्यान्वयन वास्तव में बहुत मुश्किल नहीं है। कड़ी मेहनत सिर्फ उन सभी अलग-अलग ईमेल क्लाइंट्स और सेवाओं का परीक्षण कर रही है जिन्हें आप समर्थन देना चाहते हैं और यह पता लगाना चाहते हैं कि प्रत्येक को कैसे पहचानें। आम तौर पर, आप यह निर्धारित करने के लिए कि कोई आने वाली ईमेल कहां से आई है, या तो संदेश आईडी या एक्स-मेलर या रिटर्न-पथ शीर्षलेख का उपयोग कर सकते हैं।

यहां एक तरीका है जो एक टीएमएएल ऑब्जेक्ट लेता है और संदेश के प्रतिक्रिया भाग को निकालता है और उस ईमेल क्लाइंट/सेवा के साथ लौटाता है जो इसे भेजा गया था। यह मानता है कि आपके पास मूल संदेश है: स्थिरांक में नाम और पता FROM_NAME और FROM_ADDRESS

def find_reply(email) 
    message_id = email.message_id('') 
    x_mailer = email.header_string('x-mailer') 

    # For optimization, this list could be sorted from most popular to least popular email client/service 
    rules = [ 
    [ 'Gmail', lambda { message_id =~ /.+gmail\.com>\z/}, /^.*#{FROM_NAME}\s+<#{FROM_ADDRESS}>\s*wrote:.*$/ ], 
    [ 'Yahoo! Mail', lambda { message_id =~ /.+yahoo\.com>\z/}, /^_+\nFrom: #{FROM_NAME} <#{FROM_ADDRESS}>$/ ], 
    [ 'Microsoft Live Mail/Hotmail', lambda { email.header_string('return-path') =~ /<[email protected](hotmail|live).com>/}, /^Date:.+\nSubject:.+\nFrom: #{FROM_ADDRESS}$/ ], 
    [ 'Outlook Express', lambda { x_mailer =~ /Microsoft Outlook Express/ }, /^----- Original Message -----$/ ], 
    [ 'Outlook', lambda { x_mailer =~ /Microsoft Office Outlook/ }, /^\s*_+\s*\nFrom: #{FROM_NAME}.*$/ ], 

    # TODO: other email clients/services 

    # Generic fallback 
    [ nil, lambda { true }, /^.*#{FROM_ADDRESS}.*$/ ] 
    ] 

    # Default to using the whole body as the reply (maybe the user deleted the original message when they replied?) 
    notes = email.body 
    source = nil 

    # Try to detect which email service/client sent this message 
    rules.find do |r| 
    if r[1].call 
     # Try to extract the reply. If we find it, save it and cancel the search. 
     reply_match = email.body.match(r[2]) 
     if reply_match 
     notes = email.body[0, reply_match.begin(0)] 
     source = r[0] 
     next true 
     end 
    end 
    end 

    [notes.strip, source] 
end 
0

मुझे लगता है कि आप इस पर फंस जाएंगे। मैं अपने आप को TMail में हाल ही में ईमेल के साथ कुछ सामान कर रहे हैं, और क्या आप आम तौर पर पाएंगे कि एक HTML हिस्सा है एक ई आम तौर पर की तरह संरचित है कि है:

part 1 - multipart/mixed 
    sub part 1 - text/plain 
    sub part 2 - text/html 
end 

ईमेल क्लाइंट मैं आउटलुक और Gmail के साथ खेला जाता है दोनों इस प्रारूप में जवाब उत्पन्न करते हैं, और वे आम तौर पर उत्तर में मूल ईमेल इनलाइन उद्धृत करते हैं। सबसे पहले मैं हालांकि कि मूल ईमेल के 'पुराने' हिस्से अलग-अलग हिस्सों होंगे, लेकिन वास्तव में वे नहीं हैं - पुराना हिस्सा सिर्फ उत्तर भाग में विलय हो गया है।

आप 'से:' से शुरू होने वाली रेखा के लिए भाग खोज सकते हैं (क्योंकि अधिकांश क्लाइंट आम तौर पर मूल ईमेल टेक्स्ट के शीर्ष पर शीर्षलेख रखते हैं जो इसे भेजते हैं), लेकिन इसकी गारंटी नहीं है।

मुझे वास्तव में कुछ भी गलत नहीं दिख रहा है --- कृपया इस पंक्ति के ऊपर उत्तर दें --- आम तौर पर, यह आक्रामक नहीं है, और चीजों को बहुत आसान बना सकता है।

+0

आपके उत्तर के लिए धन्यवाद, मेरे पास संलग्नक वाले ईमेल सहित आने वाले ईमेल पर कुछ बदलावों के साथ एक खेल है। जैसा कि आपने उल्लेख किया है, मैंने वही सेटअप पाया है। जैसा कि आप कहते हैं ऐसा लगता है कि कुछ भी गारंटी नहीं है। यह मुझे मूर्खतापूर्ण लगता है कि इस तरह से मिलान करने वाला पैटर्न ही एकमात्र तरीका है।यहां तक ​​कि --- ऊपर दिए गए उत्तर के साथ --- लाइन आपको अभी भी ईमेल क्लाइंट विनिर्देशों को संभालने की आवश्यकता है, क्योंकि यह स्वाभाविक रूप से रेखा से ऊपर चला जाता है :( – tsdbrown

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