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

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

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

Все это прекрасно работает.

Теперь я хочу разработать функциональность, позволяющую сторонам отвечать на уведомления по электронной почте из их соответствующих почтовых ящиков.

И я хочу записать ответы в заметках для того же Sales -Order (для которого сторона получила уведомление).

Я использую 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 ответа

Решение

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

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

Вы должны добавить правило фильтрации на своем почтовом сервере, чтобы любое сообщение, отправленное на адрес replies+anyrelevantdatahere@yourdomain.com, попадало в почтовый ящик replies@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 адрес будет отображаться в адресе, если пользователь нажимает кнопку ответа в своем почтовом клиенте, как показано ниже.

Ответить на адрес, указанный в поле

Если пользователь не меняет 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);

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

Другие вопросы по тегам