Отправка сообщений электронной почты из командной строки, с помощью утилиты Blat.exe ~ Страницы Интернета

Как выполнить команду в командной строке

Работа в командной строке выполняется очень просто: пользователь вводит текстовую команду, а затем нажимает на клавишу «Enter» (ввод). Если необходимо ввести несколько последовательных команд, повторите данную операцию несколько раз.

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

При запуске командной строки от имени администратора, путь выглядит следующим образом: «C:Windowssystem32».

Команды командной строки Windows необходимо вводить в окне интерпретатора сразу после знака «>», в этом месте мигает курсор.

Для копирования команды с компьютера, а затем вставки команды в командную строку, используется контекстное меню правой кнопки мыши. Скопируйте команду в буфер обмена, вставьте курсор мыши в окно командной строки, нажмите на правую кнопку мыши. В Windows 10 поддерживается копирование и вставка при помощи стандартных клавиш клавиатуры: «Ctrl» «C» и «Ctrl» «V».

Некоторые системные приложения запускаются непосредственно после ввода команды, которая состоит из названия приложения, например, если вести команду «calc», то на компьютере запуститься системная программа Калькулятор.

Для других программ потребуется ввести полный путь до исполняемого файла приложения. Если в пути до файла есть пробелы, полный путь заключается в кавычки, например, так выглядит команда для запуска браузера Google Chrome:

"C:Program Files (x86)GoogleChromeApplicationchrome.exe"

После запуска команды из командной строки, реализация выполнения команды не всегда внешне заметна, из-за того, что происходят внутренние изменения в операционной системе.

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

При вводе неправильной команды, например, введенной с ошибками, или если операционная система Windows не может по какой-либо причине выполнить команду, об этом появится сообщение в окне интерфейса командной строки.

Обработка писем

Как вы уже знаете, электронное письмо представляет собой текст, соответствующий общепринятым стандартам расширений интернет-почты, т.е. MIME (Multipurpose Internet Mail Extension). Для обычного обывателя, и даже программиста, письмо в исходном виде может быть абсолютно непонятным набором символов и команд.

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

Содержимое, в свою очередь, может быть обычным текстом, либо другим кодированным, на основе правил указанных в заголовках, содержимым. При этом каждое содержимое может состоять из отдельных вложенных частей, у которых могут быть свои заголовки. Например, текстовое письмо может содержать только обычный неформатированный текст (text/plain), т.е. будет состоять из заголовков и текста.

Если в письмо, дополнительно к неформатированному тексту, будет помещен текст в формате html (text/html), то письмо также будет состоять из основных заголовков, но содержимое уже будет состоять из двух отдельных частей (multipart), в которых будут, свои отдельные заголовки.

В первой части письма будет находиться неформатированный текст, а во второй – текст в формате html. Если, например, в html-текст будут вставлены картинки, то html-часть письма будет состоять уже из подмножества дополнительных частей, в одной из которых будет сам текст в формате html, а в остальных, по отдельности, – вложенные графические файлы.

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

У частей письма обычно меньше заголовков, чем у самого письма, но правила их определения – едины. Поэтому можно сделать базовый класс, MailItemBase, который будет содержать, как минимум, заголовки (Headers) и содержимое части письма (Data).

Для хранения заголовком можно использовать коллекцию типа Dictionary со строковым ключом и значением типа object. И хотя в MIME-заголовках не может быть данных отличных от текстовых, объектный тип необходим, т.к. в заголовках могут встречаться ключи с одинаковыми именами (например, Received), что недопустимо в коллекциях.

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


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

Первым делом, нужно отделить заголовки от содержимого. На этот случай, стандарты гласят, что содержимое письма отделятся от заголовков двумя переводами строк (rnrn или 13 10 13 10). Так что достаточно в исходном тексте части письма найти первое вхождение парных символов перевода строк.

Но здесь следует учитывать, что в некоторых случаях с почтового сервера может быть получено не все письмо, а только заголовки (TOP) и тогда парных символов перевода строк в источнике может и не быть, т.е. исходный текст сам будет являться заголовками.

Для обработки заголовков лучше всего сделать отдельную функцию (ParseHeaders), чтобы не загромождать код, и на случай, если понадобится её повторное использование. Эта функция будет принимать исходный текст (h), содержащий MIME-заголовки и возвращать коллекцию типа Dictionary.

Примечание. Для использования коллекций, может потребоваться импортировать пространство имен System.Collections.

Некоторые значения заголовков могут быть кодированы, например в Base64 или Quoted-Printable. Чтобы не мучиться с декодирование каждого отдельно заголовка, это можно сделать сразу, пока они все находятся в одном месте. Кодированные данные в заголовках имеют строгий формат, который содержит имя кодовой страницы, тип кодирования и, собственно, закодированные данные. Каждый элемент разделяется знаком вопроса (?). Например:

В первой части строки указывается кодовая страница – utf-8. Второй параметр содержит один символ – B, который указывает на то, что данные кодированы в Base64. Поимо Base64 может использовать тип кодирования Quoted-Printable, который определяется буквой Q.

В третьей части строки содержатся сами данные, кодированные в Base64 с использованием кодовой страницы utf-8. Зная это, можно составить шаблон регулярного выражения для поиска в тексте строк подобного формата. При этом можно сразу при помощи функции обратного вызова произвести декодирование всех найденных совпадений.

Функция обратного вызова HeadersEncode должна принимать один параметр, содержащий найденное совпадение типа Match и возвращать строку.

Для декодирования данных из Base64 можно использовать функцию FromBase64String класса Convert. А вот для обработки Quoted-Printable придется написать отдельную подпрограмму. Строка Quoted-Printable представляет из себя набор шестнадцатеричных символов, в каждом из которых содержится ASC-код печатного символа.

Следующим этапом в обработке заголовков будет склеивание строк. Бывают случаи, когда в одном MIME-заголовке очень много данных, и они разбиваются на несколько строк. Чтобы не возникало путницы, такие данные среди заголовков всегда начинаются со множества пробелов. Именно за счет пробелов в начале строки и можно найти многострочные значения заголовков, а сами пробелы нужно удалить.

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

Как я уже говорил, в MIME могут попадаться заголовки с одинаковыми именами, что недопустимо в коллекциях. Для одинаковых ключей значения заголовков будут помещаться в коллекцию типа ArrayList, что позволит легко с ними работать.


Но вернемся к коду конструктора класса MailItemBase, в котором уже можно, при помощи функции ParseHeaders, получить коллекцию заголовков и передать её в свойство Headers экземпляра класса.

:/>  Тест оперативной памяти: утилитами, встроенными средствами

Далее можно обработать содержимое части письма, если конечно оно есть. Показателем наличия содержимого письма служит граница, разделяющая заголовки от содержимого (переменная headersTail). Если границы нет, т.е. значение переменной headersTail равно минус один, то продолжать обработку смысла нет.

При наличии границы, зная её позицию в исходном тексте части письма, можно отделить содержимое от заголовков.

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

Первый – Content-Transfer-Encoding, указывает на тип кодирования, который может иметь шесть значений: Base64, Quoted-Printable, 7Bit, 8Bit, Binary и X-Token. Собственно, декодировать придется только Base64 и Quoted-Printable, остальные, 7Bit и 8bit – это обычный текст, а использования Binary и X-Token, я за свою практику, в Рунете, ни разу не встречал. Заголовок с именем Content-Transfer-Encoding должен находиться в коллекции Headers.

Второй важный заголовок – это Content-Type, который содержит информацию о типе содержимого. Содержимое может быть семи основных типов: text – текст; application – приложение; image – изображение; video – видео; audio – аудио; multipart – смешанный тип; message – сообщение.

Каждый тип может содержать множество дополнительных подтипов. Помимо этого, в заголовке Content-Type могут содержаться другие параметры, например имя кодовой страницы для текстового содержимого, или имя файла для бинарного содержимого, или имя границы для смешанного содержимого.

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

До первого вхождения символа точки с запятой (;) идет информация о типе содержимого, а после идут параметры, также разделенные точкой с запятой. Каждый параметр, в свою очередь, состоит из имени и значения, которые разделятся символов «равно» (=).

Сам по себе заголовок Content-Type относительно сложный, поэтому имеет смысл превратить его в объект (ContentType), чтобы в последующем с ним было проще работать. Класс ContentType будет наследоваться от только что созданного базового класса ParametersBase, и по сути будет обычным хелпером, предоставляющим быстрый и удобный доступ к часто используемым параметрам заголовка Content-Type.

Собственно, для заголовка Content-Disposition тоже можно сделать отдельный хелпер-класс, который будет наследоваться от базового класса ParametersBase, и содержать всего одно свойство – FileName, указывающие имя файла вложения.

Теперь, когда есть готовые классы для заголовков Content-Type и Content-Disposition, в классе обработки части письма (MailItemBase) можно сделать два дополнительных свойства, предоставляющих быстрый доступ к их содержимому.

И далее, по аналогии с Content-Transfer-Encoding, можно проверить существование заголовков Content-Type и Content-Disposition в коллекции, и если они есть, инициализировать на их основе соответствующие экземпляры классов.

После того как будет известен тип содержимого, можно провести его обработку и поместить в свойство Data класса MailItemBase. Поскольку содержимое может быть закодировано, то для его декодирования потребуется отдельная функция (DecodeContent), которая помимо всего прочего будет менять кодовую страницу текстовых данных (ConvertCodePage), в случае, если она отличается от текущей (Encoding.Default).

private string DecodeContent(string contentTransferEncoding, string source)
{
 if (contentTransferEncoding == "base64")
 {
 return ConvertCodePage(Convert.FromBase64String(source), this.ContentType.CodePage);
 }
 else if (contentTransferEncoding == "quoted-printable")
 {
 return ConvertCodePage(ParseQuotedPrintable(source), this.ContentType.CodePage);
 }
 else
 { //"8bit", "7bit", "binary"
 // считаем, что это обычный текст
 return ConvertCodePage(source, _ContentType.CodePage);
 }
}
private string ConvertCodePage(string source, Encoding source_encoding)
{
 if (source_encoding == Encoding.Default) return source;
 return Encoding.Default.GetString(source_encoding.GetBytes(source));
}
private string ConvertCodePage(byte[] source, Encoding source_encoding)
{
 if (source_encoding == Encoding.Default) return Encoding.Default.GetString(source);
 return Encoding.Default.GetString(Encoding.Default.GetBytes(source_encoding.GetString(source)));
}

Имя типа содержимого должно находиться в свойстве Type экземпляра класса ContentType. Декодировать потребуется только текстовой тип содержимого.

Если содержимое имеет смешанный тип (multipart), то для его обработки потребуется написать отдельный метод. Этот метод должен будет, используя границу – текстовую метку в свойстве Boundary экземпляра класса ContentType, выделять и обрабатывать разные вложенные части текущей части письма.

При этом свойство Data экземпляра класса MailItemBase будет представлять собой коллекцию типа List, в которую будут добавляться новые экземпляры класса MailItemBase, созданные на основе найденной части письма.

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

Для обработки бинарных данных, т.е. вложенных файлов, потребуется еще немного расширить условие. Бинарные данные ожидаются кодированными в Base64, поэтому если в свойстве ContentTransferEncoding будет указан другой тип кодирования, произойдет исключение.


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

Примечание. В первой части условия тип содержимого проверяется на текстовой, я сделал это для наглядности, но фактически оно лишнее, т.к. условие по умолчанию выполняет те же функции.

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

Теперь можно насладиться результатом проделанной работы. Для проверки работы обработчика MIME, достаточно при создании экземпляра класса MailItem передать содержимое письма из файла.

Примечание. В данном примере подразумевается, что в одной папке с программой будет файл с именем Test.eml, содержащий исходный текст письма.

Отправка электронной почтты из командной строки.

    Для отправки электронной почты из командной строки в операционных системах семейства Windows стандартных средств не предусмотрено, однако можно воспользоваться программным обеспечением сторонних производителей, как, например, бесплатной утилитой Blat     Утилита не требует установки, просто скачайте архив и распакуйте его в какой-нибудь каталог. Если вы планируете использовать blat.exe в командных файлах, то имеет смысл поместить ее в каталог, используемый в путях поиска исполняемых файлов по умолчанию (задаваемых переменной окружения PATH), например, windowssystem32 .

При выполнении, blat.exe может использовать некоторые параметры – профиль , который хранится в реестре Windows. Профилей может быть несколько и один из них может использоваться в качестве профиля по умолчанию. Для создания профиля используется ключ -install при запуске blat.exe. 

blat.exe -install smtp.mail.ru test@mail.ru 3 25 profile1 test@mail.ru пароль 

параметры, следующие за “-install” должны располагаться именно в таком порядке: 

smtp.mail.ru – имя почтового сервера, через который будет выполняться отправка электронных писем
test@mail.ru – имя отправителя, которое будет отображаться в поле From: 
3 – число попыток повторный отправки письма при сбое соединения с сервером. 
25 – номер порта SMTP-сервера
profile1 – имя профиля утилиты
test@mail.ru – имя пользователя, которое будет использоваться при подключении к SMTP-серверу
пароль – пароль, используемый при подключении к SMTP-серверу

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

Записи blat.exe в реестре
Имя пользователя (строковый параметр Login) и пароль (Pwd) хранятся в кодировке Base64 . Если вместо имени профиля использовать символ “-“, то такой профиль будет использован в качестве профиля по умолчанию, т.е. профиля, настройки которого будут использоваться программой, если явно не задан конкретный профиль. 

blat.exe -install smtp.mail.ru test@mail.ru 3 25 – test@mail.ru 

Параметры Blat.exe хранятся в ветке реестра

[HKEY_LOCAL_MACHINESOFTWAREPublic Domain]
Профиль по умолчанию хранится в ветке
[HKEY_LOCAL_MACHINESOFTWAREPublic DomainBlat]
Настройки для конкретного профиля 
[HKEY_LOCAL_MACHINESOFTWAREPublic DomainBlatимя профиля]

Для получения встроенной справки программы используется ключ -h

:/>  Как перевернуть экран на ноутбуке? 3 рабочих способа!

blat -h – выдача справки на экран
blat -h > C:blathelp.txt – выдача справки в файл C:blathelp.txt

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

Отправка письма с использованием профиля по умолчанию получателю test@msconfig.ru:

blat.exe -body “Hello World” -to test@msconfig.ru
Параметр -body используется для формирования текста в теле письма. Если текст содержит пробелы, то заключается в двойные кавычки. Параметр -to задает адрес получателя. Остальные данные, необходимые для отправки берутся из профиля по умолчанию (адрес SMTP- сервера, имя пользователя, пароль и т.п.). В качестве текста тела письма можно использовать содержимое файла, указав его имя вместо параметра -body 

blat.exe C:mytext.txt -to test@msconfig.ru
Для отправки электронного письма без текста используется имя пустого файла (а не ключ -body без параметров, когда будет ожидаться ввод текста письма с клавиатуры)

Если используется текст на русском языке, то нужно указать кодировку, поддерживающую символы кириллицы, для чего используется ключ –charset :

blat.exe -body “Текст на русском” -to test@msconfig.ru -charset utf-8
Для отправки писем с вложением файлов используется ключ -attach 

blat.exe -body “Текст на русском” -to test@msconfig.ru -charset utf-8 -attach c:boot.ini
Если тема письма не задана, то blat.exe использует в поле темы строку Contents of file: stdin.txt. Для подавления стандартной темы можно использовать ключ -ss. Поле темы, в этом случае будет пустым. Для указания нужного текста в поле темы используется ключ -subect 

blat -body “TEST на русском” -subject Важно! -to test@msconfig.ru -charset utf-8 -attach c:boot.ini

Для отправки письма с настройками из конкретного профиля используется ключ -p имя профиля 

blat.exe -body “this is text” -p profile1 -to test@domain.ru 

Для получения списка профилей, хранящихся в реестре на данный момент используется ключ -profile

blat -profile

В ответ будет выдано 

Blat v2.6.2 w/GSS encryption (build : Feb 25 2007 12:06:19)
Profile(s) for all users of this computer —
SMTP: smtp.mail.ru “test@mail.ru” 1 25 ***** *****
SMTP: smtp.mail.ru “test321@mail.ru” 3 25 profile1 ***** *****
Первая строка, начинающаяся с SMTP: относится к профилю по умолчанию, вторая – к профилю с именем profile1

Для отправки электронного письма без использования какого-либо профиля, в командной строке blat.exe нужно задать все те данные, которые хранятся в профиле.

blat -body “TEST” -to test@msconfig.ru -server smtp.mail.ru -f test@mail.ru -u test@mail.ru -pw пароль

Если какой-либо из параметров не задан, он будет взят из профиля по умолчанию.

-server – имя сервера SMTP
-f – почтовый адрес отправителя
-u – имя пользователя, используемое для подключения к SMTP-серверу (AUTH LOGIN)
-pw – пароль пользователя. 

Отправка электронной почты из командной строки windows |

В этой статье я расскажу вам как с помощью бесплатной консольной программы Blat отправлять электронную почту из командной строки Windows или же из пакетного файла. Данный способ очень хорошо подходит для отправки однотипных сообщений по электронной почте.

Скачать программу можно с официального сайта: Скачать
Или напрямую с Sourceforge: Скачать

В директории программы (там где лежит файл “blat.exe” создаем пакетный файл MS-DOS. Открываем его и в нем пишем:

BATCH
Отправка сообщений электронной почты из командной строки, с помощью утилиты Blat.exe ~ Страницы Интернета
Копировать код

А теперь разберем данный пример подробнее:

-server mailserver.com – вместо mailserver.com нужно указать свой почтовый сервер. Часто бывает mail.example.com или же smtp.mail.ru (применительно к почтовому сервису mail.ru). Подробнее об этом вы можете узнать у своего поставщика услуг электронной почты.

-f ot_kogo@example.com – меняем ot_kogo@example.com на свой адрес электронной почты, например vasya_pupkin@example.com.

-u mail_login – вместо поля mail_login нужно вписать свой логин электронной почты. Может быть как просто vasya_pupkin или же vasya_pupkin@example.com.

-pw write_pass_there – вместо write_pass_there пишем свой пароль от почты.

-tf sendlist.txt – создаете текстовый файл и в него пишете адреса электронной почты, на которые собираетесь отсылать сообщения. Пишется просто в столбик.

Если вам нужно отсылать письмо только на один адрес электронной почты, то вам нужно заменить -tf sendlist.txt на -to komu@example.com, где komu@example.com – адрес электронной почты того человека, которому вы отсылаете сообщение.
-subject tema_pisma – здесь указываем тему сообщения.

-body “tekst_sooboscheniya” – здесь указываем само сообщение. Например, “Привет! Как дела?”.

-attach file.txt – вместо file.txt указываем прикрепляемый к сообщению файл (вложение). Если файл не располагается в одной папке с программой, то вы можете указывать полный путь до файла. Например “C:file.txt”.

Скачать готовый пример вы можете чуть ниже нажав кнопку “Скачать”. Распаковываете архив, находите файл blat.bat, жмёте на нём правой кнопкой мыши и выбираете пункт “Изменить”. Далее меняете параметры по описаниую, указанному выше в этой статье.

Скачать

Отправка электронной почты через командную строку | windows для системных администраторов

Иногда бывают такие ситуации, необходимо протестировать работоспособность удаленного/или своего почтового сервера, либо же нет возможности отправить электронную почту обычным путём (не работает/отсутствует почтовый клиент).

В этом случае на помощь приходит командная строка. Как же отправить почту из командной строки?

Доступ к SMTP через telnet (отправка почты). Жирным выделены команды, набранные пользователем
telnet mail.testdomain.ru 25

mail.testdomain.ru – это адрес smtp сервера, к которому вы хотите присоединиться

25 — smtp-порт сервера с которым должен соединиться клиент telnet

220 mail.testdomain.ru ESMTP Sendmail 8.13.3/8.13.4; Sat, 21 Jul 2021 09:50:16 0400

ehlo lo

ehlo lo

– здесь мы должны поздоровались с удалённым smtp-сервером

250-ENHANCEDSTATUSCODES

250-PIPELINING

250-8BITMIME

250-SIZE

250-DSN

250-ETRN

250-AUTH GSSAPI DIGEST-MD5 CRAM-MD5

250-DELIVERBY

250 HELP

mail from: test@testdomain.ru

здесь мы указываем, что адрес отправителя письма — test@testdomain.ru

250 2.1.0 test@testdomain.ru… Sender ok

информация о том, что проверка отправителя прошла успешно

rcpt to: test@remote.ru

здесь мы вводим почтовый адрес получателя письма test@remote.ru

250 2.1.5 test@remote.ru… Recipient ok

информация о том, что проверка получателя прошла успешно

data

комманда data говорит о том, что дальше пойдёт тело письма

354 Enter mail, end with «.» on a line by itself

сервер говорит нам, что можно набирать текст письма, а чтобы закончить письмо мы должны набрать точку «.» в новой строке в конце тела письма

testing mail system!!

это наш текст

.

точка — даём понять серверу, о том, что письмо окончено и его можно адресату

250 2.0.0 l365oGFR435164 Message accepted for delivery

уведомление сервера — письмо  встало в очередь на отправку

Получение почты по протоколу pop3

В этой статье все классы для получения и обработке почты по протоколу POP3 будут находиться в проекте типа «Библиотека классов» с именем Pop3Lib. Это позволит подключать готовую библиотеку к различным типам проектов.

Первый, и основной, класс будет отвечать за взаимодействие с почтовым сервером по протоколу POP3. Я назвал его Client.

Для подключения к любому почтовому серверу потребуется четыре обязательных параметра: адрес сервера, порт, имя пользователя и пароль. Поэтому имеет смысл предопределить в классе конструктор, который будет принимать эти четыре параметра.


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

Примечание. Для использования класса Socket необходимо импортировать пространство имен System.Net.Sockets, а также System.Net.

Теперь, когда есть все необходимые данные для подключения к почтовому серверу, можно инициализировать и открыть сокет. Делать это лучше в отдельном публичном методе, например Connect.

:/>  Как отключить службы слежки в Windows 10


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

Для открытия соединения с сервером, необходимо получить IP-адрес сервера, в случае, если в качестве адреса указан домен, и на его основе получить конечную сетевую точку доступа.

После установки соединения с почтовым сервером, ему можно отправлять команды и, соответственно, обрабатывать ответы сервера. Удобней всего это делать в два этапа. На первом этапе серверу будет отправляться команда, а на втором – производиться обработка ответа. Т.е. будет как минимум две отдельные функции.

В ответах сервера, какого бы размера они не были, по правилам протокола POP3, первая строка всегда содержит результат выполнения запроса. При получении ответа от сервера могут возникнуть небольшие задержки соединения и, если ответ большой, то это может занять длительное время, в зависимости от размера буфера сокета и скорости соединения.

public string ReadLine()
{
 byte[] b = new byte[_Socket.ReceiveBufferSize];
 StringBuilder result = new StringBuilder(_Socket.ReceiveBufferSize);
 int s = 0;
 while (_Socket.Poll(1000000, SelectMode.SelectRead) && (s = _Socket.Receive(b, _Socket.ReceiveBufferSize, SocketFlags.None)) > 0)
 {
 result.Append(System.Text.Encoding.ASCII.GetChars(b, 0, s));
 }
 return result.ToString().TrimEnd("rn".ToCharArray());
}

public string ReadToEnd()
{
 byte[] b = new byte[_Socket.ReceiveBufferSize];
 StringBuilder result = new StringBuilder(_Socket.ReceiveBufferSize);
 int s = 0;
 while (_Socket.Poll(1000000, SelectMode.SelectRead) && ((s = _Socket.Receive(b, _Socket.ReceiveBufferSize, SocketFlags.None)) > 0))
 {
 result.Append(System.Text.Encoding.ASCII.GetChars(b, 0, s));
 }
 return result.ToString();
}

Как я уже говорил, первая строка в ответе сервера содержит результат выполнения запроса, который может быть успешным, или неуспешным. Если команда выполнена без ошибок, то ответ сервера будет начинаться со строки « OK», а в случае ошибки – «-ERR».

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

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

Примечание. Для использования регулярных выражений, необходимо импортировать пространство имен System.Text.RegularExpressions.


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

Проверка существования email-адреса – блог админа

В этом посте я расскажу, как используя командную строку проверить существует ли определенный адрес email или нет — без отправки письма на этот email. Вам не придется платить за какой-то сервис или отправлять письма. Вы можете это сделать совершенно бесплатно из командной строки столько раз и со столькими адресами сколько вам нужно!

Когда вы отправляете email на адрес user@domain.com, отправляющий почтовый сервер смотрит MX записи на DNS для ‘domain.com’ и если найдена одна или несколько MX записей, отправляющий сервер пытается доставить email на сервер указанный в MX-записи для домена domain.com.

Давайте попробуем проверить, существует ли адрес someuser@gmail.com или нет. Сначала, поищем существуют ли MX-записи для домена получателя, в примере это gmail.com. Мы будем использовать утилиту просмотра DNS которая называется dig она установлена на большинстве Linux систем. В командной строке наберите:

$ dig gmail.com MX

Вывод отобразит что-то вроде такого:

 ; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.47.rc1.el6 <<>> gmail.com MX @8.8.8.8
;; global options:  cmd
;; Got answer:
;; - > >HEADER< < - opcode: QUERY, status: NOERROR, id: 32294
;; flags: qr rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 0, ADDITIONAL: 0
 
;; QUESTION SECTION:
;gmail.com.                     IN      MX
 
;; ANSWER SECTION:
gmail.com.              3599    IN      MX      10 alt1.gmail-smtp-in.l.google.com.
gmail.com.              3599    IN      MX      20 alt2.gmail-smtp-in.l.google.com.
gmail.com.              3599    IN      MX      30 alt3.gmail-smtp-in.l.google.com.
gmail.com.              3599    IN      MX      40 alt4.gmail-smtp-in.l.google.com.
gmail.com.              3599    IN      MX      5 gmail-smtp-in.l.google.com.
 
;; Query time: 20 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Fri Aug 26 10:13:19 2021
;; MSG SIZE  rcvd: 150
;

Как вы можете видеть, выведено несколько записей MX и перед каждой из них стоит цифровое значение. Это приоритет. Чем меньше значение, тем выше приоритет. Отправляющий почтовый сервер сначала пробует отправить email на сервер с самым высоким приоритетом. У нас получается это ‘gmail-smtp-in.l.google.com’

Далее, нам надо подключиться к почтовому серверу ‘gmail-smtp-in.l.google.com’ по 25 порту (SMTP) для подтверждения правильности email адреса someuser@gmail.com. Для этого можно использовать telnet или netcat. Обе утилиты доступны в репозиториях большинства систем Linux.

$ nc gmail-smtp-in.l.google.com 25 # или telent gmail-smtp-in.l.google.com 25
220 mx.google.com ESMTP a12si21630825itb.5 - gsmtp

Для начала диалога с сервером наберите HELO. Некоторые сервера так же принимают приветствие EHLO вместо HELO. После приветствия, вам нужно рассказать с какого вы сервера пришли (допустим с mydomain.com).

HELO mydomain.com
250 mx.google.com at your service

Наберите: mail from:<myname@mydomain.com> чтобы рассказать серверу от чьего имени вы собираетесь с ним говорить

mail from:myname@mydomain.com;
250 2.1.0 OK v72si21823782itb.85 - gsmtp

Если сервер ответил “250”, значит можно двигаться дальше. Набирайте: rcpt to:<someuser@gmail.com>

rcpt to:someuser@gmail.com
250 2.1.5 OK v72si21823782itb.85 - gsmtp

Ответ сервера на эту команду и скажет нам – действительно ли существует такой email как “someuser@gmail.com” или нет.
Если ответ будет “250 OK” значит такой адрес существует.

Если же ответ будет “550” значит запрашиваемый вами аккаунт email не существует.

rcpt to:someuser@gmail.com
550-5.1.1 The email account that you tried to reach does not exist. Please try
550-5.1.1 double-checking the recipient's email address for typos or
550-5.1.1 unnecessary spaces. Learn more at
550 5.1.1  https://support.google.com/mail/answer/6596 y18si12470464ioi.55 - gsmtp

На заметку, если вы будете повторять такие процедуры очень часто и с одного и того же IP вас могут забанить по IP. Используйте с осторожностью.

Смотрим и отправляем почту из консоли

POP3 протокол

Итак:

Используем аккаунт на mail.ru в качестве примера. Подключаемся:

telnetpop.mail.ru 110   (порт пишется через пробел).

OK

теперь надо представиться:
USER myname

а в ответ подозрительный сервак вам говорит что человек без бумажки? пароль давай:
OK введите пароль

PASS my_super-puper_parol_12345

Получаем, о молодец, знаю такого:
OK у вас столько-то писем

Теперь можно их получить по очереди можно посмотреть, например список с размерами
LIST

В ответ мы увидим в столбик номер писем и размер.
Теперь, мы хотим посмотреть заголовок письма №1 от кого и про что пишут
TOP 1

В ответ получим первые 25 строк письма (и сможем получить о нем представление)
А увидели мы, что это опять реклама кровяной колбасы, а так как мы ничего такого не едим то письмо удаляем, для этого введем команду
DELE1

OKmessage 1 deleted

Смотрим, что за второе письмо к нам пришло
TOP 2

(первого уже нет помните? Но нумерация писем не обнуляется потому №2)
Получаем заголовки письма от уважаемого Васи Пупкина, о! так его нам надо получить, а для этого есть команда
RETR 2

Все письмо пробежит перед нашими глазами на экране (почтовый клиент это сохранил бы, а мы просто прочитаем)
Мы не хотим, чтобы прочитанное письмо оставалось на сервере ведь мы его уже получили, потому выполняем команду:
DELE 2

А вот командой
RSET

Снмаем все отметки на удаление отмеченных файлов и завершаем соединение.

Обращаю внимание, что команда на удаление отмеченных DELEписем будет выполнена только при выходе, т.е. при вводе QUIT.

Согласно спецификации протокола команды принято вводить в верхнем регистре. Хотя многие серваки, тот же mail.ruв частности, не ругаются на нижний регистр ввода.
QUIT

Оставьте комментарий

Adblock
detector