SMTP через.Net C# веб-приложение - второе письмо не отправляется на рабочий сервер

У нас есть проект C# ASP.Net, который отправляет электронную почту через SMTP.
У нас нормальный цикл восстановления пароля, отправлено два письма. Первый имеет код доступа для восстановления пароля, второй возвращает временный пароль.

Когда пользователь запрашивает утерянный пароль, это письмо всегда принимается. Затем пользователь нажимает на ссылку в письме, вводит код и отправляет второе письмо. Первое письмо всегда получено.

Второе электронное письмо всегда принимается в нашей среде разработки, но только периодически, в нашей развернутой версии. (Сервер Webdrive)

Второе письмо использует ту же конфигурацию почты. Это объект почтового сообщения, где мы вызываем метод send. Мы не получаем никаких сообщений об ошибках. Мы считали, что это может рассматриваться как спам, но..... Есть идеи?

Письма запускаются в отдельном потоке. Два письма отправляются асинхронно.

Настройки web.config электронной почты:

<mailSettings>
      <smtp deliveryMethod="Network" from="info@mysite.com">
        <network host="smtp.webhost.co.nz"
                     defaultCredentials="false"
                     enableSsl="true"
                     password="password"
                     port="587"
                     userName="info@mysite.com"/>
     </smtp>
    </mailSettings>

Вот код:

public bool SendEMailTempPass(string EmailRecipients, string Subject, string Body, bool isHTML = true)
        {
            try
            {
                var sendMailThreadPass = new Thread(() =>
                {
                    System.Net.Configuration.SmtpSection smtpSettings = new System.Net.Configuration.SmtpSection();
                    System.Net.Mail.SmtpClient smtp = new System.Net.Mail.SmtpClient();//settings.Smtp.Network.Host);
                    string strFrom = ConfigurationManager.AppSettings["Mailto"];
                    MailMessage mailObj = new MailMessage(strFrom, EmailRecipients, Subject, Body);
                    mailObj.IsBodyHtml = isHTML;
                    smtp.SendCompleted += new SendCompletedEventHandler(PassChangeEmail_SendCompleted);

                    smtp.SendAsync(mailObj, null);
                });

                sendMailThreadPass.Start();

            }
            catch (Exception ex)
            {
                ErrorMessage = ex.Message;
                return false;
            }
            ErrorMessage = "";
            return true;
        }

        void PassChangeEmail_SendCompleted(object sender, AsyncCompletedEventArgs e)
        {
            if (e.Cancelled)
            { }
            else if (e.Error != null)
            {
                ErrorMessage = e.Error.ToString();
                EmailStatus = 0;
            }
            else
            {
                ErrorMessage = "";
                SuccessMessage = "Thank you.  We will be in touch!";
                EmailStatus = 1;
            }
        }

Вот как это называется:

string body = PassResetEmail.PopulateBodyPassReset(this.Name + " " + this.Lastname,                                                                               LinkURL,PicURL, NewPassword, strPassResetEmailTemplate);

PassResetEmail.SendEMailTempPass(this.Email, "Change your temporary password", body, true);

Я протестировал его с учетной записью Google, и у нас возникла та же проблема: первое письмо отправляется, а второе редко проходит.

Любые идеи о том, где смотреть или на что смотреть?

Сначала мы подумали, что это мог быть какой-то спам-фильтр, но он выглядит одинаково для двух разных провайдеров.

Другое дело, что он отлично работает в нашей локальной среде, даже с теми же настройками почтового провайдера.

Любые идеи будут высоко оценены!

Спасибо!

1 ответ

Решение

У меня были проблемы с SendAsync маскировка реальных ошибок - я не могу вспомнить точный сценарий, но я заменил его на свой собственный асинхронный вызов с использованием ThreadPool:

Замените ваш звонок на smtp.SendAsync(mailObj, null); с

ThreadPool.QueueUserWorkItem(SendEmail, new EmailPair { Client = client, Email = message });

вам понадобится следующий вспомогательный класс и реальный метод, который отправляет электронное письмо:

public class EmailPair
{
    public SmtpClient Client { get; set; }
    public MailMessage Email { get; set; }
}

public static void SendEmail(object state)
{
    var pair = (EmailPair) state;
    try
    {
        pair.Client.Send(pair.Email);
    }
    catch (Exception e)
    {
        Log.Error(e);
    }
}

Вам действительно нужно регистрировать ВСЕ исключения e (убедитесь, что e.InnerException регистрируется правильно, чтобы вы могли видеть, что происходит)

Вам, вероятно, нужно привлечь вашего дружелюбного сетевого парня, чтобы увидеть, сможет ли он увидеть, что на самом деле попадает на почтовый сервер.

Другие вопросы по тегам