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);
    }
}
Другие вопросы по тегам