উদ্ধৃত উত্তর থেকে ইমেল সামগ্রী পার্স করুন


88

আমি কোনও উদ্ধৃত উত্তর পাঠ্যের কোনও ইমেলের পাঠ্য কীভাবে এতে অন্তর্ভুক্ত হতে পারে তা কীভাবে বিশ্লেষণ করব তা বোঝার চেষ্টা করছি। আমি লক্ষ করেছি যে সাধারণত ইমেল ক্লায়েন্টরা একটি "এমন এবং এই জাতীয় তারিখের তারিখ" লিখবে বা একটি কোণ বন্ধনী সহ রেখাগুলির উপসর্গ স্থাপন করবে। দুর্ভাগ্যক্রমে, সবাই এটি করে না। প্রোগ্রামের মাধ্যমে উত্তর পাঠ্য কীভাবে সনাক্ত করা যায় সে সম্পর্কে কারও কি ধারণা আছে? আমি এই পার্সারটি লিখতে সি # ব্যবহার করছি।


4
আপনি কি এই সাথে কোন ভাগ্য আছে? আমি ঠিক একই জিনিস করতে চাই।
স্টিভ_সি

পুরো উত্স কোড নমুনা নিয়ে কোন চূড়ান্ত সমাধান সম্পর্কে কাজ করছে?
কিকিনেট

উদ্ধৃতি পাইথনে এটি করেন
ফিলফ্রেও

কেউ এর পিএইচপি সংস্করণ জন্য সাহায্য করতে পারেন?
ব্যবহারকারী 4271704

উত্তর:


60

আমি এটিতে আরও অনেক অনুসন্ধান করেছি এবং আমি যা পেয়েছি তা এখানে। মূলত দুটি পরিস্থিতি রয়েছে যার অধীনে আপনি এটি করছেন: যখন আপনার সম্পূর্ণ থ্রেড থাকে এবং যখন আপনি না করেন। আমি এগুলি দুটি বিভাগে ভাগ করব:

আপনার যখন থ্রেড থাকবে:

আপনার যদি ইমেলগুলির পুরো সিরিজ থাকে তবে আপনি যে উচ্চারণটি সরিয়ে ফেলছেন তা আসলে উদ্ধৃত পাঠ্য বলে খুব উচ্চ মাত্রার নিশ্চয়তা অর্জন করতে পারেন। এই কাজটি করার দুটি পদ্ধতি আছে। এক, আপনি স্বতন্ত্র বার্তাটি, এর পিতা-মাতা এবং এটির যে থ্রেডটি রয়েছে তা নির্ধারণ করতে আপনি বার্তার বার্তা-আইডি, ইন-রিপ্লাই-টু আইডি এবং থ্রেড-ইনডেক্স ব্যবহার করতে পারেন। এই বিষয়ে আরও তথ্যের জন্য, দেখুন RFC822 , RFC2822 , থ্রেডিং এই আকর্ষণীয় নিবন্ধ , বা থ্রেডিং এই নিবন্ধটি । একবার আপনি থ্রেডটি পুনরায় একত্রিত করার পরে, আপনি তারপরে বাহ্যিক পাঠ্য (যেমন টু, থেকে, সিসি, ইত্যাদি ... লাইন) সরিয়ে ফেলতে পারেন এবং আপনার কাজ শেষ হয়ে গেছে।

আপনি যে বার্তাগুলির সাথে কাজ করছেন তার শিরোনাম যদি না থাকে তবে আপনি কোনও ইমেলের কোন অংশের উত্তর পাঠ্য তা নির্ধারণ করতে মিলের মিলও ব্যবহার করতে পারেন। এই ক্ষেত্রে আপনি পুনরাবৃত্তি হওয়া পাঠ্যটি নির্ধারণ করতে মিলের মিল করতে আটকে গেছেন stuck এই ক্ষেত্রে আপনি একটি দেখব করতে চাইতে পারেন Levenshtein দূরত্ব অ্যালগরিদম যেমন কোড প্রোজেক্ট উপর এই এক বা এই এক

যাই হোক না কেন, আপনি যদি থ্রেডিং প্রক্রিয়াটিতে আগ্রহী হন তবে ইমেল থ্রেডগুলি পুনরায় সমাবেশ করার জন্য এই দুর্দান্ত পিডিএফটি দেখুন

যখন আপনার থ্রেডটি নেই:

আপনি যদি থ্রেড থেকে কেবল একটি বার্তা নিয়ে আটকে থাকেন, আপনি উদ্ধৃতিটি কী তা অনুমান করার চেষ্টা করার চেষ্টা করছেন। সেক্ষেত্রে, আমি দেখেছি বিভিন্ন উদ্ধৃতি পদ্ধতি:

  1. একটি লাইন (যেমন দৃষ্টিভঙ্গিতে দেখা যায়)।
  2. কোণ বন্ধনী
  3. "---আসল বার্তা---"
  4. "এই জাতীয় ও দিনটিতে তাই-ও-তে লিখেছিলেন:"

সেখান থেকে পাঠ্য সরিয়ে ফেলুন এবং আপনার কাজ শেষ হয়েছে। এগুলির যে কোনওটির নেতিবাচক দিকটি হ'ল তারা সকলেই অনুমান করে যে প্রেরক তার উত্তর উদ্ধৃত পাঠ্যের উপরে রেখেছিল এবং এটি ইন্টারলেভ করেনি (যেমনটি ইন্টারনেটে পুরানো স্টাইল ছিল)। যদি তা হয়, ভাগ্য ভাল। আমি আশা করি এটি আপনার কয়েকজনকে সেখানে সাহায্য করবে!


32

প্রথমত, এটি একটি জটিল কাজ।

আপনার বিভিন্ন ই-মেইল ক্লায়েন্টের থেকে সাধারণ প্রতিক্রিয়া সংগ্রহ করা উচিত এবং এগুলিকে পার্স করার জন্য সঠিক নিয়মিত এক্সপ্রেশন (বা যাই হোক না কেন) প্রস্তুত করা উচিত। আমি দৃষ্টিভঙ্গি, থান্ডারবার্ড, জিমেইল, অ্যাপল মেল এবং মেইল.রু থেকে প্রতিক্রিয়া সংগ্রহ করেছি।

আমি নিম্নলিখিত পদ্ধতিতে প্রতিক্রিয়া পার্স করতে নিয়মিত এক্সপ্রেশন ব্যবহার করছি: যদি এক্সপ্রেশনটি মেলে না তবে আমি পরবর্তীটি ব্যবহার করার চেষ্টা করব।

new Regex("From:\\s*" + Regex.Escape(_mail), RegexOptions.IgnoreCase);
new Regex("<" + Regex.Escape(_mail) + ">", RegexOptions.IgnoreCase);
new Regex(Regex.Escape(_mail) + "\\s+wrote:", RegexOptions.IgnoreCase);
new Regex("\\n.*On.*(\\r\\n)?wrote:\\r\\n", RegexOptions.IgnoreCase | RegexOptions.Multiline);
new Regex("-+original\\s+message-+\\s*$", RegexOptions.IgnoreCase);
new Regex("from:\\s*$", RegexOptions.IgnoreCase);

শেষ পর্যন্ত উদ্ধৃতি সরাতে:

new Regex("^>.*$", RegexOptions.IgnoreCase | RegexOptions.Multiline);

এখানে আমার পরীক্ষার প্রতিক্রিয়াগুলির ছোট সংগ্রহ (নমুনাগুলি ভাগ করে --- ):

From: test@test.com [mailto:test@test.com] 
Sent: Tuesday, January 13, 2009 1:27 PM
----
2008/12/26 <test@test.com>

>  text
----
test@test.com wrote:
> text
----
      test@test.com wrote:         text
text
----
2009/1/13 <test@test.com>

>  text
----
 test@test.com wrote:         text
 text
----
2009/1/13 <test@test.com>

> text
> text
----
2009/1/13 <test@test.com>

> text
> text
----
test@test.com wrote:
> text
> text
<response here>
----
--- On Fri, 23/1/09, test@test.com <test@test.com> wrote:

> text
> text

শুভেচ্ছা, ওলেগ ইয়ারোশেভিচ


আমি যদি ইমেল ঠিকানাটি না জানি?
harsimranb

@ শ্যামল-পরীখ এইচটিএমএল ইমেলের জন্য কাজ করবে না, তবে সাধারণত একটি
সরলখর

26

রেগেক্সের জন্য আপনাকে ধন্যবাদ, গোগলে! সত্যিই সাহায্য করেছে। এটি সি # নয়, তবে গুগলারের জন্য এখানে আমার রুবি পার্সিং স্ক্রিপ্টটি রয়েছে:

def extract_reply(text, address)
    regex_arr = [
      Regexp.new("From:\s*" + Regexp.escape(address), Regexp::IGNORECASE),
      Regexp.new("<" + Regexp.escape(address) + ">", Regexp::IGNORECASE),
      Regexp.new(Regexp.escape(address) + "\s+wrote:", Regexp::IGNORECASE),
      Regexp.new("^.*On.*(\n)?wrote:$", Regexp::IGNORECASE),
      Regexp.new("-+original\s+message-+\s*$", Regexp::IGNORECASE),
      Regexp.new("from:\s*$", Regexp::IGNORECASE)
    ]

    text_length = text.length
    #calculates the matching regex closest to top of page
    index = regex_arr.inject(text_length) do |min, regex|
        [(text.index(regex) || text_length), min].min
    end

    text[0, index].strip
end

এটি এখন পর্যন্ত বেশ ভাল কাজ হয়েছে।


4
আপনার একটি রুবি প্রশ্ন করা উচিত এবং এসি # প্রশ্নে এটি পোস্ট করার পরিবর্তে এই কোডটি দিয়ে উত্তর দিন।
ম্যাথিউউ

6
@ ম্যাথিউ, এটি কেবল একটি # সি প্রশ্ন নয়, তবে একটি ইমেল এবং ইমেল-বিশ্লেষণ প্রশ্ন। আমার মতে সম্পূর্ণ প্রাসঙ্গিক
ট্রেন্ট

@ ট্রেন্ট: সি # ট্যাগটি তখন ফেলে দেওয়া উচিত।
ম্যাথিউউ

7
মজার বিষয় হ'ল আমি গুগলিংয়ের এই বিষয়টি (ভাষা নয়) বিষয়ের জন্য খুঁজে পেয়েছি এবং রুবিতে আমার আসলে কিছু বাস্তবায়নের প্রয়োজন ছিল। তো, চিয়ার্স!
bratsche

4
এটি এখন পর্যন্ত সেরা প্রতিক্রিয়া। রেজেক্স হ'ল সুন্দর ভাষা অজ্ঞানী। পোস্ট করার জন্য ধন্যবাদ
সুপারলুমিনিয়ি

11

এটি করার সহজতম উপায় হ'ল আপনার সামগ্রীতে একটি মার্কার স্থাপন করা যেমন:

--- দয়া করে এই লাইনের উপরে উত্তর দিন ---

যেমন আপনার কোনও সন্দেহ লক্ষ্য করা যায় নি, উদ্ধৃত পাঠ্যকে আলাদা করে দেওয়া কোনও তুচ্ছ কাজ নয় কারণ বিভিন্ন ইমেল ক্লায়েন্ট বিভিন্ন উপায়ে পাঠ্য উদ্ধৃত করে। এই সমস্যাটি সঠিকভাবে সমাধান করার জন্য আপনাকে প্রতিটি ইমেল ক্লায়েন্টের জন্য অ্যাকাউন্ট এবং পরীক্ষা করতে হবে।

ফেসবুক এটি করতে পারে তবে আপনার প্রকল্পের বড় বাজেট না থাকলে আপনি সম্ভবত পারবেন না।

ওলেগ "13 জুলাই ২০১২, 13:09 এ, এক্সএক্সএক্স লিখেছেন:" রেগেক্সগুলি ব্যবহার করে সমস্যার সমাধান করেছেন text তবে, ব্যবহারকারী যদি এই পাঠ্যটি মুছে ফেলেন, বা ইমেলের নীচে জবাব দেয়, যেমন অনেকেই করেন, এই সমাধানটি কাজ করবে না।

অনুরূপভাবে যদি ইমেল ক্লায়েন্ট কোনও পৃথক তারিখের স্ট্রিং ব্যবহার করে বা একটি তারিখের স্ট্রিং অন্তর্ভুক্ত না করে তবে রেজেক্স ব্যর্থ হবে।


আপনি যতবার উত্তর দিবেন না কেন আপনি এই লাইনটি না রাখলে এই পদ্ধতির প্রত্যুত্তরগুলির উত্তরগুলির সাথে ব্যর্থ।
jpw

4
হ্যাঁ, এর ঘাটতি রয়েছে। যদি ব্যবহারকারী রেখাটির উপরের উত্তরটি মুছে ফেলে তবে আপনার উত্তর ব্যর্থ হবে। আমি এই কেসটি ধরছি এবং ওয়েব অ্যাপের মাধ্যমে উত্তর দেওয়ার লিঙ্ক সহ ব্যবহারকারীকে তাদের বার্তাটি ব্যর্থ হতে দিয়ে সরাসরি বার্তাটি প্রেরণ করি link বেশিরভাগ ব্যবহারকারীরা খুব বেশি ঝামেলা ছাড়াই এটি ব্যবহার করতে সক্ষম বলে মনে হচ্ছে।
সুপারলুমিনিয়ার

এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। তবে, আমি তথ্য যুক্ত করব যে লাইনটি সরানো থাকলে উত্তরটি সফল হবে না।
বেনি

@ বেন্নি - হ্যাঁ, লাইনটি সরিয়ে ফেললে এটি ব্যর্থ হবে। দুর্ভাগ্যক্রমে, ইমেল ক্লায়েন্ট জুড়ে পাঠ্যের উদ্ধৃতি দেওয়ার কোনও মানক উপায় নেই। যে ক্ষেত্রে লাইনটি সরিয়ে ফেলা হয়েছে, আপনি সম্ভবত সমস্ত পাঠ্যকে উত্তর হিসাবে বিবেচনা করবেন। আমি মনে করি না যে এক্ষেত্রে একটি নিখুঁত সমাধান সম্ভব।
সুপারলুমিনি

@ সুপারলুমিনারি আমার অর্থ, আমি এটি লাইনে যুক্ত করব। সুতরাং এটি কিছু মত -- Please reply above this line. DO NOT REMOVE IT! --। এছাড়াও, আমি যা অভিজ্ঞতা পেয়েছি তা হ'ল এটি সর্বদা কার্যকর হয় না যেহেতু কিছু ইমেল ক্লায়েন্টরা xxx wrote on <datetime>:পুরো উদ্ধৃতিটির আগে এবং সুতরাং সেই লাইনের আগে একটি লাইন যুক্ত করে। এই লাইনটি রেজেক্সের সাথে পার্স করা যেতে পারে, তবে এটি ইমেল ক্লায়েন্টদের থেকে পৃথক হওয়ার কারণে এটি বিভিন্ন ভাষায় এবং ভিন্ন ফর্ম্যাটে থাকতে পারে।
বেনি

7

কোনও ইমেলটিতে কোনও জবাবের সর্বজনীন সূচক নেই। আপনি যেটা করতে পারেন তা হ'ল আপনি যখন আসেন ততই সাধারণ এবং পার্সিংয়ের নতুন নকশাগুলি ধরার চেষ্টা করুন।

মনে রাখবেন যে কিছু লোক উদ্ধৃত পাঠ্যের ভিতরে উত্তরগুলি সন্নিবেশ করান (উদাহরণস্বরূপ আমার বস যেমন আমি তাদের জিজ্ঞাসা করেছি একই লাইনে প্রশ্নগুলির উত্তর দেয়) সুতরাং আপনি যা-ই করুন না কেন, আপনি রাখতে চান এমন কিছু তথ্য হারাতে পারেন।


জিমেইল এটি করে ... কমপক্ষে এটি এটি বলে মনে হচ্ছে। আমার মনে আছে এমন কিছু থ্রেড আইডি রয়েছে যা প্রচলিত এবং উত্তরগুলির মধ্যে পরিবর্তন হয় না ...
কেনি

জিমেইল অন্য ইমেল ক্লায়েন্টের মতো '>' এর যোগ করতে পারে তবে এটি ইমেলগুলির একটি মান নয় এবং এমন কোনও কিছু নয় যা আপনি গণনা করতে পারেন
3Doubloons

6

এখানে @ হুরশাগ্রওয়ালের রুবি কোডটির আমার সি # সংস্করণ। আমি রুবিকে সত্যিই ভাল জানি না তাই এটি বন্ধ হতে পারে তবে আমি মনে করি এটি ঠিক হয়ে গেছে।

public string ExtractReply(string text, string address)
{
    var regexes = new List<Regex>() { new Regex("From:\\s*" + Regex.Escape(address), RegexOptions.IgnoreCase),
                        new Regex("<" + Regex.Escape(address) + ">", RegexOptions.IgnoreCase),
                        new Regex(Regex.Escape(address) + "\\s+wrote:", RegexOptions.IgnoreCase),
                        new Regex("\\n.*On.*(\\r\\n)?wrote:\\r\\n", RegexOptions.IgnoreCase | RegexOptions.Multiline),
                        new Regex("-+original\\s+message-+\\s*$", RegexOptions.IgnoreCase),
                        new Regex("from:\\s*$", RegexOptions.IgnoreCase),
                        new Regex("^>.*$", RegexOptions.IgnoreCase | RegexOptions.Multiline)
                    };

    var index = text.Length;

    foreach(var regex in regexes){
        var match = regex.Match(text);

        if(match.Success && match.Index < index)
            index = match.Index;
    }

    return text.Substring(0, index).Trim();
}

3

আপনি যদি আসল বার্তাটি নিয়ন্ত্রণ করেন (যেমন কোনও ওয়েব অ্যাপ্লিকেশন থেকে বিজ্ঞপ্তিগুলি) তবে আপনি আলাদা আলাদা, শনাক্তযোগ্য শিরোনাম স্থাপন করতে পারেন এবং এটি মূল পোস্টের জন্য ডিলিমিটার হিসাবে ব্যবহার করতে পারেন।


0

এটি একটি ভাল সমাধান। এতক্ষণ অনুসন্ধান করার পরে এটি খুঁজে পেয়েছি।

একটি সংযোজন, যেমন উপরে বর্ণিত হয়েছে, এটি কেস ওয়াইস, সুতরাং উপরের অভিব্যক্তিগুলি আমার জিমেইল এবং দৃষ্টিভঙ্গি (২০১০) প্রতিক্রিয়াগুলিকে সঠিকভাবে পার্স করতে পারেনি, যার জন্য আমি নিম্নলিখিত দুটি রেজেক্স (গুলি) যুক্ত করেছি। আমাকে যেকোন সমস্যার জন্য জানতে দিন।

//Works for Gmail
new Regex("\\n.*On.*<(\\r\\n)?" + Regex.Escape(address) + "(\\r\\n)?>", RegexOptions.IgnoreCase),
//Works for Outlook 2010
new Regex("From:.*" + Regex.Escape(address), RegexOptions.IgnoreCase),

চিয়ার্স


কেউ এর পিএইচপি সংস্করণ জন্য সাহায্য করতে পারেন?
ব্যবহারকারী 4271704

পিএইচপি সংস্করণ জন্য এটি পরীক্ষা করুন। stackoverflow.com/questions/14916618/... github.com/willdurand/EmailReplyParser
FullStackDev

-1

এটি পুরানো পোস্ট, তবে, আপনি যদি সচেতন হন তবে গিথুবকে উত্তরটি বের করার জন্য একটি রুবি লিবি আছে কিনা তা নিশ্চিত নয় । আপনি যদি নেট ব্যবহার করেন তবে https://github.com/EricJWHuang/EmailReplyParser এ আমার একটি নেট নেট আছে


4
বাহ্যিক সংস্থানগুলিতে লিঙ্কগুলি উত্সাহিত করা হয় তবে দয়া করে লিঙ্কটির চারপাশে প্রসঙ্গটি যুক্ত করুন যাতে আপনার সহকর্মী ব্যবহারকারীরা এটি কী এবং এটি কেন আছে তা সম্পর্কে কিছু ধারণা থাকতে পারে। টার্গেট সাইটটি যদি অ্যাক্সেসযোগ্য না হয় বা স্থায়ীভাবে অফলাইনে চলে যায় তবে সর্বদা গুরুত্বপূর্ণ লিঙ্কের সর্বাধিক প্রাসঙ্গিক অংশটি উদ্ধৃত করুন।
pableiros

আপনি কি লাইব্রেরিটি টু ডেট রাখছেন? আমি অনুসন্ধান করতে এসেছি কারণ সি # লাইব্রেরি অফিস 365 থেকে আউটলুকের কোনও সাধারণ ইমেল সঠিকভাবে পার্স করতে পারে না Then তারপরে আমি রুবি উত্স কোডটি দেখেছি এবং দেখতে পেয়েছি যে তাদের পরীক্ষার ক্ষেত্রে একটি অভিন্ন পরীক্ষার কেস রয়েছে যাতে তারা স্পষ্টভাবে মনে করে যে তাদের পার্স করা উচিত এটা।
গ্রেগ ভেরেস

-2

আপনি যদি সিগপারসার ডটকমের এপিআই ব্যবহার করেন তবে এটি আপনাকে একটি একক ইমেল পাঠ্য স্ট্রিংয়ের উত্তর চেইনে সমস্ত ভাঙ্গা ইমেলের একটি অ্যারে দেবে। সুতরাং যদি 10 টি ইমেল থাকে তবে আপনি 10 টি ইমেলের জন্য পাঠ্য পাবেন।

এখানে চিত্র বর্ণনা লিখুন

আপনি এখানে বিশদ এপিআই স্পেস দেখতে পারেন।

https://api.sigparser.com/

এখানে চিত্র বর্ণনা লিখুন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.