И так, праздники прошли, можно приниматься за работу… В этой статье мы рассмотрим, как можно сохранить электронную почту программным путем с помощью сценария на языке Jscript. Так как сам программный код содержит больше 200 строк, то я решил написать примеры на других языках в отдельной статье.
В первую очередь нужно определиться со следующими моментами:
- Для доступа к электронной почте (неважно, будет производиться доступ из программы-клиент, например Outlook, или программным путем) нужны четыре основные параметра: адрес почтового сервера, адрес электронной почты, пароль и порт для подключения.
- Параметры подключения будут зависеть от настроек вашего почтового сервера (yandex.ru, google.com, mail.ru и так далее), в том числе, как дополнительный параметр, нужно включить или отключить SSL.
- Текстовое и HTML содержимое письма – дело в том, что мы можем сохранить как HTML, так и текстовое содержимое электронной почты, много зависит от поля Content-Type. Однако, при тестировании скрипта, я заметит, что для некоторых писем вместо визуально видимого содержимого, скрипт возвращает практически пустую строку.
Теперь давайте рассмотрим, поставленные задачи:
- Нужно подключиться к указанному почтовому ящику, обработать в цикле все письма и получить их текстовое содержимое, имя отправителя, электронный адрес отправителя, дату и так далее.
- Нужно сохранить содержимое письма электронной почты в отдельный текстовый файл с уникальным именем.
- В зависимости от поставленной задачи, письма надо сохранять или в одну папку, или в разные подпапки.
- Также надо скачать все вложения, которые будут прикреплены к электронным письмам.
Хорошо, с подводными камнями и поставленными задачами мы определились, теперь надо определиться с компонентами:
- WindowSystemObject – данный компонент позволит создать оконный интерфейс (своеобразную оболочку для программного кода). Вы можете ознакомится и скачать данный компонент на странице «Создаем оконный интерфейс«.
- EmailActiveX – фактически это не одна библиотека, а коллекция библиотек, которая и позволяет выполнить показать как сохранить электронную почту, или прикрепленные файлы. Ознакомится с компонентом и скачать его можно на странице http://www.example-code.com/vbscript/pop3.asp.
Оба компонента не нужно регистрировать, достаточно запустить исполняемый файл, который все сделает за вас.
![Внешний вид программы](https://scriptcoding.ru/picture/save-mail-2.png)
А теперь самое сложное – программирование… я постараюсь основные моменты объяснить в комментариях. Если будут вопросы, задавайте, буду рад ответить…
// *********************************************************** // Скрипт показывает, как сохранить электронную почту // и все вложения (прикрепленные файлы) // SaveMail.js // *********************************************************** // Глобальные переменные var WSO, FSO, f, WshShell; var data_array = []; WSO = WScript.CreateObject("Scripting.WindowSystemObject"); FSO = WScript.CreateObject("Scripting.FileSystemObject"); WshShell = WScript.CreateObject("WScript.Shell"); // ****************************************************************** // параметры формы // ****************************************************************** f = WSO.CreateForm(0,0,0,0); f.ClientWidth = 800; // ширина f.ClientHeight = 600; // высота f.CenterControl(); // по центру f.Text = "Почтовый клиент"; // название f.SizeGrip = false; // нельзя менять размеры f.MaximizeBox = false; // нельзя развернуть форму // ****************************************************************** // ****************************************************************** //Текстовое поле для отображения содержимого письма // ****************************************************************** edit2 = f.CreateEdit(0,410,800,190,WSO.Translate("ES_MULTILINE")); edit2.ScrollBars = WSO.Translate("SS_BOTH"); edit2.ReadOnly = true; edit2.WordWrap = true; // ****************************************************************** // ****************************************************************** // Метки и чекбоксы // ****************************************************************** label1 = f.TextOut(480,10,"Сервер"); LServer = f.CreateEdit(590,10,200,20,WSO.Translate("ES_MULTILINE")); LServer.Text="pop.yandex.ru"; // содержит имя почтового сервера label2 = f.TextOut(480,30,"Мыло"); LMail = f.CreateEdit(590,30,200,20,WSO.Translate("ES_MULTILINE")); LMail.Text="mail@yandex.ru"; // содержит имя почтового ящика как сохранить электронную почту label3 = f.TextOut(480,50,"Пароль"); LPass = f.CreateEdit(590,50,200,20,WSO.Translate("ES_MULTILINE")); LPass.Text="mypass"; // содержит пароль от почтового ящика label4 = f.TextOut(480,70,"Порт"); LPort = f.CreateEdit(590,70,200,20,WSO.Translate("ES_MULTILINE")); LPort.Text="110"; // содержит номер порта для подключения label5 = f.TextOut(480,90,"Каталог"); LPath = f.CreateEdit(590,90,200,20,WSO.Translate("ES_MULTILINE")); LPath.Text=WshShell.CurrentDirectory; // каталог, куда будут сохраняться письма // если галочка поставлена - письма будут сортироваться по отдельным каталогам CheckBox2 = f.CreateCheckBox(480,110,130,25,"В отдельную папку"); // если галочка поставлена - происходит включение шифрования SSL CheckBox1 = f.CreateCheckBox(480,130,130,25,"SSL"); // ****************************************************************** // ****************************************************************** // Кнопки // ****************************************************************** Button1 = f.CreateButton(480,160,150,25,"Анализировать почту") Button1.OnClick = CreateListView; // Подключение к почтовому серверу Button2 = f.CreateButton(480,190,150,25,"Сохранить все письма") Button2.OnClick = SaveMailToFile; // Сохранение писем Button3 = f.CreateButton(480,220,150,25,"Сохранить все вложения") Button3.OnClick = SaveAllAttach; // Сохранение вложений t = f.CreateHyperLink(490,250,250,25,"scriptcoding.ru") // ****************************************************************** // ****************************************************************** // Функция создает массив с данными // ****************************************************************** function fill_data_array(){ var objMail, success, getObjMail,eMail; var oAttach = ""; data_array.length = 0; // Подключаем компонент для работы с почтой objMail= WScript.CreateObject("Chilkat.MailMan2"); success = objMail.UnlockComponent("30-day trial"); if (success != 1){WScript.Echo("Компонент не удалось разблокировать!!!!");WScript.Quit();} // ****************************************************************** // параметры подключения // ****************************************************************** objMail.MailHost = LServer.Text; objMail.PopUsername = LMail.Text; objMail.PopPassword = LPass.Text; objMail.MailPort = parseInt(LPort.Text); if (CheckBox1.State==true){objMail.PopSsl=1;}else{objMail.PopSsl=0} // ****************************************************************** getObjMail = objMail.CopyMail(); // считываем содержимое почтового ящика if (getObjMail == null){WScript.Echo("Ошибка соединения !!!!\n\n" + objMail.LastErrorText);WScript.Quit();} // Начинаем обработку все входящих писем как сохранить всю электронную почту for (i=0; i<=getObjMail.MessageCount-1; i++){ eMail = getObjMail.GetEmail(i); // добавляем в массив объект data_array.push({ dAvtor: eMail.FromName, // автор письма dTema: eMail.Subject, // тема письма dMail: eMail.FromAddress, // электронный адрес отправителя dDate: eMail.EmailDateStr, // дата dText: eMail.GetPlainTextBody() // текстовое содержимое }); } //закрываем соединение objMail.Pop3EndSession(); }; // ****************************************************************** // массив с данными о колонках var def_columns = [ { name: "Автор", width:120, set_data: function(item, it) { item.Text = data_array[it].dAvtor; }}, { name: "Тема", width:120, set_data: function(item, it) { item.SubItems(0) = data_array[it].dTema; } }, { name: "Мыло", width:120, set_data: function(item, it) { item.SubItems(1) = data_array[it].dMail; } }, { name: "Дата", width:120, set_data: function(item, it) { item.SubItems(2) = data_array[it].dDate; } } ]; // ****************************************************************** // Функция формирует список // ****************************************************************** function CreateListView(){ var list_view_obj; list_view_obj = f.CreateListView( 0, 0, 460, 400,WSO.Translate("LVS_REPORT | LVS_SHOWSELALWAYS")); list_view_obj.GridLines = true; list_view_obj.RowSelect = true; list_view_obj.ReadOnly = false; // Определяем имя и тип колонок for(var ix = 0; ix < def_columns.length; ++ix){ var def_col = def_columns[ix]; var column = list_view_obj.Columns.Add(def_col.name, def_col.width); } // Заполняем список fill_data_array(); list_view_obj.Count = data_array.length; for(var ix = 0; ix < def_columns.length; ++ix){ for (var iy=0; iy<list_view_obj.Count; iy++){ def_columns[ix].set_data(list_view_obj.item(iy), iy); } } // Обработка двойного щелчка list_view_obj.OnDblClick = function (sender, x, y, button, flags){ edit2.Text = data_array[sender.ItemIndex].dText; } // ****************************************************************** // Делаем доступными кнопки // ****************************************************************** Button2.Enabled = true; Button3.Enabled = true; CheckBox2.Enabled = true; // ****************************************************************** //Сообщаем об успешной операции WScript.Echo("Подключение прошло успешно.\n В вашем ящике " + data_array.length + "писем"); }; // ****************************************************************** // ****************************************************************** // блокируем кнопки // ****************************************************************** Button2.Enabled = false; Button3.Enabled = false; CheckBox2.Enabled = false; // ****************************************************************** f.Show() WSO.Run() // ****************************************************************** // Функция сохраняет текст письма // ****************************************************************** function SaveMailToFile(){ var j,oFolder, oFile, oTemp; for(j=0; j<=data_array.length-1;j++){ oTemp = data_array[j].dText; edit2.Text = oTemp; if (CheckBox2.State==true){ oFolder = LPath.Text + "\\" +data_array[j].dMail; if(FSO.FolderExists(oFolder) == false){ FSO.CreateFolder(oFolder); } oFile=FSO.CreateTextFile(oFolder + "\\" + data_array[j].dAvtor + "_" + data_array[j].dMail + "_" + j + ".txt", true); //как сохранять электронную почту oFile.WriteLine(edit2.Text); oFile.Close(); }else{ oFile=FSO.CreateTextFile(LPath.Text + "\\" + data_array[j].dAvtor + "_" + data_array[j].dMail + "_" + j + ".txt", true); oFile.WriteLine(edit2.Text); oFile.Close(); } } //Сообщаем об успешной операции WScript.Echo("Письма сохранены в папке: " + LPath.Text); }; // ****************************************************************** // ****************************************************************** // Функция сохраняет все вложения // ****************************************************************** function SaveAllAttach(){ var objMail, success, getObjMail,eMail; var oAttach = ""; objMail= WScript.CreateObject("Chilkat.MailMan2"); success = objMail.UnlockComponent("30-day trial"); if (success != 1){WScript.Echo("Компонент не удалось разблокировать!!!!");WScript.Quit();} objMail.MailHost = LServer.Text; objMail.PopUsername = LMail.Text; objMail.PopPassword = LPass.Text; objMail.MailPort = parseInt(LPort.Text); if (CheckBox1.State==true){objMail.PopSsl=1;}else{objMail.PopSsl=0} getObjMail = objMail.CopyMail(); if (getObjMail == null){WScript.Echo("Ошибка соединения !!!!\n\n" + objMail.LastErrorText);WScript.Quit();} for (i=0; i<=getObjMail.MessageCount-1; i++){ eMail = getObjMail.GetEmail(i); eMail.OverwriteExisting = 0 success = eMail.SaveAllAttachments(LPath.Text) if (success != 1){WScript.Echo("Ошибка соединения !!!!\n\n" + eMail.LastErrorText);WScript.Quit();} } //Сообщаем об успешной операции WScript.Echo("Вложения сохранены в папку: " + LPath.Text); }; // ****************************************************************** |
Хорошо, некоторые пояснения к программному коду все же надо дать. При запуске скрипта, в текстовые поля (Label1 … Label5) нужно прописать данные для подключения к почтовому серверу. Label5 будет содержать путь к текущему каталогу (каталог, из которого вы запустили сценарий), если будете прописывать собственный путь, то косую черточку в конце ставить не надо, иначе произойдет некорректное сохранение данных!
CheckBox1 – позволяет поставить галочку (включить SSL) или снять (выключить SSL).
CheckBox2 – если вы поставите галочку, то в заданном каталоге файлы будут группироваться по подпапкам. Поясню: допустим, у нас есть письма от a@mail.ru, b@mail.ru и c@mail.com, логично создать папки с такими именами, и в каждую папку помещать письма только от этого автора. Как сохранить электронную почту.
![При запуске, доступна только одна кнопка Кнопки и текстовые поля программы - охранение электронной почты](https://scriptcoding.ru/picture/save-mail-1.png)
При запуске скрипта активной будет только одна кнопка (Button1) – “анализировать”. Нажав на нее, произойдет подключение к заданному почтовому ящику и считывание информации. Информация о всех письмах будет храниться в массиве data_array, а именно: имя автора, электронный адрес отправителя, тема письма, дата и текстовое содержимое. Если все пройдет успешно, появится таблица (list_view_obj) содержащая четыре поля и количество строк, равных числу писем. Если вы дважды щелкнете по заданной строке, то внизу в поле Edit2 будет отображаться текстовое содержимое выбранного электронного письма.
![Информативное сообщение после выполнения функции Результат сохранения электронной почты и вложений](https://scriptcoding.ru/picture/save-mail-3.png)
Кнопки “Сохранить все письма”, “Сохранить все вложения” станут доступными сразу после анализа электронной почты. Они позволяют сохранить электронную почту, точнее, содержимое писем в текстовый файл или сохранить все найденные вложения. В конце выбранной операции произойдет вывод информативного сообщения.
Программирование довольно интересное и занимательное занятие, но только до тех пор, пока вы воспринимаете все это как хобби. Но как только вы решаете создать что серьезное, то на поверхность начинаю выплывать подводные камни и неприятные нюансы. Однажды я решил написать скрипт, задача которого была в сканировании сайта на предмет внешних битых ссылок. И трудности возникали не в плане программирования, а в плане решения поставленной задачи. Сначала условием проверки битой ссылки была ошибка “404”, все вроде логично и правильно, но, возможен случай, когда не только страница, но и сам домен удален, или даже такой вариант – сайт на заданном домене давным-давно удален, но хостер, просто размещает там рекламу, в этом случае, понять, что ссылка на заданный домен является битой можно только визуально, так как опрос ответов сервера ничего не даст.
И так, мы рассмотрели, как сохранить электронную почту вместе с вложениями с помощью программного кода на языке JScript и двух компонентов. Буду рад услышать вопросы и возмущения
Не работает, ругается на Chilkat.MailMan2
Не удается найти класс программируемых объектов с именем «ChikatMailMan2»
код 80020009