У меня есть сценарий, отправляющий почту из моего приложения .net.

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

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

С другой стороны, аналогичный скрипт, сделанный в классическом asp, работает, и я получаю почту мгновенно.

Я что-то упускаю?

Это asp-скрипт (который работает):

<%
Set objEmail = CreateObject("CDO.Message")
objEmail.From = "sender@mydomain.com"
objEmail.To = "recipient@gmail.com"
objEmail.Subject = "Test Mail"
objEmail.Textbody = "Test Mail"
objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "mail.mydomain.com"
objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = "1"
objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusername") = "myusername"
objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "mypassword"
objEmail.Configuration.Fields.Update
objEmail.Send
If Not err.number=0 Then
Response.write "ERROR: " & err.Description
err.Clear
end if
%>

Это .NEt (который не работает):

public static void SendEmail(string senderName, string senderEmail, string recipient, string comments, string subject, bool inTemplate)
{
    MailAddress from = new MailAddress(senderEmail);
    MailAddress to = new MailAddress(recipient);
    MailMessage mail = new MailMessage(from, to);
    mail.ReplyToList.Add(senderEmail);
    mail.Subject = subject;
    mail.IsBodyHtml = true;
    mail.Body = comments;

    Configuration configurationFile = WebConfigurationManager.OpenWebConfiguration(HttpContext.Current.Request.ApplicationPath);
    MailSettingsSectionGroup mailSettings = configurationFile.GetSectionGroup("system.net/mailSettings") as MailSettingsSectionGroup;
    NetworkCredential basicCredentials = new NetworkCredential(mailSettings.Smtp.Network.UserName, mailSettings.Smtp.Network.Password);

    SmtpClient smtpClient = new SmtpClient();
    smtpClient.Host = mailSettings.Smtp.Network.Host;
    smtpClient.Port = mailSettings.Smtp.Network.Port;
    smtpClient.UseDefaultCredentials = false;
    smtpClient.Credentials = basicCredentials;

    try
    {
        smtpClient.Send(mail);
    }
    catch (Exception ex)
    {
        throw ex;
    }
}

Это мои настройки web.config:

  <system.net>
    <mailSettings>
      <smtp>
        <network host="mail.mydomain.com" userName="myusername" password="mypassword" port="25" />
      </smtp>
    </mailSettings>
  </system.net>

Настройки web.config верны, но даже если я вручную ввожу настройки сервера в класс - это не сработает.

Благодарность

0
nickornotto 15 Авг 2014 в 11:50
Попробуйте обработать событие SmtpClient.SendCompleted и посмотрите на ошибку в EventArgs
 – 
Robert
15 Авг 2014 в 11:53
Вам нужно установить порт, например, 587 в smtpClient, см. приведенный ниже ответ. установить вручную порт
 – 
Jatin Gadhiya
15 Авг 2014 в 11:56
Не работает как? Выдает исключение?
 – 
Antonio Bakula
15 Авг 2014 в 11:57
Я не вижу ничего плохого в вашем коде .net. Вы уверены, что значения для хоста, порта и учетных данных правильно извлекаются из вашей веб-конфигурации?
 – 
U r s u s
15 Авг 2014 в 12:10
@Dura, да, значения правильные. Во всяком случае, я сказал, что если использовать значения вручную вместо web.config, это не сработает.
 – 
nickornotto
15 Авг 2014 в 13:51

2 ответа

Лучший ответ

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

0
nickornotto 2 Окт 2014 в 12:16

Попробуй это:

 MailMessage mailMsg = new MailMessage();
    mailMsg.To.Add("test@hotmail.com");
                // From
    MailAddress mailAddress = new MailAddress("you@hotmail.com");
    mailMsg.From = mailAddress;

    // Subject and Body
    mailMsg.Subject = "subject";
    mailMsg.Body = "body";

    // Init SmtpClient and send on port 587 in my case. (Usual=port25)
    SmtpClient smtpClient = new SmtpClient("mailserver", 587);
    System.Net.NetworkCredential credentials = 
       new System.Net.NetworkCredential("username", "password");
    smtpClient.Credentials = credentials;

    smtpClient.Send(mailMsg);
0
Jatin Gadhiya 15 Авг 2014 в 11:54
Это ничего не меняет. Электронные письма все еще задерживаются.
 – 
nickornotto
15 Авг 2014 в 13:52