1 (изменено: oleg1345140, 2017-05-14 23:09:35)

Тема: JS: Получение и сортировка почтовых вложений

Доброе время суток. Излазил весь интернет но не нашел адекватного и работаюещего скрипта по загрузке почтовых вложений.
Задача следующая: Скрипт при запуске подключается к почтовому серверу через протокол pop3. Далее сканирует все письма и сохраняет их в папки по отправителям и по типу файла. Напимер письмо от a@domen.com с вложениями 1.exe и 2.gif, скрипт создаст в корне указанной папки папу a@domen.com, а в ней подпапки ехе и  gif куда и положит соответствующие файлы. Если при помощи данного языка написать это не реально, подскажите на чем это возможно.

2

Re: JS: Получение и сортировка почтовых вложений

Cам я в программировании не силен, нашел скрипт выполняющий похожие функции смог исправить банальные неточности и запустить его, но скрипт обладает рядом недостатков и глюков:
1) Запускается в виде окна, соответственно требует управления и взаимодействия с ним
2)Не стабильно работает, часто при верной паре логин/пароль выдает информацию о том что не удалось подключится. Подобную ошибку выдает при попытке скачать вложения после анализа почты.
3) Не создает подпапки по расширению.
Собственно сам скрипт:

// ***********************************************************
// Скрипт показывает, как сохранить электронную почту
// и все вложения (прикрепленные файлы)
// 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.rambler.ru";				// содержит имя почтового сервера

label2 = f.TextOut(480,30,"Мыло");
LMail = f.CreateEdit(590,30,200,20,WSO.Translate("ES_MULTILINE"));
LMail.Text="test@rambler.ru";			// содержит имя почтового ящика																																				как сохранить электронную почту

label3 = f.TextOut(480,50,"Пароль");
LPass = f.CreateEdit(590,50,200,20,WSO.Translate("ES_MULTILINE"));
LPass.Text="xxx";					// содержит пароль от почтового ящика

label4 = f.TextOut(480,70,"Порт");
LPort = f.CreateEdit(590,70,200,20,WSO.Translate("ES_MULTILINE"));
LPort.Text="995";										// содержит номер порта для подключения

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,"www.scriptcoding.ru")
// ******************************************************************

// ******************************************************************
// Функция создает массив с данными
// ******************************************************************
function fill_data_array(){
var objMail, success, getObjMail,eMail;
var oAttach = "";
	data_array.length = 0;
	
	// Подключаем компонент для работы с почтой
	objMail= WScript.CreateObject("Chilkat_9_5_0.MailMan");
	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_9_5_0.MailMan");
	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);
};
// ******************************************************************

3

Re: JS: Получение и сортировка почтовых вложений

oleg1345140, думаю Вам вполне подойдёт консольная утилита getmail.exe. Её можно загрузить по ссылке.

Описание:


GetMail v1.33: WinNT console utility to download a mailbox's mail.
syntax:
  Getmail -u <user> -pw <password> -s <server> [optional switches (see below)]
  Getmail -install [ see install details below ]
  Getmail -profile [-delete | "<default>"] [profile1] [profileN] [-q]
  Getmail -h [-q]
  Getmail -forceextract filename

-install <server> <userid> <password> [<delete> [<xtract> [<try> [<port> [<profile>]]]]]
     : set's POP3 server, login, password, whether to delete or not (Yes/No),
       whether to automatically extract base64/7bit/UU encoded files or not (Yes/No),
       number of tries and port for profile
       (<delete> <xtract> <try> and <port> may be replaced by '-').

-u <userid>   : Specify userid on remote pop3 host
-pw <password>: Specify password for userid on remote mail host
-s <server>   : Specify mail server (pop3) to contact
-nodelete     : Do not delete messages after downloading (default)
-delete       : Delete messages after downloading
-noxtract     : Do not extract base64/7bit/UU files after downloading (default)
-xtract [defname]: Extract base64/7bit/UU encoded files after downloading messages
                   defname is an optional default filename for the extracted file
-domainstamp  : Prepend sender's domain name to extracted attachments
-headersonly  : Download only the headers of the message
-port <port>  : port to be used on the server, defaults to POP3 (110)
-p <profile>  : send with SMTP server, user and port defined in <profile>.
-q            : supresses *all* output.
-n <n>        : Only get 'n' messages
-m <n>        : Only get message # n
-b <n>        : Retrieve messages beginning from # n
-plain        : Extract text/plain segments too (usually ignored)
-h            : displays this help.
-try <n times>: how many attempts to access mail.  from '1' to 'INFINITE'
-ti <n>       : Set timeout to 'n' seconds.
-forceextract fn: Attempt to extract any encoded messages in 'fn'
Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

4

Re: JS: Получение и сортировка почтовых вложений

Xameleonк сожалению не получилось подключится. Данный клиент поддерживает шифрование?

5

Re: JS: Получение и сортировка почтовых вложений

oleg1345140, к сожалению в самой утилите - нет. Для поддержки SSL используют доп. утилиту stunnel.

Либо альтернативный вариант используя cygwin - ссылка

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !