класс c# SmtpClient, который не в состоянии послать электронное письмо с помощью Gmail

Jeff, я думаю, что у Вас есть правильная интуиция: это зависит.

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

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

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

, К счастью, Scala позволяет Вам объединить оба подхода. Классы случая могут и быть подобранным шаблоном и поддерживать виртуальную отправку метода. Регулярные классы поддерживают виртуальную отправку метода и могут быть шаблоном, подобранным путем определения экстрактора в соответствующем сопутствующем объекте. Это до программиста для решения, когда каждый подход является соответствующим, но я думаю, что оба полезны.

43
задан Vince Panuccio 17 June 2011 в 13:06
поделиться

3 ответа

Вы не поверите, что решило мою проблему.

Свойство Credentials

ss.Credentials = new NetworkCredential("username", "pass");

должно быть объявлено после

ss.UseDefaultCredentials = false;

Таким образом, окончательный рабочий листинг кода:

SmtpClient ss = new SmtpClient("smtp.gmail.com", 587);
ss.EnableSsl = true;
ss.Timeout = 10000;
ss.DeliveryMethod = SmtpDeliveryMethod.Network;
ss.UseDefaultCredentials = false;
ss.Credentials = new NetworkCredential("username", "pass");

MailMessage mm = new MailMessage("donotreply@domain.com", "destination@domain.com", "subject here", "my body");
mm.BodyEncoding = UTF8Encoding.UTF8;
mm.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure;
ss.Send(mm);

Это ошибка ?

60
ответ дан 26 November 2019 в 22:58
поделиться

Stackoverflow, о котором говорилось ранее

В вашем случае это означает, что вам нужно отправить его с адресом электронной почты, с которым вы вошли в Google.

Stackoverflow также говорит

Так что, возможно, есть брандмауэр что мешает соединению. Я столкнулся с этой проблемой прямо сейчас при тестировании вашего кода. Попробуйте предлагаемый тест TELNET.

5
ответ дан 26 November 2019 в 22:58
поделиться

Я могу проверить, что установка UseDefaultCredentials на false ДОЛЖНА быть выполнена до создания NetworkCredentials. У меня такая же проблема.

0
ответ дан 26 November 2019 в 22:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: