2012-02-29 29 views
5

Tôi đã phát triển một ứng dụng web, trong đó có chức năng để nhập ghi chú cho một Đơn đặt hàng cụ thể.Làm cách nào để biết email nào là thư trả lời cho một email khác, trong C#?

Khi ghi chú được Khách hàng hoặc Người quản lý dịch vụ khách hàng nhập, thông báo qua email được gửi đến bên liên quan (thông báo qua email được gửi bằng SmtpClient & đối tượng MailMessage trong C#).

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);      
} 

Tôi đang thiết lập một Guid như Message-Id của thông điệp được gửi trong tiêu đề thư.

Tất cả điều này hoạt động tốt.

Bây giờ tôi muốn phát triển một chức năng để các bên trả lời thông báo qua email từ hộp thư đến tương ứng của họ.

Và tôi muốn ghi lại câu trả lời trong ghi chú cho cùng một Đơn hàng bán hàng (mà bên nhận được thông báo).

Tôi đang sử dụng OpenPop.dll để đọc hộp thư đến để nhận thông báo trả lời.

/// <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; 
    } 
} 

Từ chức năng trên, tôi có thể đọc tất cả email từ tài khoản "[email protected]" của tôi. Nhưng tôi không thể tìm thấy số Message-Id trong tiêu đề In-reply-to của email.

Tôi không biết mình đang làm gì sai.

+1

Theo như tôi biết không có phương pháp đáng tin cậy để làm điều này, bạn đang ở lòng thương xót của một ứng dụng email, và mỗi khách hàng email có quirks riêng của mình. Hầu hết các hệ thống tương tự mà tôi đã nhìn thấy sử dụng * dòng tiêu đề * để đặt một id duy nhất trong, và sau đó, khi tin nhắn được trả lời để dải "RE:" từ đầu. –

+0

Chúng tôi đã sử dụng để thêm một số tiêu đề tùy chỉnh trong email. – PraveenVenu

+0

Tôi tin rằng ngay cả các cuộc hội thoại của Outlook cũng dựa trên chủ đề. –

Trả lời

3

Giải pháp tốt nhất mà tôi có thể nghĩ đến là đặt dữ liệu của bạn vào tiêu đề "Từ" và/hoặc "Trả lời" bằng cách sử dụng ký hiệu '+'.

Giả sử địa chỉ trở lại của bạn là [email protected]

Bạn cần phải thêm một quy tắc lọc trong bạn mail server, do đó bất kỳ tin nhắn gửi đến [email protected] rơi vào [email protected] hộp thư

Thông báo trên Facebook sử dụng thông báo này để trả lời email trực tiếp.

gmail sử dụng nó quá (thử nó nếu bạn có một địa chỉ gmail)

(xem http://forums.smartertools.com/showthread.php/27790-Plus-Addressing-configure-symbol)

Hy vọng điều này sẽ giúp. Nếu vậy, chúc bạn may mắn với cấu hình máy chủ thư

1

Như đã trả lời bởi @jbl, chúng tôi đã sử dụng khái niệm địa chỉ cộng. Chúng tôi đã yêu cầu nhà cung cấp dịch vụ email của chúng tôi bật khái niệm này trên máy chủ SMTP của chúng tôi. Gmail cung cấp tùy chọn này theo mặc định.

Khi gửi bất kỳ email nào, chúng tôi sẽ trả lời duy nhất để giải quyết mọi ghi chú được nhập trên một đơn đặt hàng như dưới đây.

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

Điều này sẽ làm cho replyToAddress = "[email protected]", một địa chỉ duy nhất để xác định đơn hàng và người dùng đã đăng ghi chú.

Bây giờ, trả lời duy nhất để giải quyết này sẽ được chỉ định cho email đi ra ngoài như sau.

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 địa chỉ sẽ xuất hiện trong địa chỉ, nếu người dùng nhấp vào nút trả lời trong ứng dụng email của họ như được hiển thị bên dưới.

Reply To Address shown in To in the email cient

Nếu người dùng không thay đổi địa chỉ To, nó sẽ được nhận về hộp thư [email protected] của chúng tôi. Chúng tôi đặt một ghi chú ở cuối mỗi email đi ra: Vui lòng không thay đổi địa chỉ Tới để ánh xạ thư trả lời của bạn đúng cách cho hệ thống.

Một khi email đến hộp thư, chúng ta chỉ cần kiểm tra địa chỉ To của email trả lời và lấy id trật tự cần thiết và sử dụng id, như sau

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); 

Và sau đó chúng tôi sống hạnh phúc mãi mãi về sau !!!

Các vấn đề liên quan