2012-02-29 24 views
5

He desarrollado una aplicación web, en la cual hay una funcionalidad para ingresar notas para un pedido de venta en particular.¿Cómo puedo saber qué correo electrónico es una respuesta a otro correo electrónico, en C#?

Cuando un cliente o un ejecutivo de servicio al cliente ingresa una nota, se envía una notificación por correo electrónico a la parte correspondiente (la notificación por correo electrónico se envía utilizando SmtpClient & MailMessage objects en 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);      
} 

estoy fijando un Guid como el Message-Id del mensaje que se envió en las cabeceras de los mensajes.

Todo esto funciona bien.

Ahora quiero desarrollar una funcionalidad para que las partes respondan a la notificación por correo electrónico desde su bandeja de entrada respectiva.

Y quiero registrar las respuestas en las notas para el mismo pedido de ventas (para el que la parte recibió la notificación).

Estoy usando OpenPop.dll para leer la bandeja de entrada para respuestas de notificación.

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

De la función anterior, puedo leer todos los correos electrónicos de mi cuenta "[email protected]". Pero no puedo encontrar el Message-Id en el encabezado In-reply-to de los correos electrónicos.

No sé lo que estoy haciendo mal.

+1

Por lo que sé que no hay un método confiable para hacer esto, usted está a merced de un cliente de correo electrónico, y cada cliente de correo electrónico tiene sus propias peculiaridades. La mayoría de los sistemas similares que he visto usan * subject línea * para poner una identificación única en, y luego, cuando el mensaje es respondido para quitar "RE:" desde el principio. –

+0

Solíamos agregar un encabezado personalizado en el correo electrónico. – PraveenVenu

+0

Creo que incluso las conversaciones de Outlook están basadas en temas. –

Respuesta

3

La mejor solución que puedo pensar es poner sus datos en el encabezado "De" y/o "Responder a" usando, por ejemplo, el signo '+'.

decir su dirección de retorno es [email protected]

Hay que añadir una regla de filtrado en el que el servidor de correo, por lo que cualquier mensaje enviado a [email protected] cae en [email protected]ourdomain.com buzón

Las notificaciones de Facebook lo usan para recibir respuestas directas por correo electrónico.

Gmail utiliza también (probarlo si tiene una dirección de Gmail)

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

Esperamos que esto ayude. Si es así, buena suerte con la configuración del servidor de correo

1

Como respondió @jbl, utilizamos el concepto de direccionamiento plus. Le pedimos a nuestro proveedor de correo electrónico que habilite este concepto en nuestro servidor SMTP. Gmail proporciona esto por defecto.

Al enviar un correo electrónico, le daríamos una respuesta única a la dirección de cada nota ingresada en un pedido como el siguiente.

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

Esto haría que el replyToAddress = "[email protected]", una dirección única para identificar el orden y el usuario que ha publicado la nota.

Ahora, esta única respuesta a la dirección se asignaría al correo electrónico que se muestra a continuación.

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 dirección aparecería en el que abordar, si el usuario hace clic en el botón de respuesta en su cliente de correo electrónico como se muestra a continuación.

Reply To Address shown in To in the email cient

Si el usuario no cambia la dirección To, iba a ser recibido en nuestro buzón de correo [email protected]. Colocamos una nota en la parte inferior de cada correo electrónico que sale: No cambie la dirección A para asignar su respuesta correctamente al sistema.

Una vez que el correo electrónico llega al buzón de correo, sólo tenemos que comprobar la dirección To de la respuesta de correo electrónico y obtener el ID de orden requerido y el ID de usuario, como a continuación

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

Y entonces vivimos felices para siempre !!!

Cuestiones relacionadas