Цикл над SmtpClient.Send () - PullRequest
3 голосов
/ 31 января 2012

Я работаю над продуктом ASP.NET (C #), который должен отправлять уникальные электронные письма списку подписчиков.Мой код выглядит примерно так:

// Grab subscribers from db, about 10-20.
var malingList = Bll.GetAllSubscribers();
var client = new SmtpClient(); 

// Set up settings on the SmtpClient with cridentails and so on

foreach(var subscriber in mailingList)
{
  var message = new MailMessage(); 
  // Set up message, set reciver, yada yada
  Client.Send(message);
}

client.Dispose();

Я получаю эту ошибку при тестировании с помощью "fake smtp". Papercut: сбой при отправке почты. Невозможно записать данные в транспортное соединение:

Что я хочу сделать, так это сохранить SMTP-соединение открытым.не нужно воспроизводить «рукопожатие» с каждым электронным письмом.

Я не на 100 уверен, но.Должно ли это работать?Я думаю, что у меня есть еще один проект, в котором он реализован следующим образом.

Ответы [ 2 ]

0 голосов
/ 31 января 2012

Библиотека Papercut не сможет упростить поведение, которое вы ищете, потому что каждый раз, когда вы вызываете Send, оно разрывает текущее соединение, устанавливает другое соединение с сервером и в любом случае выполняет рукопожатие. Вот источник из их хранилища CodePlex:

public void Send()
{
    string response;

    Connect(session.Sender, 25);
    response = Response();
    if (response.Substring(0, 3) != "220")
        throw new SmtpException(response);

    Write("HELO {0}\r\n", Util.GetIPAddress());
    response = Response();
    if (response.Substring(0, 3) != "250")
        throw new SmtpException(response);

    Write("MAIL FROM:<{0}>\r\n", session.MailFrom);
    response = Response();
    if (response.Substring(0, 3) != "250")
        throw new SmtpException(response);

    session.Recipients.ForEach(address =>
        {
            Write("RCPT TO:<{0}>\r\n", address);
            response = Response();
            if (response.Substring(0, 3) != "250")
                throw new SmtpException(response);
        });

    Write("DATA\r\n");
    response = Response();
    if (response.Substring(0, 3) != "354")
        throw new SmtpException(response);

    NetworkStream stream = GetStream();
    stream.Write(session.Message, 0, session.Message.Length);

    Write("\r\n.\r\n");
    response = Response();
    if (response.Substring(0, 3) != "250")
        throw new SmtpException(response);

    Write("QUIT\r\n");
    response = Response();
    if (response.IndexOf("221") == -1)
        throw new SmtpException(response);
}

Конечно, вы можете изменить источник, чтобы сделать то, что вы есть, считая его открытым исходным кодом.

0 голосов
/ 31 января 2012

Полагаю, это может иметь какое-то отношение к ограничению клиента smtp для отправки массовых писем. Может быть, вы могли бы распоряжаться клиентом время от времени после 20-30 писем?

Ответ получен от: Ошибка при отправке почты. Невозможно записать данные в транспортное соединение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...