И так, праздники прошли, можно приниматься за работу… В этой статье мы рассмотрим, как можно сохранить электронную почту программным путем с помощью сценария на языке Jscript. Так как сам программный код содержит больше 200 строк, то я решил написать примеры на других языках в отдельной статье.
В первую очередь нужно определиться со следующими моментами:
- Для доступа к электронной почте (неважно, будет производиться доступ из программы-клиент, например Outlook, или программным путем) нужны четыре основные параметра: адрес почтового сервера, адрес электронной почты, пароль и порт для подключения.
- Параметры подключения будут зависеть от настроек вашего почтового сервера (yandex.ru, google.com, mail.ru и так далее), в том числе, как дополнительный параметр, нужно включить или отключить SSL.
- Текстовое и HTML содержимое письма – дело в том, что мы можем сохранить как HTML, так и текстовое содержимое электронной почты, много зависит от поля Content-Type. Однако, при тестировании скрипта, я заметит, что для некоторых писем вместо визуально видимого содержимого, скрипт возвращает практически пустую строку.
Теперь давайте рассмотрим, поставленные задачи:
- Нужно подключиться к указанному почтовому ящику, обработать в цикле все письма и получить их текстовое содержимое, имя отправителя, электронный адрес отправителя, дату и так далее.
- Нужно сохранить содержимое письма электронной почты в отдельный текстовый файл с уникальным именем.
- В зависимости от поставленной задачи, письма надо сохранять или в одну папку, или в разные подпапки.
- Также надо скачать все вложения, которые будут прикреплены к электронным письмам.
Хорошо, с подводными камнями и поставленными задачами мы определились, теперь надо определиться с компонентами:
- WindowSystemObject – данный компонент позволит создать оконный интерфейс (своеобразную оболочку для программного кода). Вы можете ознакомится и скачать данный компонент на странице «Создаем оконный интерфейс«.
- EmailActiveX – фактически это не одна библиотека, а коллекция библиотек, которая и позволяет выполнить показать как сохранить электронную почту, или прикрепленные файлы. Ознакомится с компонентом и скачать его можно на странице http://www.example-code.com/vbscript/pop3.asp.
Оба компонента не нужно регистрировать, достаточно запустить исполняемый файл, который все сделает за вас.
А теперь самое сложное – программирование… я постараюсь основные моменты объяснить в комментариях. Если будут вопросы, задавайте, буду рад ответить…
// *********************************************************** // Скрипт показывает, как сохранить электронную почту // и все вложения (прикрепленные файлы) // 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, логично создать папки с такими именами, и в каждую папку помещать письма только от этого автора. Как сохранить электронную почту.
При запуске скрипта активной будет только одна кнопка (Button1) – “анализировать”. Нажав на нее, произойдет подключение к заданному почтовому ящику и считывание информации. Информация о всех письмах будет храниться в массиве data_array, а именно: имя автора, электронный адрес отправителя, тема письма, дата и текстовое содержимое. Если все пройдет успешно, появится таблица (list_view_obj) содержащая четыре поля и количество строк, равных числу писем. Если вы дважды щелкнете по заданной строке, то внизу в поле Edit2 будет отображаться текстовое содержимое выбранного электронного письма.
Кнопки “Сохранить все письма”, “Сохранить все вложения” станут доступными сразу после анализа электронной почты. Они позволяют сохранить электронную почту, точнее, содержимое писем в текстовый файл или сохранить все найденные вложения. В конце выбранной операции произойдет вывод информативного сообщения.
Программирование довольно интересное и занимательное занятие, но только до тех пор, пока вы воспринимаете все это как хобби. Но как только вы решаете создать что серьезное, то на поверхность начинаю выплывать подводные камни и неприятные нюансы. Однажды я решил написать скрипт, задача которого была в сканировании сайта на предмет внешних битых ссылок. И трудности возникали не в плане программирования, а в плане решения поставленной задачи. Сначала условием проверки битой ссылки была ошибка “404”, все вроде логично и правильно, но, возможен случай, когда не только страница, но и сам домен удален, или даже такой вариант – сайт на заданном домене давным-давно удален, но хостер, просто размещает там рекламу, в этом случае, понять, что ссылка на заданный домен является битой можно только визуально, так как опрос ответов сервера ничего не даст.
И так, мы рассмотрели, как сохранить электронную почту вместе с вложениями с помощью программного кода на языке JScript и двух компонентов. Буду рад услышать вопросы и возмущения
Не работает, ругается на Chilkat.MailMan2
Не удается найти класс программируемых объектов с именем «ChikatMailMan2»
код 80020009