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