Отправка аутентифицированного SMTP с использованием C # - PullRequest
2 голосов
/ 04 ноября 2011

Я приобрел аутентифицированный SMTP-пакет у моей хостинг-компании.

Я успешно проверил настройки учетной записи через Outlook 2010.

Настройки Outlook:

Электронная почта : me@domain.com Исходящий SMTP : smtp.hostingcompany.net

Информация для входа:

  • пользователь : mydomain.com_account
  • пароль : пароль

Дополнительные настройки> Исходящий сервер:

  • Мой исходящий сервер (SMTP) Требуется проверка подлинности
  • Пользователь : mydomain
  • Пропуск : пароль

Я перепробовал все возможные комбинации при указании NetworkCredentials и продолжаю получать SMTP Exception : "Faulure Sending Email" InnerException : недопустимая длина для массива символов Base-64.

public static void SendEmail(string To, string Subject, string Body)
    {
        try
        {
            using (SmtpClient mySmtpClient = new SmtpClient(GlobalSettings.EmailHost))
            {
                mySmtpClient.UseDefaultCredentials = false;
                //mySmtpClient.EnableSsl = false;
                mySmtpClient.Credentials = new NetworkCredential(mydomain.com_account, GlobalSettings.EmailPassword);

                MailAddress from = new MailAddress("email@mydomain");
                MailAddress to = new MailAddress(To);

                using (
                    MailMessage myMail = new MailMessage(from, to)
                    {
                        Subject = Subject,
                        SubjectEncoding = Encoding.UTF8,
                        Body = Body,
                        BodyEncoding = Encoding.UTF8,
                        IsBodyHtml = true
                    })
                {
                    mySmtpClient.Send(myMail);
                }
            }
        }
        catch (SmtpException ex)
        {
            Log.WriteLog(string.Format("[Send Mail Exception] --> SMTPException has occurred: {0}", ex.Message), LogLevel.Error);
        }
        catch (Exception ex)
        {
            Log.WriteLog(string.Format("[Send Mail Exception] --> Exception has occurred: {0}", ex.Message), LogLevel.Error);
        }
    }

Я испробовал три возможных параметра имени пользователя для входа в NetworkCredential ().

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

РЕДАКТИРОВАТЬ: NTLM Hack

Я добавил следующие строки в мой код:

FieldInfo transport = _client.GetType().GetField("transport",
    BindingFlags.NonPublic | BindingFlags.Instance);

FieldInfo authModules = transport.GetValue(_client).GetType()
    .GetField("authenticationModules",
        BindingFlags.NonPublic | BindingFlags.Instance);

Array modulesArray = authModules.GetValue(transport.GetValue(_client)) as Array;
modulesArray.SetValue(modulesArray.GetValue(2), 0);
modulesArray.SetValue(modulesArray.GetValue(2), 1);
modulesArray.SetValue(modulesArray.GetValue(2), 3);

Сейчас я получаю новое сообщение:

Mailbox unavailable. The server response was: relay not permitted

Ответы [ 2 ]

1 голос
/ 27 июля 2012

Ваша вторая проблема:

Почтовый ящик недоступен. Ответ сервера: ретрансляция не разрешена

Это происходит потому, что на сервере теперь нет приемлемого метода аутентификации, и он не хочет рисковать, чтобы получить репутацию "открытого ретранслятора".

Возможно, это поправимо. Проблема в том, что используемый вами хак слишком тяжелый. Он перезаписывает каждый модуль аутентификации, кроме «Дайджеста», когда все, что нам нужно сделать, это перезаписать NTLM.

Попробуйте эту урезанную версию:

FieldInfo transport = _client.GetType().GetField("transport",
BindingFlags.NonPublic | BindingFlags.Instance);

FieldInfo authModules = transport.GetValue(_client).GetType()
    .GetField("authenticationModules",
        BindingFlags.NonPublic | BindingFlags.Instance);

Array modulesArray = authModules.GetValue(transport.GetValue(_client)) as Array;
modulesArray.SetValue(modulesArray.GetValue(2), 1);
1 голос
/ 04 ноября 2011

Согласно следующей статье: «Взлом» System.Net.Mail.SmtpClient , может возникнуть исключение, когда SmtpClient выбирает аутентификацию с использованием NTLM аутентификации.

Статья содержит исправление, хотя, как следует из названия статьи, это взлом.

Однако в комментариях автор также отмечает, что неправильный пароль может вызвать то же исключение.

...