Как я могу узнать, какое письмо является ответом на другое письмо в C #? - PullRequest
5 голосов
/ 29 февраля 2012

Я разработал веб-приложение, в котором есть функция для ввода заметки для определенного заказа на продажу.

Когда примечание вводится клиентом или руководителем отдела обслуживания клиентов, соответствующему лицу отправляется уведомление по электронной почте (уведомление по электронной почте отправляется с использованием объектов SmtpClient и MailMessage в 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("replyto@email.com");                    
    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;
    }
}

Из вышеупомянутой функции я могу читать все электронные письма из моей учетной записи "replyto@email.com". Но я не могу найти Message-Id в заголовке In-reply-to писем.

Я не знаю, что я делаю неправильно.

Ответы [ 2 ]

4 голосов
/ 29 февраля 2012

Лучшее решение, которое я могу придумать, это поместить ваши данные в заголовок «От» и / или «Ответить», используя, например, знак «+».

Скажите, что ваш обратный адрес - ответы @ yourdomain.com

Вы должны добавить правило фильтрации на своем почтовом сервере, чтобы любое сообщение, отправленное на адрес replies+anyrelevantdatahere@yourdomain.com, попадало в почтовый ящик replies@yourdomain.com

Использование уведомлений Facebookэто для прямых ответов по электронной почте.

Gmail также использует его (попробуйте, если у вас есть адрес Gmail)

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

Надеюсь, что это будетПомогите.Если это так, удачи в настройке почтового сервера

2 голосов
/ 23 января 2014

Как ответил @jbl, мы использовали концепцию плюсовой адресации. Мы попросили нашего провайдера электронной почты включить эту концепцию на нашем SMTP сервере. Gmail предоставляет это по умолчанию.

При отправке любого электронного письма мы отправляем уникальный ответ на адрес для каждой записки, введенной в заказ, как показано ниже.

String sReplyToadd = "replyto@domain.com";
String replyToAddress = sReplyToadd.Substring(0, sReplyToadd.IndexOf('@')) + "+on" + orderID + "un" + userID + sReplyToadd.Substring(sReplyToadd.IndexOf('@'), sReplyToadd.Length - sReplyToadd.IndexOf('@'));

Это сделает replyToAddress = "replyto+on1234un5678@domain.com", уникальный адрес для идентификации заказа и пользователя, который разместил заметку.

Теперь этот уникальный ответ на адрес будет назначен электронной почте, как показано ниже.

using (MailMessage objEmail = new MailMessage())
{
    objEmail.Body = eMailBody;
    objEmail.From = new MailAddress("from@domain.com", "Display Name");
    objEmail.IsBodyHtml = true;
    objEmail.Subject = "email subject goes here";
    objEmail.To.Add(new MailAddress("tosomeuser@gmail.com");

    //here we set the unique reply to address for the outgoing email
    objEmail.ReplyTo = new MailAddress(replyToAddress); //replyto+on1234un5678@domain.com

    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 адрес появится в адресе to, если пользователь нажимает кнопку ответа в своем почтовом клиенте, как показано ниже.

Reply To Address shown in To in the email cient

Если пользователь не изменит адрес To, он будет получен в нашем replyto@domain.com почтовом ящике. Мы помещаем примечание внизу каждого выходящего электронного письма: Пожалуйста, не меняйте адрес Кому, чтобы правильно сопоставить ваш ответ с системой.

Как только электронная почта достигает почтового ящика, нам просто нужно проверить 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);

А потом мы жили долго и счастливо !!!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...