Как я могу узнать, какое электронное письмо является ответом на другое электронное письмо на C#?

StackOverflow https://stackoverflow.com/questions/9494542

  •  14-11-2019
  •  | 
  •  

Вопрос

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

Когда примечание вводится клиентом или руководителем службы поддержки клиентов, соответствующее уведомление отправляется по электронной почте (уведомление по электронной почте отправляется с использованием объектов 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 заголовок писем.

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

Это было полезно?

Решение

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

Допустим, ваш обратный адрес — Answer@yourdomain.com.

Вам необходимо добавить правило фильтрации на свой почтовый сервер, чтобы любое сообщение, отправленное на ответы+любые соответствующие данныездесь@вашдомен.com, попадало в почтовый ящик Answers@yourdomain.com.

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

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

( видеть http://forums.smartertools.com/showthread.php/27790-Plus-Addressing-configure-symbol )

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

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top