2011-04-20 3 views
1

У меня есть сайт с бэкэндом ASP.NET MVC с .NET 3.5. На этом веб-сайте есть сценарий, который отправляет письма с использованием gmail в качестве почтовой службы. Скрипт запускается и отправляет почту локально на моей машине dev, но как только я загружаю его на живой сервер, он терпит неудачу. Только сообщение об ошибке, что дает мне на данный момент (так как я сказал, это как вы увидите дальше):Ошибка SMTP-класса на реальном сервере

The transport failed to connect to the server.

Вот код для сценария почтовой программы:

using System.Net.Mail; 
using System.Web.Mail; 
using MailMessage = System.Web.Mail.MailMessage; 

namespace MySite.Helpers 
{ 
    public class GmailHelper 
    { 
     private readonly int _port = 465; 
     private readonly string _accountName; 
     private readonly string _password; 

     public GmailHelper(string accountName, string password) 
     { 
      _accountName = accountName; 
      _password = password; 
     } 
     public GmailHelper(string accountName, string password, int port) 
     { 
      _accountName = accountName; 
      _password = password; 
      _port = port; 
     } 
     public void Send(string from, string to, string subject, string body, bool isHtml) 
     { 
      Send(from, to, subject, body, isHtml, null); 
     } 

     public void Send(string from, string to, string subject, string body, bool isHtml, string[] attachments) 
     { 

      var mailMessage = new MailMessage 

                  { 
                   From = from, 
                   To = to, 
                   Subject = subject, 
                   Body = body, 
                   BodyFormat = isHtml ? MailFormat.Html : MailFormat.Text 
                  }; 


      // Add attachments 
      if (attachments != null) 
      { 
       foreach (var t in attachments) 
       { 
        mailMessage.Attachments.Add(new Attachment(t)); 
       } 
      } 

      // Authenticate 
      mailMessage.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate", 1); 
      // Username for gmail - [email protected] for email for Google Apps 
      mailMessage.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendusername", _accountName); 
      // Password for gmail account 
      mailMessage.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendpassword", _password); 
      // Google says to use 465 or 587. I don't get an answer on 587 and 465 works - YMMV 
      mailMessage.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpserverport", _port.ToString()); 
      // STARTTLS 
      mailMessage.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpusessl", true); 

      // assign outgoing gmail server 
      SmtpMail.SmtpServer = "smtp.gmail.com"; 
      SmtpMail.Send(mailMessage); 
     } 
    } 
} 

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

[HttpPost] 
public ActionResult Employment(EmploymentModel model, FormCollection collection) 
{ 
    if (!ModelState.IsValid) 
     return View(model); 

    var results = new EmploymentViewModel(); 
    try 
    { 

     results.Position = model.Position; 
     results.FirstName = model.FirstName; 
     results.LastName = model.LastName; 
     results.ContactPhone = model.ContactPhone; 
     results.OtherPhone = model.OtherPhone; 
     results.Address = model.Address; 
     results.Email = model.Email; 
     results.HsDiploma = model.HsDiploma.ToString(); 
     results.CollegeYears = model.CollegeYears; 
     results.Skills = model.Skills; 
     results.Employment = model.Employment; 
     results.DateSent = DateTime.Now.ToString("MM/dd/yyyy HH:mm:ss"); 

     var gmail = new GmailHelper("[email protected]", "[*removed*]"); 

     var fromAddress = new MailAddress("[email protected]", "MySite"); 
     var toAddress = new MailAddress("[email protected]", "MySite Employment"); 
     var subject = string.Format("Employment Application for {0} {1}", model.FirstName, model.LastName); 

     gmail.Send(fromAddress.Address, toAddress.Address, subject, EmployMailBody(results), false); 
    } 
    catch (Exception ex) 
    { 
     results.Sent = false; 
     results.Title = "Oops, our mail drone seems to have malfunctioned!"; 
     results.Message = string.Format("We appologize, {0} {1}, but our email system has encountered an error and your email was not sent.</p>", 
       results.FirstName, results.LastName); 
     results.Message += Environment.NewLine + "<p>Please try your request later, or fax your résumé to our Corporate office."; 
     results.Message += Environment.NewLine + JQueryHelpers.GenerateErrorField(ex.Message); 

     return View("EmploymentSubmit", results); 
    } 
    results.Sent = true; 
    results.Title = "Thank you for your submission!"; 
    results.Message = string.Format("Thank you for your interest in joining our team, {0} {1}!</p>", results.FirstName, results.LastName); 
    results.Message += Environment.NewLine + "<p>We have successfully recieved your information and will contact you shortly at the number your have provided."; 

    return View("EmploymentSubmit", results); 
} 

Я 99% уверен, что он был функционален раньше, когда он был на месте, но я могу ошибаться, как это было мон ч или так, так как мне пришлось обновить сайт.

Есть ли какие-то дополнительные шаги, которые я могу предпринять, чтобы отладить это «лучшее», чтобы отследить основную проблему, или я случайно отключил свой код?

Спасибо!

EDIT1

Я обновил класс использовать строго System.Net.Mail. Я успешно отправил сообщение с моей машины dev. Когда я загрузил сайт на мой сервер, однако, я получил новое сообщение об ошибке:

Request for the permission of type 'System.Net.Mail.SmtpPermission, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed.

Этот сайт размещен через godaddy.com, а некоторые после поиска вокруг него, кажется, GoDaddy только позволяет ретрансляцию через SMTP сервер. Похоже, мне придется сменить хостинг-провайдеров, чтобы это нормально работало.

Спасибо!

EDIT2

Причина, почему я переехал в GMAIL от GoDaddy изначально, когда у меня был этот сценарий до электронной почты будет занять от 15 до 45 минут, чтобы прибыть в поле назначения. Это мог быть устаревший код, который я использовал раньше, но в любом случае он теперь отправляется и прибывает в считанные секунды, как и должно быть. Вот мой GoDaddy вспомогательный класс, в случае, если это кому-то поможет:

public class GoDaddyHelperNet 
{ 
    private readonly int _port = 25; 
    private readonly MailAddress _accountName; 
    private readonly string _password; 
    private readonly string _host = "relay-hosting.secureserver.net"; 

    public GoDaddyHelperNet(MailAddress accountName, string password) 
    { 
     _accountName = accountName; 
     _password = password; 
    } 
    public GoDaddyHelperNet(MailAddress accountName, string password, int port) 
    { 
     _accountName = accountName; 
     _password = password; 
     _port = port; 
    } 
    public GoDaddyHelperNet(MailAddress accountName, string password, int port, string host) 
    { 
     _accountName = accountName; 
     _password = password; 
     _port = port; 
     _host = host; 
    } 
    public void Send(MailAddress to, string subject, string body, bool isHtml) 
    { 
     Send(_accountName, to, subject, body, isHtml); 
    } 

    public void Send(MailAddress from, MailAddress to, string subject, string body, bool isHtml) 
    { 
     var smtp = new SmtpClient 
         { 
          Host = _host, 
          Port = _port, 
          EnableSsl = false, 
          DeliveryMethod = SmtpDeliveryMethod.Network, 
          UseDefaultCredentials = false, 
          Credentials = new NetworkCredential(from.Address, _password), 
          Timeout = 15000 
         }; 

     using (var message = new System.Net.Mail.MailMessage(from.Address, to.Address) 
        { 
         Subject = subject, 
         Body = body, 
        }) 

      smtp.Send(message); 
    } 
} 
+0

проверьте свой брандмауэр на сервере. –

+1

[Система.Web.Mail устарел в .Net 3.5.] (Http://msdn.microsoft.com/en-us/library/zx6wtd80 (v = VS.90) .aspx) Хотя я сомневаюсь, что это ваша проблема, используя System.Net .Mail может дать вам лучшую информацию. –

+0

Возможно, Gmail блокирует реле. См. Здесь: http://social.msdn.microsoft.com/Forums/en/csharpgeneral/thread/2faad2ee-9a20-443a-8437-a20fe24f92e7 –

ответ

0

есть, вероятно, правила брандмауэра или другое сетевое устройство блокирует вас. убедитесь, что вы можете telnet на сервере gmail со своего веб-сервера и можете отправить электронное письмо.

http://www.wikihow.com/Send-Email-Using-Telnet

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

0

У Gmail есть множество ограничений на реле SMTP. Не более 100 получателей в день, IIRC. Ограничения на получателей на сообщение также. Ограничения на размер сообщения/вложения. Если вы превысите лимит или Gmail решил, что вы похожи на спам artiste, их SMTP-сервер может отказаться от подключения в течение дня или около того.

Смежные вопросы