Отправка электронной почты с C # - не работает, но не выдается ошибка - PullRequest
2 голосов
/ 16 марта 2011

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

Я написал функцию ниже, чтобы упростить отправкупочта из моего приложения, но я считаю, что где-то должна быть проблема, и я просто не вижу ее.Возможно, это сценарий «Не вижу леса за деревьями».

Проблема возникает, когда я пытаюсь отправить письмо по SMTP.Кажется, что страница просто перестает работать без сообщения об ошибке вообще. LocalPickup работает, как и указание каталога раскладки, но в этом случае мне нужно использовать SMTP.

В этом случае мой веб-сайтнаходится на моем домашнем сервере разработки (под управлением Windows Server 2003), а мой SMTP-сервер представляет собой удаленный выделенный ящик под управлением CentOS Linux с Qmail.

Я включил написанную мной функцию и просто отвечаю на любые вопросы ...Да, SMTP-порт на этом сервере определенно равен 26;)

    /// <summary>
    /// Sends an email
    /// </summary>
    /// <param name="To">Addresses to send the email to, comma seperated</param>
    /// <param name="subject">Subject of the email</param>
    /// <param name="emailBody">Content of the email</param>
    /// <param name="cc">CC addresses, comma seperated [Optional]</param>
    /// <param name="Bcc">BCC addresses, comma seperated [Optional]</param>
    /// <param name="client">How to send mail, choices: iis, network, directory. [Optional] Defaults to iis</param>
    /// <returns></returns>
    public bool sendMail(string To, string subject, string emailBody, string from, string cc = "", string Bcc = "", string client = "network", bool html = true)
    {

        // Create a mailMessage object
        MailMessage objEmail = new MailMessage();
        objEmail.From = new MailAddress(from);
        // Split email addresses by comma
        string[] emailTo = To.Split(',');
        foreach (string address in emailTo)
        {
            // Add these to the "To" address
            objEmail.To.Add(address);
        }

        // Check for CC addresses

        if (cc != "")
        {
            string[] emailCC = cc.Split(',');
            foreach (string addressCC in emailCC)
            {
                objEmail.CC.Add(addressCC);
            }
        }

        // Check for Bcc addresses

        if (Bcc != "")
        {
            string[] emailBCC = Bcc.Split(',');
            foreach (string addressBCC in emailBCC)
            {
                objEmail.Bcc.Add(addressBCC);
            }
        }

        // Set the subject.
        objEmail.Subject = subject;

        // Set the email body
        objEmail.Body = emailBody;

        // Set up the SMTP client

        SmtpClient server = new SmtpClient();


        switch (client)
        {
            case "iis":
                server.DeliveryMethod = SmtpDeliveryMethod.PickupDirectoryFromIis;
                break;
            case "network":
                server.DeliveryMethod = SmtpDeliveryMethod.Network;
                NetworkCredential credentials = new NetworkCredential("SmtpUserName", "SmtpPassword");
                server.Host = "SmtpHost";
                server.Port = 26;
                server.Credentials = credentials;
                break;
            case "directory":
                server.DeliveryMethod = SmtpDeliveryMethod.SpecifiedPickupDirectory;
                server.PickupDirectoryLocation = "c:\\mailpickup";
                break;
            default:
                throw new Exception("Invalid delivery method specified, cannot continue!");

        }

        if (html)
        {
            // As the email is HTML, we need to strip out all tags for the plaintext version of the email.
            string s = emailBody;

            s = Regex.Replace(s, "<.*?>", string.Empty);
            s = Regex.Replace(s, "<script.*?</script>", "", RegexOptions.Singleline | RegexOptions.IgnoreCase);

            AlternateView plainText = AlternateView.CreateAlternateViewFromString(s, null, MediaTypeNames.Text.Plain);
            objEmail.AlternateViews.Add(plainText);

            AlternateView rich = AlternateView.CreateAlternateViewFromString(emailBody, null, MediaTypeNames.Text.Html);
            objEmail.AlternateViews.Add(rich);
        }


        try
        {
            server.Send(objEmail);
            return true;
        }
        catch(Exception ex)
        {
            throw new Exception(ex.ToString());
        }

Как я уже говорил, страница просто полностью зависает примерно через 60 секунд без сообщения об ошибке.

Заранее спасибо,

Дейв

Дополнение: - Вот как я звоню sendMail ()

webMail sendConfirmation = new webMail();

fileSystem fs = new fileSystem();
siteSettings setting = new siteSettings();
string mailBody = fs.file_get_contents("http://myurl.com/mymessage.html");

// Run any replaces.
mailBody = mailBody.Replace("{EMAIL_TITLE}", "Your account requires confirmation");
mailBody = mailBody.Replace("{U_FNAME}", u_forename);
mailBody = mailBody.Replace("{REG_URL_STRING}", setting.confirmUrl);


sendConfirmation.sendMail(u_emailAddress, "Your account requires confirmation", mailBody, setting.siteEmail);

Ответы [ 6 ]

3 голосов
/ 16 марта 2011

Вы можете попробовать проверить на ошибку:

SmtpClient smtp = new SmtpClient();
            smtp.SendCompleted += new SendCompletedEventHandler(smtp_SendCompleted);
            smtp.Send(msgMail);

void smtp_SendCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
    {
        if (e.Cancelled == true || e.Error != null)
        {
            throw new Exception(e.Cancelled ? "EMail sedning was canceled." : "Error: " + e.Error.ToString());
        }
1 голос
/ 02 декабря 2014

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

1 голос
/ 16 марта 2011

не может найти действительный MX для домена rcpt. Обычно это означает, что не найден действительный адрес электронной почты или домен электронной почты для пересылки электронной почты: я хотел бы взглянуть на массив адресов электронной почты «to», которые разделяются, чтобыодин действительный / из действительного домена.Возможно отправить один тест на каждый адрес электронной почты «to», чтобы вы могли проверить, является ли это проблемой с сервером smtp.

Другая возможность - это разрешения localhost / iis для передачи на другой сервер smtp "??"

Мой тестовый код для одноадресных тестов:

public void Send(string from, string to,string smtpServer, int smtpPort,string username, string password)
        {
            try
            {
                using (MailMessage mm = new MailMessage())
                {
                    SmtpClient sc = new SmtpClient();
                    mm.From = new MailAddress(from, "Test");
                    mm.To.Add(new MailAddress(to));
                    mm.IsBodyHtml = true;
                    mm.Subject = "Test Message";
                    mm.Body = "This is a test email message from csharp";
                    mm.BodyEncoding = System.Text.Encoding.UTF8;
                    mm.SubjectEncoding = System.Text.Encoding.UTF8;
                    NetworkCredential su = new NetworkCredential(username, password);
                    sc.Host = smtpServer;
                    sc.Port = smtpPort;
                    sc.Credentials = su;
                    sc.Send(mm);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
0 голосов
/ 16 марта 2011

ваш клиент по умолчанию, использующий сеть, но когда вы определяете сетевой клиент, вы используете какой-то код по умолчанию (имя пользователя, пароль хоста).

 case "network":
            server.DeliveryMethod = SmtpDeliveryMethod.Network;
            NetworkCredential credentials = new NetworkCredential("SmtpUserName", "SmtpPassword");
            server.Host = "SmtpHost";
            server.Port = 26;
            server.Credentials = credentials;
            break;

Я действительно думаю, что использую пример кода и забылуказать свою пользовательскую конфигурацию.

Я прошу прощения за мой английский.

0 голосов
/ 16 марта 2011

Иногда отправленные таким образом письма имеют тенденцию заканчиваться спамом, особенно если адрес отправителя является фантастическим.Попробуйте использовать raw ftp с помощью telnet, так как P.Brian.Macket скажет вам, что это хорошая идея.

0 голосов
/ 16 марта 2011

Является ли "Кому" зарезервированным словом в c #?Попробуйте изменить это и посмотрите, что вы получите.

...