Урок 7 – работаем с почтой

Урок 7 – работаем с почтой

Зачастую чтобы зарегистрироваться на каком-то сайте нужно выполнить активацию по почте: зайти на свой ящик, найти там письмо со ссылкой и перейти по ней. Сегодня мы научимся работать с почтой через протокол POP3. Этот протокол используют все известные почтовые клиенты и он довольно прост в обращении.

Сегодня мы потренируемся на примере сервиса mamba.ru, там как раз необходима активация по почте. Для начала заведем себе почту, например в рамблере. У нас как раз уже есть регистратор акков для rambler.ru. После этого регаем акк в мамбе и видим такое сообщение:

Давайте теперь напишем прогу, которая найдет нужное письмо. Все классы, необходимые для работы с почтой находятся в пространствах имен ViKing.Engine.Mail.Pop3 и ViKing.Engine.Mail.Mime. Нам сейчас нужно только первое. Для начала нужно подключиться к почтовому ящику:

Pop3Client pop = new Pop3Client()
pop.Connect("pop.rambler.ru", 110);
pop.Authenticate("0r3zgv00h5t", "t1nz4rvoefm", AuthenticationMethod.UsernameAndPassword);

Создаем новый Pop3Client, соединяемся с сервером pop.rambler.ru по порту 110 и авторизуемся используя имя (адрес ящика) 0r3zgv00h5t и пароль t1nz4rvoefm. 110 — стандартный порт для протокола POP3, если вы используете шифрование SSL, то порт обычно 995. Адрес почтового сервера почти у всех почтовых сервисов pop.[основной домен] (например pop.mail.ru, pop.rambler.ru). Точный адрес и номер порта можно прочитать в руководстве по настройке почтовых программ на вашем почтовом сайте. Есть еще такой нюанс: некоторым почтовым сервисам в качестве имени пользователя нужно указывать полный адрес ящика, то есть не «0r3zgv00h5t», а «[email protected]».

Теперь давайте искать письмо от «[email protected]»:

int count = pop.GetMessageCount();
for (int i = 1; i <= count; i++)
{
	var mes = pop.GetMessageHeaders(i);
	if (mes.From.Address == "[email protected]")
	{
		...
	}
}

Запрашиваем у ящика количество писем и делаем по ним цикл. Внимание! В протоколе POP3 письма нумеруются начиная с 1, а не с 0. Соответственно мы используем цикл от 1 до count включительно(!). Также следует помнить, что у некоторых почтовых сервисов сначала идут самые старые письма, а у некоторых сначала новые. У рамблера, как и у большинства, новые письма вначале. И еще, если вы вдруг залезете в используемый ящик, советую ограничить количество скачиваемых писем. Например в моем ящике их около 15 000.

Дальше мы качаем заголовки писем (заголовки весят очень мало, в отличие от самого письма) и ищем письмо от «[email protected]». После того, как письмо найдено, нужно скачать его целиком и достать нужную ссылку:

string text = pop.GetMessage(i).FindFirstHtmlVersion().GetBodyAsText();
string link = Regex.Match(text, @"href=""(http://mamba.ru/tips[^""]+)""").Groups[1].Value;

В письме часто содержатся несколько версий — текстовая и html. Мы берем html версию и преобрезуем ее в строку, после чего применяем Regex, который ищет ссылку, начинающуюся на «http://mamba.ru/tips». «[^»]+» означает продолжать, пока не встретятся кавычки, а Groups[1].Value содержит только текст, заключенный в круглые скобки.

Вот собственно и все. В работе с почтой нет ничего сложного, особенно когда под рукой есть такая вещь как ViKing.Engine. Напоследок хочу отметить еще один момент. Наша программа работает с Pop3Client, который в свою очередь использует сокеты. Сокеты — это unmanaged-ресурcы и нам нужно позаботиться, чтобы эти ресурсы освободились после того, как мы закончим с ними работать. Иначе если ваша программа будет многопоточной, то она либо сожрет всю память, либо достигнет лимита открытых сокетов (сами по себе они не закрываются). Самый простой способ сделать это — заключить наш код в блок using:

using (Pop3Client pop = new Pop3Client())
{
	// код
}

Это замечание относится не только к Pop3Client, но и ко всем другим unmanaged-ресурсам, таким как файловые потоки, GDI+ ресурсы и т.п. Подробнее о using и IDisposable можно посмотреть на MSDN

На этом заканчиваю, исходник урока: ActivateMail.rar

Comments are closed.