Этого я не сделал потому, что нужно такое только для чатов (не припоминаю чтоб где-то еще встречалось). Со временем я собираюсь сделать отдельный контрол "Тяга-чат". А пока трояны пиши.
Почему только для чатов? А для Web-серверов? Каждый раз заново создавать? А для координации распределенных вычислений (динамическое создание сокетов слишком ресурсоемко...)?
---------------------------------------
Статья написана "для себя", дабы задокументировать ночное бдение
над этой самой SMTP-авторизацией.
Захотелось мне в своей программульке удобство завести - мозможность
отослать по E-mail коротенькое сообщение. Выяснилось, что послать
письмо на сервер,кроме как на сервер провайдера нет возможности.
Почти все SMTP сервера работают толко с авторизацией пользователя
(защита от спама).
SMTP протокол такой авторизации не предусматривает, а вот ESMTP
(с расширенным списком команд) позволяет провести авторизацию.
Все это известно большинству системных программистов и администраторов,
а информации на русском языке в Интернете почти нет и куда же
начинающему программисту деваться?
Вот посмотрите как сделать авторизацию, к примеру,на сервере Яндекса.
Подразумевается, что читатель знаком с SMTP протоколом (реализован в
вышеназванном примере)
1.Алгоритм авторизации:
По команде EHLO (наверно от HELO, потому не путайте), получаем от сервера
инструкцию авторизации (метод).
О методах читайте в RFC 2554 (SMTP Authentication).
2.Командой AUTH осуществлем авторизацию предписанным сервером методом.
Мы будем рассматривать самый простой, понятный и проверенный метод -
это метод LOGIN.
Листинг "запрос-ответ":
S: - ответ сервера
C: - запрос клиента
Коннектимся к серверу smtp.yandex.ru.
S:220 Yandex ESMTP (NO UCE)(NO UBE) server ready at Fri,
5 Dec 2003 05:21:30 +300
C:EHLO smtp.yandex.ru - получение метода авторизации с сервера
S:250-bingo.yandex.ru expected "EHLO ppp-149-135.dialup.metrocom.ru"
250-SIZE 5000000
250-8BITMIME
250-PIPELINING
250-CHUNKING
250-ENHANCEDSTATUSCODES
250-DSN
250-AUTH=LOGIN
250-AUTH LOGIN - метод
250-STARTTLS
250-ETRN
250 HELP
C:AUTH LOGIN -делаем запрос предписанным методом
S:334 VXNlcm5hbWU6 - слово Username в кодировке base64
C:cMGyc2Vj - посылаем логин
S:334 UGFzc3dvcmQ6 - слово Password: в кодировке base64
C:cG5xbGU= - посылаем пароль
S:235 Authentication successful .- авторизация завершена
Далее идет команда посылка письма.
Пример кода на VB.NET для перекодировки (MSDN):
Dim txtUserName1 As String="MyUserName" 'имя в ASCII кодировке
Dim txtUserName2 As String 'имя в Base64 кодировке
Dim byteArray(System.Text.Encoding.ASCII.GetByteCount(txtUserName1)) As Byte
byteArray = System.Text.Encoding.ASCII.GetBytes(txtUserName1)
txtUserName2 = Convert.ToBase64String(byteArray)
Другие методы:
S:250-AUTH LOGIN PLAIN
C:AUTH PLAIN bWVAcmF2ZW4uZWxrLnJ1AG1lQHJhdmVuLmVsay5ydQBwYXNzd29yZDop
этим методом посылается зашифрованный логин с паролем в кодировке base64
(закодирована строка "логин\0логин\0пароль").
Насчет универсальности этой строки пока не знаю.
250-AUTH DIGEST-MD5 CRAM-MD5 PLAIN
В этом ответе сервера предписывается пользоваться методом CRAM-MD5
C: AUTH CRAM-MD5
S: 334 PENCeUxFREJoU0NnbmhNWitOMjNGNndAZWx3b29kLmlubm9zb2Z0LmNvbT4=
ZnJlZCA5ZTk1YWVlMDljNDBhZjJiODRhMGMyYjNiYmFlNzg2ZQ==
S: 235 Authentication successful.
Что за метод, читайте в RFC 2554
(если кто-нибудь переведет на рус.яз - будет очень хорошо)
Вот другой, более локаничный пример (нам интересна только строка с AUTH):
C:EHLO mail.infostar.ru
S:250-infoserver.infostar.ru Hello [ppp-130-98.dialup.metrocom.ru]
250-XEXCH50
250-HELP
250-ETRN
250-DSN
250-SIZE 1048576
250-AUTH LOGIN
250 AUTH=LOGIN
C:HELO cMGyc2Vj
S:503 Bad Sequence
Это сервер провайдера отказался дальше работать с почтой. Может попричине
того, что я уже авторизован, ведь без процедуры авторизации письма шлются.
А может существует другой механизм, ведомый только системщикам.
Главное, чтобы после коннекта в ответе сервера содержалась ссылка на ESMTP
протокол. Другой протокол может даже понять команду EHLO,
но в ответе не даст метода авторизации. Такой сервер и ругаться не будет,
а просто "потеряет" ваше письмо. Экспериментируйте!
По большому счету, авторизация требует и логина, и пароля, и
нет провайдера без предоставления ящика под почту, но так приятно
иметь чуть больше свободы себе и пользователям программ.
Возможно, допущены некоторые неточности в описании, но пример реально
работающий и любой может его повторить и продолжить исследование..
Ссылки на некоторые веб ресурсы по теме:
- Описание протоколов SMTP и POP3 (рус.яз) - http://tehnofil.ru/tdwm.html
- "Как выбирать поставщика Интернет-услуг"- статья про E-mail услуги в т.ч. http://www.nestor.minsk.by/kg - "postfix 2, cyrus-sasl 2, kaspersky antivirus, spamassassin, courier-imap, tls, mysql how-to(FreeBSD4LE)"- статья для системных программистов - www.citeforum.ru
---------------------------------------
1. Свойства LocallIP и LocallNetName: может, хватит одной буквы l?
2. Хотелось бы поиметь свойство State для определения состояния конторола в любой момент времени, а не только при изменении состояния.
3. По поводу ошибок: может, кроме описания ещё и номер ошибки выдавать?
4. По поводу работы с почтой: а не вынести ли всё это хозяйство в отдельный контрол или класс? Это ведь не всем и не всегда нужно, а увеличивать размер программы без необходимости не очень хочется.
Вопрос: можно ли узнать IP-адрес (и порт, хотя порт, возможно, и не надо) удалённого компьютера до установления соединения и самостоятельно принять решение об установлении соединения?
Как вариант, можно рассмотреть добавление к контролу свойства AutoAccept (или AutoConnect или т. п.), True - контрол работает как в текущей версии, False - необходимо подтверждение на установление соединения. При этом, видимо, придётся создать событие (ConnectionRequest в Winsock), в параметрах события хотелось бы видеть параметры запрашиваемого соединения (см. выше).
Думаю, такой подход сделает работу более гибкой как по сравнению с Winsock, так и по сравнению с текущей версией Тяги.
До коннекта невозможно посмотреть Айпи, в событие error уже введены константы, отдельный клас для отсылки почты?Зачем?У меня совсем небольшая ф-ция. Над остальным подумаю в версии 2.0. Версия 1.5 уже готова, днем выложу для скачивания.