отправка электронной почты с помощью SMTP - PullRequest
0 голосов
/ 30 июля 2010

Я пытаюсь сделать программу, которая отправляет электронные письма. Вначале все работает нормально - я получаю 220 (означает «Привет»), затем, когда я говорю «MAIL FROM:», возвращается 250 (значит, ОК), но затем, когда я пишу «RCPT TO:», я получаю ошибку 550 пишет «Ретрансляция не разрешена». Почему не нравится SMTP в Google?

Мой код: http://pastebin.com/wNA1Zp26

* кстати: когда я отправляю письмо с другого аккаунта - оно тоже не работает.

Ответы [ 3 ]

3 голосов
/ 30 июля 2010

Я думаю, что настоящая ошибка в том, что вы пытаетесь внедрить почтовый клиент. Я не эксперт по C # или .NET, , но для Java есть «стандартная» библиотека, которая выполняет SMTP и все другие почтовые протоколы, и я был бы очень удивлен, если бы не было такого библиотека в .NET.

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

Или это академическое упражнение?

РЕДАКТИРОВАТЬ: Упс, это C ++, а не C #. Виноват мое зрение.

Вот целая страница, полная ссылок на библиотеки SMTP . Выберите один, загрузите его, используйте его.

Серьезно, если вам когда-нибудь удастся найти ссылку для выполнения аутентификации ESMTP, вы, вероятно, сможете управлять более простыми формами базовых "секретных" рукопожатий, которые требуются. Но объединение некоторого кода для обработки «счастливого пути» и, возможно, просто разговор с одним конкретным реализацией SMTP-сервера - это не то же самое, что создание кода, который работает безопасно и надежно, с достойной обработкой ошибок и отчетами.

2 голосов
/ 30 июля 2010

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

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

0 голосов
/ 03 августа 2010

Ошибка ретрансляции обычно означает, что ваш клиент пытается отправить электронное письмо получателю, который находится за пределами системы, к которой вы подключены, но ваш клиент не авторизован для этого.Глядя на свой код, вы вообще не пытаетесь аутентифицировать себя на сервере.

Во-первых, вы используете команду HELO, и при этом вы используете ее неправильно.Входным параметром для HELO является ИМЯ МАШИНЫ , но вместо этого вы отправляете SMTP SERVER HOSTNAME .Вам нужно это исправить.

После этого вы должны использовать команду EHLO вместо команды HELO.EHLO позволит вашему клиенту определить, какие схемы аутентификации (среди прочих функций) сервер фактически поддерживает (например, LOGIN, NTLM, SHA1, MD5 и т. Д.).Затем вы можете выбрать тот, который поддерживаете, и использовать его для входа в реальную учетную запись пользователя, у которого есть права на ретрансляцию.

Другая проблема с вашим кодом заключается в том, что он вообще не обрабатывает ошибки на уровне SMTP.Вы просматриваете коды ошибок сокетов, но вообще не ищите коды ошибок SMTP.Например, если сервер отклоняет команду MAIL FROM или RCPT TO (что и происходит в этой ситуации), ваш код все равно будет тратить пропускную способность и время обработки, отправляя команду DATA, которая не будет выполнена (с другой ошибкой SMTP, которую вы не ищете).для).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...