Установка идентификатора сообщения с помощью smtp может быть сброшена после этого? - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть клиент, который отправляет электронные письма по протоколу smtp, но мне нужно сохранять идентификатор сообщения для каждого отправленного мной письма, я много искал, чтобы получить идентификатор сообщения, но я не нашел пути, поэтому я должен установить его самостоятельнов коде.Мой вопрос: гарантирует ли почтовый сервер, что идентификатор сообщения, который я установил в заголовке, не будет заменен или сброшен почтовым сервером после отправки электронной почты?

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

причина установить идентификатор сообщения, потому что мне нужно сохранить этот идентификатор сообщения в базе данных, потому что после этого я буду получать ответы на каждое отправленное письмо иЯ нашел единственный способ сопоставить это письмо с его ответами - это идентификатор сообщения.

Заранее спасибо, и я хочу найти ответ здесь

 Guid id = Guid.NewGuid();  
 mail.Headers.Add("Message-Id", String.Format("<{0}@{1}>", id.tostring(), "mail.example.com"));

1 Ответ

0 голосов
/ 30 ноября 2018

По сути, нет никакой "гарантии", но редко SMTP (или другой) почтовый сервер заменит ваш Message-ID заголовок.

Тем не менее, при техническом использовании Guid он является действительно очень длинной строкой для использования в качестве Message-ID.Вот как я генерирую Message-Id in 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 ();
}
...