2010-07-30 9 views
0

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

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

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

+0

По крайней мере, пометьте свой вопрос на языке, который вы используете. – Oded

ответ

2

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

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

+0

Итак, как я могу идентифицировать себя с сервером? – Ohad

+0

Я не большой парень сокетов, особенно на C++, но вот ссылка, которая выглядит, чтобы дать команду и ответы для аутентификации - http://computer-programming-tutorials.suite101.com/article.cfm/sending_email_with_smtp_auth –

+0

Благодарю. Это именно то, что я сделал, и это волнует! "• Сообщите серверу, с которого отправляется почта; • Сообщите серверу, кому принадлежит почта; • Дайте серверу сообщение; • Завершите работу с помощью« \ r \ n. \ R \ n ». Это не говорит мне, что я не отправляю правильные сообщения - это просто не передает сообщение, и я не знаю, почему (!). – Ohad

3

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

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

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

EDIT: Упс, это C++, а не C#. Вините мое зрение.

Адрес a whole page full of links to SMTP libraries. Выберите один, загрузите его, используйте.

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

+0

Но я не работаю с .NET, я использую C++. – Ohad

+0

Упс! Моя ошибка, я коротко посмотрел на код и подумал, что видел «C#». Я обновил свой ответ. –

0

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

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

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

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

Смежные вопросы