Почему я не могу отправить два письма подряд с помощью c #? - PullRequest
0 голосов
/ 10 ноября 2011

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

Я не использую локальный SMTP-сервер, и я понимаю (согласно @rizzle response здесь ), что между одним письмом и другим должно быть какое-то время.Тем не менее, я сплю свою программу в течение 10 секунд, и все же, отправляется только первое электронное письмо, а не второе (пока я пробую свою систему с двумя электронными письмами вместо ста).Это мой код, есть идеи?

foreach (Person p in clientList)
            {
                AlternateView plainView = AlternateView.CreateAlternateViewFromString("Texto visible para clientes que no tienen HTML", null, "text/plain");
                //AlternateView htmlView = AlternateView.CreateAlternateViewFromString("Here is an embedded image.<img src=cid:companylogo>", null, "text/html");

                string htmlString = "html string body of the email";
                AlternateView htmlView = AlternateView.CreateAlternateViewFromString(htmlString, null, "text/html");

                System.Net.Mail.MailMessage message = new System.Net.Mail.MailMessage();
                message.AlternateViews.Add(htmlView);
                message.To.Add(p.email.Trim());
                message.Subject = p.nombre+", email subject";
                message.From = new System.Net.Mail.MailAddress(fromAddress);
                System.Net.Mail.SmtpClient client = new System.Net.Mail.SmtpClient("...");
                NetworkCredential myCreds = new NetworkCredential(usr, pass, "");
                client.Credentials = myCreds;
                client.Send(message);
                System.Threading.Thread.Sleep(10000);

            }

Ответы [ 2 ]

4 голосов
/ 10 ноября 2011

Do client.Dispose() сразу после отправки вашего последнего сообщения, если вы подключены к dotnet 4. Это заставит SMTP-компонент dotnet завершить свою работу.

См. Здесь: System.Net.Mail и MailMessage не отправляют сообщения немедленно

Если вы используете более ранние версии DotNet, попробуйте сделать несколько вещей.

Выполните message.Dispose(), когда закончите сЭкземпляр сообщения.

Определите ваш SmtpClient локально (внутри метода) и выйдите из метода, когда вы закончите отправку.То есть не пытайтесь хранить экземпляр вашего клиента как поле в одном из ваших долгоживущих экземпляров класса;оно не сбросит последнее сообщение, отправленное вами на сервер, пока оно не будет завершено.

(Они действительно исправили это в dotnet 4.0)

2 голосов
/ 10 ноября 2011

В 3.5 попробуйте использовать:

SmtpClient client = ...

client.SendCompleted += new SendCompletedEventHandler(SendCompletedCallback);

using (MailMessage message = ...)
{
  // where userToken is a user-defined token
  // to be passed to the SendCompletedCallback
  client.SendAsync(message, userToken);
} // Disposes of message

Затем в триггере SendCompletedCallback следующий ...

Класс SmtpClient

...