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,"В отдельную папку");        
// если галочка поставлена - происходит включение шифрования 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 и двух компонентов. Буду рад услышать вопросы и возмущения :)

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

  1. Владимир

    Не работает, ругается на Chilkat.MailMan2

    Ответить
  2. Виктор

    Не удается найти класс программируемых объектов с именем «ChikatMailMan2»

    код 80020009

    Ответить