Отправка списка писем с SmtpClient - PullRequest
2 голосов
/ 21 апреля 2010

Я использую SendCompletedEventHandler из SmtpClient при отправке списка электронных писем.

SendCompletedEventHandler вызывается только тогда, когда все электронные письма в списке уже отправлены.

Я предположил, что SendCompletedEventHandler вызывается при отправке электронного письма.

Что-то не так в моем коде?

    public void SendAllNewsletters(List<string> recipients)
    {
        string mailText  = "My Text";
        foreach(string recipient in recipients)
        {
            //if this loop takes 10min then the first call to
            //SendCompletedCallback is after 10min
            SendNewsletter(mailText,recipient);
        }
    }

    public bool SendNewsletter(string mailText , string emailaddress)
    {

            SmtpClient sc = new SmtpClient(_smtpServer, _smtpPort);
            System.Net.NetworkCredential SMTPUserInfo = new System.Net.NetworkCredential(_smtpuser, _smtppassword);
            sc.Credentials = SMTPUserInfo;
            sc.SendCompleted += new SendCompletedEventHandler(SendCompletedCallback);

            MailMessage mm = null;
            mm = new MailMessage(_senderemail, emailaddress );
            mm.IsBodyHtml = true;
            mm.Priority = MailPriority.Normal;
            mm.Subject = "Something";
            mm.Body = mailText ;
            mm.SubjectEncoding = Encoding.UTF8;
            mm.BodyEncoding = Encoding.UTF8;

            //Mail 
            string userState = emailaddress;
            sc.SendAsync(mm, userState);

            return true;
    }


    public void SendCompletedCallback(object sender, AsyncCompletedEventArgs e)
    {
        // Get the unique identifier for this asynchronous operation.
        String token = (string)e.UserState;
        if (e.Error != null)
        {
            _news.SetNewsletterEmailsisSent(e.UserState.ToString(), _newslettername, false, e.Error.Message); 
        }
        else
        {
            _news.SetNewsletterEmailsisSent(e.UserState.ToString(), _newslettername, true, string.Empty);
        }            
    }

Ответы [ 2 ]

1 голос
/ 21 апреля 2010

Вы создаете новый экземпляр SmtpClient каждый раз (а затем переназначаете обработчик). Используйте статическую переменную с большей областью действия.

0 голосов
/ 21 апреля 2010

На моем компьютере все работает так, как ожидалось, за исключением того, что конструктор MailMessage выдает исключение формата, поскольку "My Tex" не является действительным адресом электронной почты. Первым аргументом является адрес электронной почты отправителя.

Как отмечает Джош Стодола, вы должны кэшировать SmtpClient для жизни этого класса, а не создавать еще один для каждого вызова. Если вы не кэшируете SmtpClient, то вам следует добавить следующую строку в конец вашего SendCompletedCallback (желательно в блоке finally):

((SmtpClient)sender).SendCompleted -= SendCompletedCallback;

Если это вам не поможет, возможно, вы могли бы опубликовать более подробную информацию - например, какие данные содержатся в аргументах события, которые do вызывают?

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