2012-02-29 3 views
5

특정 판매 주문에 대한 메모를 입력하는 기능이있는 웹 응용 프로그램을 개발했습니다.C#에서 어떤 이메일이 다른 이메일에 대한 답장인지 어떻게 알 수 있습니까?

고객 또는 고객 서비스 담당자가 메모를 입력하면 해당 당사자에게 전자 메일 알림이 전송됩니다 (전자 메일 알림은 C#의 SmtpClient & MailMessage 개체를 사용하여 전송됩니다).

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

내가 메시지의 Message-IdGuid을 설정하고이 메시지 헤더에 전송되는.

이 모든 것이 정상적으로 작동합니다.

이제 해당 당사자가 각자의받은 편지함에서 전자 메일 알림에 회신 할 수있는 기능을 개발하고 싶습니다.

그리고 응답을 당사자가 통보받은 동일한 판매 주문에 대한 메모에 기록하고 싶습니다.

알림 - 답장을 위해받은 편지함을 읽는 데 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

믿을만한 방법이 없다는 것을 알고있는 한, 전자 메일 클라이언트가 자비 롭습니다. 각 전자 메일 클라이언트에는 고유 한 단점이 있습니다. 필자가 보았던 유사한 시스템의 대부분은 유일한 ID를 넣기 위해 * 제목 줄 *을 사용했다가 메시지가 처음부터 "RE :"를 제거 할 때 사용되었다. –

+0

이메일에 몇 가지 맞춤 헤더를 추가했습니다. – PraveenVenu

+0

Outlook의 대화조차도 주제에 기반한다고 생각합니다. –

답변

3

내가 생각할 수있는 최선의 해결책은 예를 들어 '+'기호를 사용하여 '보낸 사람'및/또는 '답장'헤더에 데이터를 넣는 것입니다.

[email protected]에 전송 된 메시지가 [email protected]에 속하는 있도록, 서버를 메일에 당신은 필터 규칙을 추가해야 수익 adress은이 [email protected]

이다 말 mailbox

Facebook 알림은 직접 전자 메일 답장에이 태그를 사용합니다.

Gmail은 (Gmail 주소가있는 경우 그것을 시도)

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

이 도움이 될 희망도 그것을 사용합니다. 이 경우, 메일 서버 구성에 행운이

@jbl로 대답으로
1

, 우리는 개념을 해결 플러스를 사용했다. 우리는 이메일 제공 업체에게 SMTP 서버에서이 개념을 사용하도록 요청했습니다. Gmail은 기본적으로이 기능을 제공합니다.

이메일을 보낼 때 아래의 주문에 입력 한 모든 메모에 대해 주소에 고유 한 답장을 보냅니다.

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] 사서함에서 수신 될 것이다. 우리는 외출 한 모든 이메일 하단에 메모를 남깁니다 : 회신 주소를 변경하지 마십시오. 이메일 사서함에 도달하면

, 우리는 단지

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

아래로, 이메일 회신의 To 주소를 확인하고 필요한 주문 ID 및 사용자 ID를 얻을 필요가 그리고 우리는 영원히 행복하게 살았습니다 !!!