2012-02-29 9 views
5

मैंने एक वेब एप्लिकेशन विकसित किया है, जिसमें एक विशेष बिक्री-आदेश के लिए नोट दर्ज करने की कार्यक्षमता है।मैं कैसे जान सकता हूं कि कौन सा ईमेल किसी अन्य ईमेल का उत्तर है, सी # में?

जब कोई ग्राहक या ग्राहक सेवा कार्यकारी द्वारा कोई नोट दर्ज किया जाता है, तो संबंधित पार्टी को एक ईमेल अधिसूचना भेजी जाती है (ईमेल अधिसूचना SMTpClient & CM में मेलमेसेज ऑब्जेक्ट्स का उपयोग करके भेजी जाती है)।

using (MailMessage objEmail = new MailMessage()) 
{ 
    Guid objGuid = new Guid(); 
    objGuid = Guid.NewGuid(); 
    String MessageID = "<" + objGuid.ToString() + ">"; 
    objEmail.Body = messagebody.ToString(); 
    objEmail.From = new MailAddress(sFrmadd, sFrmname); 
    objEmail.Headers.Add("Message-Id", MessageID); 
    objEmail.IsBodyHtml = true; 
    objEmail.ReplyTo = new MailAddress("[email protected]");      
    objEmail.Subject = sSubject;      
    objEmail.To.Add(new MailAddress(sToadd)); 

    SmtpClient objSmtp = new SmtpClient(); 
    objSmtp.Credentials = new NetworkCredential("mynetworkcredential", "mypassword"); 
    objSmtp.DeliveryMethod = SmtpDeliveryMethod.Network; 
    objSmtp.EnableSsl = true; 
    objSmtp.Host = "myhostname"; 
    objSmtp.Port = 25; 
    objSmtp.Timeout = 3 * 3600; 

    objSmtp.Send(objEmail);      
} 

मैं एक Guid संदेश की Message-Id के रूप में स्थापित करने हूँ संदेश हेडर में भेजा जा रहा है।

यह सब ठीक काम करता है।

अब मैं पार्टियों के लिए उनके संबंधित इनबॉक्स से ईमेल अधिसूचना का उत्तर देने के लिए एक कार्यक्षमता विकसित करना चाहता हूं।

और मैं उसी बिक्री-ऑर्डर के लिए नोट्स में जवाब लॉग करना चाहता हूं (जिसके लिए पार्टी को अधिसूचना मिली)।

मैं अधिसूचना-उत्तरों के लिए इनबॉक्स पढ़ने के लिए OpenPop.dll का उपयोग कर रहा हूं।

/// <summary> 
/// Fetch all messages from a POP3 server 
/// </summary> 
/// <param name="hostname">Hostname of the server. For example: pop3.live.com</param> 
/// <param name="port">Host port to connect to. Normally: 110 for plain POP3, 995 for SSL POP3</param> 
/// <param name="useSsl">Whether or not to use SSL to connect to server</param> 
/// <param name="username">Username of the user on the server</param> 
/// <param name="password">Password of the user on the server</param> 
/// <returns>All Messages on the POP3 server</returns> 
public static List<Message> FetchAllMessages(string hostname, int port, bool useSsl, string username, string password) 
{ 
    // The client disconnects from the server when being disposed 
    using (Pop3Client client = new Pop3Client()) 
    { 
     // Connect to the server 
     client.Connect(hostname, port, useSsl); 

     // Authenticate ourselves towards the server 
     client.Authenticate(username, password); 

     // Get the number of messages in the inbox 
     int messageCount = client.GetMessageCount(); 

     // We want to download all messages 
     List<Message> allMessages = new List<Message>(messageCount); 

     // Messages are numbered in the interval: [1, messageCount] 
     // Ergo: message numbers are 1-based. 
     for (int i = 1; i <= messageCount; i++) 
     { 
      allMessages.Add(client.GetMessage(i)); 
     } 

     // Now return the fetched messages 
     return allMessages; 
    } 
} 

उपरोक्त फ़ंक्शन से मैं अपने "[email protected]" खाते से सभी ईमेल पढ़ने में सक्षम हूं। लेकिन मैं In-reply-to ईमेल के शीर्षलेख में Message-Id नहीं ढूंढ पा रहा हूं।

मुझे नहीं पता कि मैं क्या गलत कर रहा हूं।

+1

जहां तक ​​मुझे पता है कि ऐसा करने का कोई विश्वसनीय तरीका नहीं है, तो आप एक ईमेल क्लाइंट की दया पर हैं, और प्रत्येक ईमेल क्लाइंट के अपने स्वयं के quirks है। मैंने देखा है कि इसी तरह की अधिकांश प्रणालियों में * एक अद्वितीय आईडी डालने के लिए विषय पंक्ति * का उपयोग किया जाता है, और फिर, जब संदेश को शुरुआत से "आरई:" स्ट्रिप करने का उत्तर दिया जाता है। –

+0

हम ईमेल में कुछ कस्टम शीर्षलेख जोड़ते थे। – PraveenVenu

+0

मेरा मानना ​​है कि यहां तक ​​कि आउटलुक की बातचीत विषय-आधारित हैं। –

उत्तर

3

सबसे अच्छा समाधान मैं सोच सकता हूं कि आपका डेटा "से" और/या "उत्तर दें" शीर्षलेख में उदाहरण के लिए '+' चिह्न का उपयोग कर रहा है।

कहो अपनी वापसी पता है [email protected]

आप एक ऐसा फ़िल्टर नियम जोड़ने के लिए आप सर्वर मेल में है, ताकि किसी भी संदेश [email protected] के लिए भेजा [email protected] में गिर जाता है है मेलबॉक्स

फेसबुक अधिसूचनाएं सीधे ईमेल उत्तरों के लिए इसका उपयोग करती हैं।

जीमेल यह भी उपयोग करता है (यह कोशिश अगर आप Gmail पता नहीं है)

(http://forums.smartertools.com/showthread.php/27790-Plus-Addressing-configure-symbol देखें)

आशा इस में मदद मिलेगी। यदि हां, तो मेल सर्वर कॉन्फ़िगरेशन

1

जैसा कि @jbl द्वारा उत्तर दिया गया है, हमने प्लस एड्रेसिंग अवधारणा का उपयोग किया। हमने अपने ईमेल प्रदाता से इस अवधारणा को हमारे SMTP सर्वर पर सक्षम करने के लिए कहा। जीमेल डिफ़ॉल्ट रूप से यह प्रदान करता है।

कोई ईमेल भेजते समय, हम नीचे दिए गए आदेश पर दर्ज प्रत्येक नोट के लिए पते का एक अनूठा उत्तर देंगे।

String sReplyToadd = "[email protected]"; 
String replyToAddress = sReplyToadd.Substring(0, sReplyToadd.IndexOf('@')) + "+on" + orderID + "un" + userID + sReplyToadd.Substring(sReplyToadd.IndexOf('@'), sReplyToadd.Length - sReplyToadd.IndexOf('@')); 

इस आदेश और उपयोगकर्ता के लिए जो टिप्पणी पोस्ट की पहचान करने के replyToAddress = "[email protected]", एक विशिष्ट पता होगा।

अब, पते का यह अनूठा उत्तर नीचे दिए गए ईमेल को सौंपा जाएगा।

using (MailMessage objEmail = new MailMessage()) 
{ 
    objEmail.Body = eMailBody; 
    objEmail.From = new MailAddress("[email protected]", "Display Name"); 
    objEmail.IsBodyHtml = true; 
    objEmail.Subject = "email subject goes here"; 
    objEmail.To.Add(new MailAddress("[email protected]"); 

    //here we set the unique reply to address for the outgoing email 
    objEmail.ReplyTo = new MailAddress(replyToAddress); //[email protected] 

    SmtpClient objSmtp = new SmtpClient(); 

    objSmtp.EnableSsl = true; 
    objSmtp.Credentials = new NetworkCredential("username", "password"); 
    objSmtp.Host = "127.0.0.1";//"smtp.gmail.com" for gmail 
    objSmtp.Port = 25; 

    objSmtp.Send(objEmail); 
} 

ReplyTo पते को संबोधित करने में दिखाई देता है, तो उपयोगकर्ता अपने ईमेल क्लाइंट में जबाब बटन पर क्लिक करता है, तो नीचे के रूप में दिखाया गया है।

Reply To Address shown in To in the email cient

उपयोगकर्ता To पते में परिवर्तन नहीं होता है, तो यह हमारे [email protected] मेलबॉक्स पर प्राप्त किया जाएगा। हमने प्रत्येक ईमेल के नीचे दिए गए नोट पर एक नोट डाला: कृपया सिस्टम में अपने उत्तर को सही तरीके से मैप करने के लिए पते को न बदलें।

एक बार ईमेल मेलबॉक्स तक पहुँच जाता है, हम बस ईमेल उत्तर के To पते की जाँच करें और आवश्यक आदेश आईडी और प्रयोक्ता आईडी मिलता है,

String replyFor = objEmail.To[0].ToString(); 
Int64 orderID = Convert.ToInt64(replyFor.Substring(replyFor.LastIndexOf("+on") + 3, replyFor.LastIndexOf("un"))); 
Int64 userID = replyFor.Substring(replyFor.LastIndexOf("un") + 2, replyFor.IndexOf("@") - replyFor.LastIndexOf("un") - 2); 

नीचे के रूप में की जरूरत है और फिर हम के बाद कभी खुशी से रहते थे !!!

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