JScript: Сохранение электронной почты и вложений

JScript: Сохранение электронной почты и вложений Примеры скриптов и макросов для Word и WSH

И так, праздники прошли, можно приниматься за работу… В этой статье мы рассмотрим, как можно сохранить электронную почту программным путем с помощью сценария на языке 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,"В отдельную папку");        // если галочка поставлена - происходит включение шифрования SSLCheckBox1 = 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,"www.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("Ошибка соединения !!!!nn"+ 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("Ошибка соединения !!!!nn"+ 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("Ошибка соединения !!!!nn"+ 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 и двух компонентов. Буду рад услышать вопросы и возмущения :)

Оцените статью
Технологии программирования и ведение блога
Добавить комментарий