Ошибка класса SMTP на живом сервере - PullRequest
1 голос
/ 21 апреля 2011

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

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@domain.com 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("noreply@mysite.com", "[*removed*]");

        var fromAddress = new MailAddress("noreply@mysite.com", "MySite");
        var toAddress = new MailAddress("applications@mysite.com", "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. Я успешно отправил сообщение с моей машины разработчика. Однако, когда я загрузил сайт на свой сервер, я получил новое сообщение об ошибке:

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);
    }
}

Ответы [ 2 ]

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

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

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

Возможно, существует правило брандмауэра или другое сетевое устройство, блокирующее вас.убедитесь, что вы можете подключиться к серверу Gmail через веб-сервер и отправить электронное письмо.

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

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

...