Установка идентификатора сообщения с помощью smtp может быть сброшена после этого?
У меня есть клиент, который отправляет электронные письма по протоколу smtp, но мне нужно сохранять идентификатор сообщения для каждого отправленного мной письма, я много искал, чтобы получить идентификатор сообщения, но не нашел способа, поэтому мне нужно установить его самостоятельно в коде. Мой вопрос: гарантирует ли почтовый сервер, что идентификатор сообщения, который я установил в заголовке, не будет заменен или сброшен почтовым сервером после отправки электронной почты?
Я попробовал свой код, и он работает, когда я отправляю письмо в Gmail и после отправки письма сохраняю установленный мной идентификатор сообщения. но я не уверен, что он работает всегда со всеми письмами?
причина для установки идентификатора сообщения, потому что мне нужно сохранить этот идентификатор сообщения в базе данных, потому что после этого я буду получать ответы на каждое отправленное письмо, и я нашел единственный способ соотнести это письмо с его ответами, это идентификатор сообщения.
спасибо заранее и я хочу найти ответ здесь
Guid id = Guid.NewGuid();
mail.Headers.Add("Message-Id", String.Format("<{0}@{1}>", id.tostring(), "mail.example.com"));
1 ответ
Там нет "гарантии" как таковой, но редко когда SMTP (или другой) почтовый сервер заменит ваш Message-ID
заголовок.
Тем не менее, хотя технически работает Guid, это действительно очень длинная строка для использования в качестве Message-ID
, Вот как я генерирую Message-Id
в MailKit:
const string base36 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
static void GetRandomBytes (byte[] buffer)
{
using (var random = RandomNumberGenerator.Create ())
random.GetBytes (buffer);
}
/// <summary>
/// Generates a Message-Id.
/// </summary>
/// <remarks>
/// Generates a new Message-Id using the supplied domain.
/// </remarks>
/// <returns>The message identifier.</returns>
/// <param name="domain">A domain to use.</param>
/// <exception cref="System.ArgumentNullException">
/// <paramref name="domain"/> is <c>null</c>.
/// </exception>
/// <exception cref="System.ArgumentException">
/// <paramref name="domain"/> is invalid.
/// </exception>
public static string GenerateMessageId (string domain)
{
if (domain == null)
throw new ArgumentNullException (nameof (domain));
if (domain.Length == 0)
throw new ArgumentException ("The domain is invalid.", nameof (domain));
ulong value = (ulong) DateTime.Now.Ticks;
var id = new StringBuilder ();
var block = new byte[8];
GetRandomBytes (block);
do {
id.Append (base36[(int) (value % 36)]);
value /= 36;
} while (value != 0);
id.Append ('.');
value = 0;
for (int i = 0; i < 8; i++)
value = (value << 8) | (ulong) block[i];
do {
id.Append (base36[(int) (value % 36)]);
value /= 36;
} while (value != 0);
id.Append ('@').Append (domain);
return id.ToString ();
}