使用 smtp 设置消息 ID 之后可能会被重置?
Setting message Id using smtp may be reset after that?
我有使用 smtp 协议发送电子邮件的客户端,但我需要为我发送的每封电子邮件保存消息 ID,我搜索了很多有关获取消息 ID 的信息,但我没有找到方法,所以我必须通过我在代码中的自我。
我的问题是邮件服务器是否保证我设置的header的邮件id在发送邮件后不会被邮件服务器替换或重置?
我尝试了我的代码,它在我向 Gmail 发送电子邮件时有效,并且在电子邮件发送后仍然保留我设置的邮件 ID。
但我不确定它是否始终适用于所有电子邮件?
设置消息 ID 的原因是因为我需要将此消息 ID 保存在数据库中,因为之后我将检索每封已发送电子邮件的回复,我发现将此电子邮件与其回复相关联的唯一方法是消息id.
提前致谢,我希望在这里找到回复
Guid id = Guid.NewGuid();
mail.Headers.Add("Message-Id", String.Format("<{0}@{1}>", id.tostring(), "mail.example.com"));
本身没有 "guarantee",但 SMTP(或其他)邮件服务器很少会取代您的 Message-ID
header。
也就是说,虽然使用 Guid 在技术上可行,但它 是 一个非常非常长的字符串,用作 Message-ID
。这是我在 MailKit 中生成 Message-Id
的方法:
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 ();
}
我有使用 smtp 协议发送电子邮件的客户端,但我需要为我发送的每封电子邮件保存消息 ID,我搜索了很多有关获取消息 ID 的信息,但我没有找到方法,所以我必须通过我在代码中的自我。 我的问题是邮件服务器是否保证我设置的header的邮件id在发送邮件后不会被邮件服务器替换或重置?
我尝试了我的代码,它在我向 Gmail 发送电子邮件时有效,并且在电子邮件发送后仍然保留我设置的邮件 ID。 但我不确定它是否始终适用于所有电子邮件?
设置消息 ID 的原因是因为我需要将此消息 ID 保存在数据库中,因为之后我将检索每封已发送电子邮件的回复,我发现将此电子邮件与其回复相关联的唯一方法是消息id.
提前致谢,我希望在这里找到回复
Guid id = Guid.NewGuid();
mail.Headers.Add("Message-Id", String.Format("<{0}@{1}>", id.tostring(), "mail.example.com"));
本身没有 "guarantee",但 SMTP(或其他)邮件服务器很少会取代您的 Message-ID
header。
也就是说,虽然使用 Guid 在技术上可行,但它 是 一个非常非常长的字符串,用作 Message-ID
。这是我在 MailKit 中生成 Message-Id
的方法:
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 ();
}