C# SmtpClient.Send() медленно из-за BCC
Я использую "System.Net.Mail" для отправки электронной почты в нашей системе Интранет в C#
Метод Send() был очень медленным, и я не понял, почему.
После отладки я удалил вызов BCC: (MM - это MailMessage() и Item - строковый адрес электронной почты):
MM.Bcc.Add(new MailAddress(Item));
Прежде чем я прокомментировал эту строку, электронное письмо занимало около 30 или 40 секунд. Теперь это около 2 секунд. Зачем?
Есть ли объяснение по этому поводу? Я могу добавить "To" и "CC" без проблем с производительностью. Но не "BCC".
1 ответ
У меня была похожая проблема, и это сводило меня с ума, пытаясь понять, что заставляет одни электронные письма работать медленнее, а другие - быстрее.
Первое электронное письмо, отправленное после создания SmtpClient, занимает 5 секунд. После этого, при повторном использовании того же SmtpClient, это займет около 0,4 секунды, если будет сделано в течение 60 секунд по сравнению с предыдущим. После этого я думаю, что это освобождает соединение с пулом.
Однако добавление CC, который является дубликатом адреса To, всегда добавляет дополнительные 5 секунд. Добавление дубликата CC дважды добавит 10 секунд.
Я не проверял, но я предполагаю, что то же самое будет верно, если дубликаты будут в списках "TO" или "BCC".
Вот код для удаления дубликатов:
// check and remove duplicates
for (int x = 0; x < message.To.Count; x++)
{
for (int y = message.To.Count - 1; y > x; y--)
{
if (message.To[y].Address == message.To[x].Address)
message.To.RemoveAt(y);
}
for (int y = message.CC.Count - 1; y >= 0; y--)
{
if (message.CC[y].Address == message.To[x].Address)
message.CC.RemoveAt(y);
}
for (int y = message.Bcc.Count - 1; y >= 0; y--)
{
if (message.Bcc[y].Address == message.To[x].Address)
message.Bcc.RemoveAt(y);
}
}
for (int x = 0; x < message.CC.Count; x++)
{
for (int y = message.CC.Count - 1; y > x; y--)
{
if (message.CC[y].Address == message.CC[x].Address)
message.CC.RemoveAt(y);
}
for (int y = message.Bcc.Count - 1; y >= 0; y--)
{
if (message.Bcc[y].Address == message.CC[x].Address)
message.Bcc.RemoveAt(y);
}
}
for (int x = 0; x < message.Bcc.Count; x++)
{
for (int y = message.Bcc.Count - 1; y > x; y--)
{
if (message.Bcc[y].Address == message.Bcc[x].Address)
message.Bcc.RemoveAt(y);
}
}