$logpass=""; //FORMAT: md5(loginIMAILpassword);
define('DEBUG', FALSE);
define('SIMULATION', FALSE);
define('SERVICEMODE', FALSE);
if(DEBUG) {
ini_set('display_errors',1);//1
ini_set('display_startup_errors',1);//1
error_reporting(-1);//-1
} else {
ini_set('display_errors',0);//1
ini_set('display_startup_errors',0);//1
error_reporting(0);//-1
}
header('Content-type: text/html; charset=utf-8;');
#Alexus(240980845) - http://www.a-l-e-x-u-s.ru/
#CREATED AT 15.12.2011
#UPD 02.04.2012 v 1.1
#UPD 10.04.2012 v 1.2
#UPD 30.05.2012 v 1.3
#UPD 02.06.2012 v 1.3.1
#UPD 20.10.2012 v 1.4
#UPD 16.02.2013 v 1.5
#UPD 15.04.2013 v 1.5.1
#UPD 01.06.2013 v 1.6
#UPD 15.09.2013 v 1.6.5
#UOD 30.04.2014 v 1.7
#UPD 11.08.2014 v 1.7.1
#UPD 15.09.2014 v 2.0b
#UPD 22.09.2014 v 2.0
#UPD 24.09.2014 v 2.0.1
#UPD 06.10.2014 v 2.0.2
#UPD 20.10.2014 v 2.0.3
define("VERSION", "2.0");
define("FULLVERSION", "2.0.8");
define("RELEASEDATE", "08-12-2014");
$boundary="--".AMUtil::randomString(10);
$timezone='Europe/Moscow';
/**
Запрос авторизации
*/
if($logpass!="") {
if(!isset($_SERVER['PHP_AUTH_USER'])) {
header('WWW-Authenticate: Basic realm="IMAIL"');
header('HTTP/1.0 401 Unauthorized');
print "Authentification required!";
exit;
} else {
if(md5($_SERVER['PHP_AUTH_USER']."IMAIL".$_SERVER['PHP_AUTH_PW'])!=$logpass) {
header('WWW-Authenticate: Basic realm="IMAIL"');
header('HTTP/1.0 401 Unauthorized');
print 'Wrong login or password!';
exit;
}
}
}
if(isset($_COOKIE['timezone']) && $_COOKIE['timezone']!="")
$timezone=$_COOKIE['timezone'];
date_default_timezone_set($timezone);
//Определяем язык пользователя
$translation=new Translation("ru", !SERVICEMODE);
$shellManager=new ShellManager();
$filesContainer=new FilesContainer();
/*$lang="ru";
if (isset($_COOKIE['translation']))
$lang=$_COOKIE['translation'];*/
if(isset($_POST['PROXY'])) {
$proxy_server=parse_url($_POST['PROXY']);
define("PROXY",$proxy_server['host'].":".$proxy_server['port']);
}
//Фильтруем переданные параметры
if (get_magic_quotes_gpc()) {
function stripslashes_deep($value)
{
$value = is_array($value) ?
array_map('stripslashes_deep', $value) :
stripslashes($value);
return $value;
}
$_POST = array_map('stripslashes_deep', $_POST);
$_GET = array_map('stripslashes_deep', $_GET);
$_COOKIE = array_map('stripslashes_deep', $_COOKIE);
$_REQUEST = array_map('stripslashes_deep', $_REQUEST);
}
$translation->add("en", array(
'status-idle'=>'Idle',
'status-sending'=>'Sending',
'status-pause'=>'Pause',
'process-resume'=>'Resume',
'process-pause'=>'Pause',
'process-cancel'=>'Cancel',
'settings-primary'=>'Primary',
'settings-outservers'=>'External servers',
'settings-security'=>'Security',
'settings-diagnostics'=>'Self Diagnostics',
'settings-history-length'=>'History max length',
'settings-outservers-doc'=>'Read <a href="http://mailer.a-l-e-x-u-s.ru/docs/alexusMailer_v1.7.en.pdf"><span class="label label-warning">documentation</span></a> to learn more about external servers.',
'settings-outservers-check'=>'Check servers',
'settings-outservers-check-autoremove'=>'(Unavailable will be auto-removed)',
'settings-outservers-check-log'=>'Check log:',
'settings-security-notwritable'=>'Script file is not writable! Password change imposible. Change file rights to 666 for password change.',
'settings-security-notwritable-dir'=>' Script folder is not writable! Saving settings imposible. Change folder rights to 666 for saving settings.',
'settings-security-password-changed'=>'Password succesfully changed!',
'settings-security-password-not-changed'=>'There was an error during pass change, may be script file is not writable.',
'settings-security-set-password'=>'Set password',
'settings-security-remove-password'=>'Remove password',
'settings-security-use-proxy'=>'Use http proxy',
'settings-remove'=>'Remove settings',
'settings-saved'=>'Settings saved',
'settings-save-error'=>'Saving settings error. Check folder write rightes and rights on amsettings.php',
'outservers-not-available'=>'Outservers functionality is not available (see Self Diagnostics)',
'send-in-background-notavalable'=>'Background sending is not available (see Self Diagnostics)',
'settings-removed'=>'Settings removed',
'settings-send-in-background'=>'Send in background',
'main'=>'Primary',
'help'=>'Help',
'login'=>'Login',
'password'=>'Password',
'settings'=>'Settings',
'backtoeditor'=>'Back to editor',
'name'=>'alexusMailer',
'title_service'=>'Anonymous e-mail service',
'need_auth'=>'Authentification required!',
'wronglogpas'=>'Wrong login or password!',
'sendedto'=>'Sended to ',
'badcaptcha'=>'Wrong security code',
'sendlimit'=>'Sending limit is 1 per hour',
'sendavailable'=>'Sending available',
'sendlessminute'=>'Sending will be available less in one minute',
'sendafter'=>'Sending after ',
'sendafter2'=>' minutes',
'attachfile'=>'Attach file',
'close'=>'Close',
'upload'=>'Upload',
'uploadlist'=>'Upload list',
'uploadtemplate'=>'Upload template',
'preview'=>'Preview',
'donatedevelopment'=>'Donate to developer',
'techsupport'=>'Tech Support',
'settings'=>'Settings',
'threadsnum'=>'Thread nubmer:',
'timeoutlen'=>'Timeout in seconds:',
'useoutservers'=>'Use external servers for sending',
'unavalable_in_service'=>'unavailable in service mode',
'less'=>'Less',
'more'=>'More',
'delete'=>'Delete',
'status'=>'Status',
'recipient'=>'Recipient',
'fromname'=>'From, name',
'frommail'=>'From, email',
'replymail'=>'Reply-to, email',
'subject'=>'Subject',
'subject_example'=>'Growing bamboo under the bed',
'addfield'=>'Additional field',
'addfield2'=>'add. field',
'mailtype'=>'Mail type',
'plaintext'=>'plain text',
'withformating'=>'with formating',
'htmle'=>'html with image auto-attach',
'captcha'=>'Security code',
'save'=>'Save',
'load'=>'Load',
'send'=>'Send',
'servicemode-not-available'=>'Not available in demonstration mode',
'servicemode-macro-not-available'=>'THIS MACRO NOT AVAILABLE IN SERVICE MODE',
'timezone'=>'Timezone',
'error'=>'error',
'service-warning-text'=>'SENDED BY alexusMailer DEMONSTRATION SERVICE - ANONYMOUS MAILING SCRIPT',
'wrong-out-server-type'=>'Wrong shell type',
'remote-server-unavailable'=>'Remote server unavailable',
'file-not-available'=>'File not available',
'shell-check-no-correct-type-definition'=>'No correct type definition',
'shell-check-404-not-found'=>'404 not found',
'shell-check-unknown-shell-type'=>'Unknown shell type',
'shell-sheck-test-command-execution-failed'=>'Test command execution failed',
'file_is_writable'=>'File is writable (666 или 777)',
'file_is_writable_e'=>'Need for password change',
'dir_is_writable'=>'Directory is writable (666 или 777)',
'dir_is_writable_e'=>'Need for autocreation of settings and bg sending files',
'settings_is_writable'=>'Settings file is writable (666 или 777) amsettings.php',
'settings_is_writable_e'=>'Need for settings saving',
'bgfiles_is_writable'=>'Background sending files is writable (666 или 777) - ".state.am.php" and ".task.am.php"',
'bgfiles_is_writable_e'=>'Required for background sending',
'shells_available'=>'Shell folder uploaded',
'shells_available_e'=>'Shell folder and modules inside it required for using shells',
'allow_url_fopen'=>'Cross server requests (allow_url_fopen)',
'allow_url_fopen_e'=>'Need for shells and images auto attach',
'post_max_size'=>'POST request maximum size (post_max_size)',
'post_max_size_e'=>'Influence on max letter size',
'upload_max_filesize'=>'Maximum file upload size (upload_max_filesize)',
'upload_max_filesize_e'=>'Influence on maximum attach size',
'state_set'=>'Set',
'state_unset'=>'Not set',
'state_exist'=>'Exists',
'state_not_exist'=>'Not exists',
'state_allowed'=>'Allowed',
'state_not_allowed'=>'Forbiden',
'refresh'=>'Refresh',
'UPLOAD_ERR_INI_SIZE'=>'The uploaded file exceeds the upload_max_filesize directive in php.ini.',
'UPLOAD_ERR_FORM_SIZE'=>'The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form.',
'UPLOAD_ERR_PARTIAL'=>'The uploaded file was only partially uploaded.',
'UPLOAD_ERR_NO_FILE'=>'No file was uploaded.',
'UPLOAD_ERR_NO_TMP_DIR'=>'Missing a temporary folder.',
'UPLOAD_ERR_CANT_WRITE'=>'Failed to write file to disk..',
'UPLOAD_ERR_EXTENSION'=>'A PHP extension stopped the file upload.',
'UNKNOWN_ERROR'=>'Unknown error',
'transfer-text-in-base64'=>'Transfer text in base64',
'save-sended-to-txt-log'=>'Save sended to txt log',
'insert-test-email-every'=>'Insert test email every',
'insert-test-email-every2'=>'emails',
'test-email'=>'Test email',
'helppage'=>'<h1 style="margin-top: -10px;">FAQ
<ul>
<li><a href="#WhatIsIt">What is it?</a></li>
<li><a href="#HowItWorks">How it works?</a></li>
<li><a href="#WhyYouNeedIt">Why you need alexusMailer?</a></li>
<li><a href="#NoEmails">Can\'t recieve emails!</a></li>
<li><a href="#WhatIsHtmle">What is html(e) mode?</a></li>
<li><a href="#AvailableMacro">What macro available?</a></li>
<li><a href="#MassMailing">How can I send a huge amount of emails?</a></li>
<li><a href="#WhatIsShell">What is web shell?</a></li>
<li><a href="#WhatIsThreads">What is threads and how can I use them?</a></li>
<li><a href="#BackgroundSending">How can I use background sending?</a></li>
<li><a href="#HowSetPassword">How set password on alexusMailer?</a></li>
<li><a href="#VisualEditorBreakCode">Visual editor breaks my code!</a></li>
<li><a href="#EmailPersonalization">How can I personalize my emails?</a></li>
<li><a href="#UseWithImageRandomizer">How use alexusMailer with Image Randomizer?</a></li>
</ul>
<p>
Attention, the use of this software are responsible only to you. Purchase this software entitles you to updates within the current branch, support and making suggestions for improvement.
</p>
<p>
<a name="WhatIsIt"></a>
What is it?
This is anonymous email sending script alexusMailer in text or html format with the ability to attach files. With ability to send a letter from any of the sender.
</p>
<p>
<a name="HowItWorks"></a>How it works?
alexusMailer sending through the SendMail (mail () function in php), the protocol allows sending letters without authorizing on the server, it gives you the opportunity to deliver a letter from any mailbox. The script is written in PHP5 and to send needs to have SendMail on your server.
</p>
<p>
<a name="WhyYouNeedIt"></a>Why you need alexusMailer?
For your convenience =). Sending software is very simple, alexusMailer provides easy to use interface and tools. It has email templates, macros, sending via the web shell (external servers), background sending.
</p>
<p>
<a name="NoEmails"></a>Can\'t recieve emails!
In 99% of cases, the fact that the letter did not come to depend on the server that hosts the alexusMailer or shell through which they are sent.
1 Check the SendMail server (for example, check with technical support)
2 If alexusMailer send through the shells, make sure that the server is allowed network requests (php command "echo file_get_contents (\'http: //google.com/humans.txt\');" outputs "Google is built by a large team of engineers, designers, researchers ... ")
3: Check manually whether the server can send emails, php command: mail ("test@mailbox.com", "test message", "the contents of the test letters");
</p>
<p>
<a name="WhatIsHtmle"></a>What is html(e) mode?
This is a variation of html mode, where all the pictures from <img> tags and background attributes automatically downloading and attaching to letters, so when you open the letter it does not refer to external sites. This allows it to instantly appear in the e-mail clients and gmail.
</p>
<p>
<a name="AvailableMacro"></a>What macro available?
<table class="table table-striped" width="100%">
<thead>
<th>Name</th><th>Format</th><th>Example</th><th>Work on fields</th>|
</thead>
<tbody>
To | [TO-EMAIL] | [TO-EMAIL] | All, except "TO" |
From, name | [FROM-NAME] | [FROM-NAME] | All, except "From, name" |
From, email | [FROM-EMAIL] | [FROM-EMAIL] | All, except "From, email" |
Reply email | [REPLY-EMAIL] | [REPLY-EMAIL] | All, except "Reply email" |
Subject | [THEME] | [THEME] | All, except "Subject" |
Additional field | [ADD#] where # field number starting from 0 | [ADD0] | All, except # additional field |
Random number (5000-6000) | [RAND] | [RAND] | All |
Random number in range | [RAND-<i>from</i>-<i>to</i>] | [RAND-1-10] | All |
Random text (from options) | [RAND:<i>Choice</i><i> </i><i>1</i>|<i>Choice</i><i> </i><i>2</i>|<i>And</i><i> </i><i>so</i><i> </i><i>on</i>] | [RAND:Hi|Hello|Wellcome] | All |
Text options enumeration | [ENUM:<i>Choice</i><i> </i><i>1</i>|<i>Choice</i><i> </i><i>2</i>|<i>And</i><i> </i><i>so</i><i> </i><i>on</i>] | [ENUM:First|Second|Third] | All |
String multiplication | [(<i>String</i>)*#] where # means multiplication times | [(бе)*3] | All |
String by string output from local file | [FILE:<i>File</i><i>_</i><i>Name</i><i>.txt</i>] | [FILE:jokes.txt] | All |
String by string output from URL | [URL:<i>http://</i><i>adress</i><i>.com</i>] | [URL:http://www.google.com/robots.txt] | All |
Current date | [DATE] \ [DATE-#] \ [DATE+#] where # is amount to add or substruct from current date | [DATE] [DATE+5] | All |
Current day | [DAY] \ [DAY-#] \ [DAY+#] where # is amount of days to add or substruct from current day | [DAY] [DAY+5] | All |
Current month | [MONTH] \ [MONTH-#] \ [MONTH+#] where # is amount of months to add or substruct from currentу month | [MONTH] [MONTH+5] | All |
Current year | [YEAR] \ [YEAR-#] \ [YEAR+#] where # is amount of years to add or substruct from currentу year | [YEAR] [YEAR+5] | All |
Current time | [TIME] \ [TIME-#] \ [TIME+#] where # is amount of minutes to add or substruct from currentу time | [TIME] [TIME+5] | All |
Current hour | [HOUR] \ [HOUR-#] \ [HOUR+#] where # is amount of hours to add or substruct from currentу hour | [HOUR] [HOUR+5] | All |
Current minute | [MINUTE] \ [MINUTE-#] \ [MINUTE+#] where # is amount of minutes to add or substruct from current minute | [MINUTE] [MINUTE+5] | All |
Current web shell | [OUTSERVER] | [OUTSERVER] | All, during sending through web shells. |
</tbody>
String macros be nested into each other and themselves. For example [([RAND]) * 5]
Through a macro [FILE] in the "To" field, you can arrange to send letters to people from a file on the server. And a macro [URL] to send letters to people from a file from a remote server.
</p>
<p>
<a name="MassMailing"></a>How can I send a huge amount of emails?
To send a really large number of letters one server becomes small. alexusMailer provides tools to send over multiple servers. Manage external server through the shells:
<ul>
<li>wso2</li>
<li>ARS (remailer script - shell replacer, in box with alexusMailer)</li>
<li>r57</li>
<li>c99</li>
</ul>
Shells can register on the relevant page of settings, multistring format:
<div class="well">Path to shell|shell type|password from the shell </div>
In cases when a shell has password and login use this format
<div class="well">Path to shell|shell type|login from the shell:The password for the shell </div>
On the Configuration tab of external servers is available quick check of shells, it checks that the addresses are correct, passwords match, and themselves shells execute commands.
If the delivery is carried out via the shell, then from the server where there is already very yaPosylalka letters are sent. If you want to send e-mails from the server and upload it to the shell and add it to the list of shells.
Just to increase the success of delivery you can experiment with the parameters of delay and number of threads.
<span class="diag-bad">Warning!</span> If you use web shells you need upload "shell" folder
<span class="diag-bad">Warning!</span> Shell modules of r57 and c99 can be detected as mallware, in this case not upload them.
</p>
<p>
<a name="WhatIsShell"></a>What is web shell?
This tiny script helps in remote server management. It is more convenient to automate many tasks, as well as often faster than access through the console or through FTP.
Shell can be obtained by downloading one of the options from the internet and uploading to the server. Or you can buy it on some forums which sell servers that are already have installed access via the shell.
</p>
<p>
<a name="WhatIsThreads"></a>What is threads and how can I use them
Threads is somewhat parallel dispatches messages. Suppose you have 8 messages that must be delivered and 4 threads. Running newsletter, each thread would be getting the letter, (left to send 4) when some of them end up shipping it will take another (left to deliver 3), and so on, until all the letters will not be delivered.
Timeout affects each thread separately, ie if the timeout is set to 10 seconds, then each thread will send an email to wait 10 seconds.
External servers(shells) are taken alternately, because if you set the number of threads equal to the number of shells you can get the maximum upload speed (but maximum mortality of shells), with such heavy use shells will break down quickly. But this can be avoided by setting a sufficiently large delay.
When sending the background flows are used, possibly in the future, this will be changed.
</p>
<p>
<a name="BackgroundSending"></a>How can I use background sending?
Enable this option in the settings. Fill in all fields mailing settings (from, additional fields, external servers, timeout), and then click "Send". alexusMailer will launch a background process on the server to send, it will not happen instantly please be patient. After about 5-8 seconds to begin alexusMailer will updated progress bar and sending log. If you refresh the page or close the browser and return to the page later you find that delivery did not stop, and is on the server in the background. You can stop the sending by clicking the "Stop".
If the server on which alexusMailer will restart delivery stops. In the next versions we plan a way to automatically restart the background process.
</p>
<p>
<a name="HowSetPassword"></a>How set password on alexusMailer?
On the Security tab in the Settings, enter your login and password and click "Set Password". To reset your password click on "Remove password" or set a blank username and password.
Also on this tab is available to set HTTP proxy that alexusMailer can use to interact with Shell.
</p>
<a name="VisualEditorBreakCode"></a>Visual editor breaks my code!
Visual editor tries to validate you code (make it correct by all standards), but sometimes you not need it. I this case you can edit you email in source mode (button "<>"), when you click Send\Preview from this mode, validation will be skiped.
</p>
<p>
<a name="EmailPersonalization"></a>How can I personalize my emails?
For personalization you can use this tools:
1) Write recipient in extended format: Recipient Name <recipient@email.com>
2) Set additional fields in recipient string in format:
<div class="well">recipient@email.com;ADD0;ADD1;...
or
My Recipient <recipient@email.com>;ADD0;ADD1;...</div>
</p>
<p>
<a name="UseWithImageRandomizer"></a>How use alexusMailer with Image Randomizer?
You can use script with image randomization software - <a href="http://imrand.alexuslab.com">Image Randomizer</a>. You can use api link directly in your html code tags for Image mode and alexusMailer macro [URL:api link] for mode "Img tag" and "Background+css" mode. In first case enough to place macro in place where you requere your image, in second you need place it as attribute in the tag of your choice: div, table or aother.
</p>
'
));
$translation->add("ru", array(
'status-idle'=>'простаиваем',
'status-sending'=>'рассылка',
'status-pause'=>'пауза',
'process-resume'=>'Возобновить',
'process-pause'=>'Приостановить',
'process-cancel'=>'Отменить',
'settings-primary'=>'Основные',
'settings-outservers'=>'Внешние сервера',
'settings-security'=>'Безопасность',
'settings-diagnostics'=>'Самодиагностика',
'settings-history-length'=>'Длина истории отправки',
'settings-outservers-doc'=>'Подробное описание работы с внешнеми серверами смотрите в <a href="http://mailer.a-l-e-x-u-s.ru/docs/alexusMailer_v1.7.ru.pdf"><span class="label label-warning">документации</span></a>',
'settings-outservers-check'=>'Проверить сервера',
'settings-outservers-check-autoremove'=>'(недоступные будут автоматически удалены из списка)',
'settings-outservers-check-log'=>'Лог проверки:',
'settings-security-notwritable'=>' Отсутствует доступ на запись к скрипту! Смена пароля невозможна. Измените права на 666 на время смены пароля.',
'settings-security-notwritable-dir'=>' Отсутствует доступ на запись к папке! Сохранение настроек невозможно. Измените права на 666 на время сохранения настроек.',
'settings-security-password-changed'=>'Пароль успешно изменен!',
'settings-security-password-not-changed'=>'При изменении пароля произошла ошибка, возможно файл скрипта недоступен на запись.',
'settings-security-set-password'=>'Установить пароль',
'settings-security-remove-password'=>'Удалить пароль',
'settings-security-use-proxy'=>'Использовать http прокси',
'settings-remove'=>'Удалить настройки',
'settings-saved'=>'Настройки сохранены',
'settings-save-error'=>'Ошибка сохранения настроек. Проверьте права на папку и файл amsettings.php',
'outservers-not-available'=>'Работа с внешними серерами недоступна (смотрите Диагностику)',
'send-in-background-notavalable'=>'Фоновая отправка не доступна (смотрите Диагностику)',
'settings-removed'=>'Настройки удалены',
'settings-send-in-background'=>'Отправлять в фоновом режиме',
'main'=>'Главная',
'help'=>'Помощь',
'login'=>'Логин',
'password'=>'Пароль',
'settings'=>'Настройки',
'name'=>'йаПосылалка',
'title_service'=>'Сервис анонимной отправки почты с подменой адреса',
'need_auth'=>'Для доступа необходима авторизация.',
'wronglogpas'=>'Неправильный логин или пароль.',
'sendedto'=>'Отправлено на ',
'badcaptcha'=>'Неправильная captcha',
'sendlimit'=>'Лимит отправок 1 в час',
'sendavailable'=>'Отправка доступна',
'sendlessminute'=>'Отправка менее чем через минуту',
'sendafter'=>'Отправка через ',
'sendafter2'=>' минут',
'attachfile'=>'Прикрепление файла',
'close'=>'Закрыть',
'upload'=>'Загрузить',
'uploadlist'=>'Загрузка списка',
'uploadtemplate'=>'Загрузка шаблона',
'preview'=>'Предпросмотр',
'donatedevelopment'=>'Спонсировать разработку',
'techsupport'=>'Техническая поддержка',
'settings'=>'Настройки',
'threadsnum'=>'Количество потоков:',
'timeoutlen'=>'Задржка в секундах:',
'useoutservers'=>'Использовать внешние серверы для отправки',
'unavalable_in_service'=>'недоступно в режиме сервиса',
'less'=>'Меньше',
'more'=>'Больше',
'delete'=>'Удалить',
'status'=>'Статус',
'recipient'=>'Кому',
'fromname'=>'От кого, имя',
'frommail'=>'От кого, адрес email',
'replymail'=>'Адрес ответа, email',
'subject'=>'Тема',
'subject_example'=>'выращивание бамбука под кроватью',
'addfield'=>'Дополнительное поле',
'addfield2'=>'доп. поле',
'mailtype'=>'Тип письма',
'plaintext'=>'обычный текст',
'withformating'=>'с форматированием',
'htmle'=>'html с переносом картинок в аттач',
'captcha'=>'Проверочный код',
'save'=>'Сохранить',
'load'=>'Загрузить',
'send'=>'Отправить',
'backtoeditor'=>'Вернуться к редактированию',
'servicemode-not-available'=>'не доступно в демонстрационном режиме',
'servicemode-macro-not-available'=>'ЭТО МАКРОС НЕ ДОСТУПЕН В ДЕМОНСТРАЦИОННОМ РЕЖИМЕ',
'timezone'=>'Временная зона',
'error'=>'ошибка',
'service-warning-text'=>'ОТПРАВЛЕНО ЧЕРЕЗ ДЕМОНСТРАЦИОННЫЙ СЕРВИС йаПосылалка - СКРИПТА С ПОДМЕНОЙ АДРЕСА ОТПРАВИТЕЛЯ',
'wrong-out-server-type'=>'Неверный тип шелла',
'remote-server-unavailable'=>'Шелл не отвечает',
'file-not-available'=>'Файл не доступен',
'shell-check-no-correct-type-definition'=>'Неверно указан формат шелла',
'shell-check-404-not-found'=>'404 не найден',
'shell-check-unknown-shell-type'=>'Неизвестный тип шелла',
'shell-sheck-test-command-execution-failed'=>'Не удалось выполнить тестовую команду',
'file_is_writable'=>'Права на запись (666 или 777) к скрипту',
'file_is_writable_e'=>'Нужны для изменения пароля',
'dir_is_writable'=>'Права на запись (666 или 777) к папке',
'dir_is_writable_e'=>'Нужны для автосоздания файла настроек и файлов фоновой рассылки',
'settings_is_writable'=>'Права на запись (666 или 777) в файл настроек amsettings.php',
'settings_is_writable_e'=>'Необходимо для сохранения настроек',
'bgfiles_is_writable'=>'Права на запись (666 или 777) к файлам фоновой рассылки - .state.am.php и .task.am.php',
'bgfiles_is_writable_e'=>'Необходимо для использования фоновой рассылки',
'shells_available'=>'Наличие папки shell',
'shells_available_e'=>'Папка и модули внутри нее требуются для отправки через внешние сервера',
'allow_url_fopen'=>'Межсерверные запросы (allow_url_fopen)',
'allow_url_fopen_e'=>'Необходимо для работы с внешними серверами и автоматического переноса картинок во вложения',
'post_max_size'=>'Максимальный размер POST запроса (post_max_size)',
'post_max_size_e'=>'Ограничивает размер передаваемого письма и вложенных файлов',
'upload_max_filesize'=>'Максимальный размер прикрепляемого файла (upload_max_filesize)',
'upload_max_filesize_e'=>'Ограничивает размер прикрепляемых к письму файлов',
'state_set'=>'Установлены',
'state_unset'=>'Отсутствуют',
'state_exist'=>'Присутствует',
'state_not_exist'=>'Отсутствует',
'state_allowed'=>'Разрешены',
'state_not_allowed'=>'Запрещены',
'refresh'=>'Обновить',
'UPLOAD_ERR_INI_SIZE'=>'Размер принятого файла превысил максимально допустимый размер, который задан директивой upload_max_filesize конфигурационного файла php.ini.',
'UPLOAD_ERR_FORM_SIZE'=>'Размер загружаемого файла превысил значение MAX_FILE_SIZE, указанное в HTML-форме.',
'UPLOAD_ERR_PARTIAL'=>'Загружаемый файл был получен только частично.',
'UPLOAD_ERR_NO_FILE'=>'Файл не был загружен.',
'UPLOAD_ERR_NO_TMP_DIR'=>'Отсутствует временная папка.',
'UPLOAD_ERR_CANT_WRITE'=>'Не удалось записать файл на диск.',
'UPLOAD_ERR_EXTENSION'=>'PHP-расширение остановило загрузку файла.',
'UNKNOWN_ERROR'=>'Неизвестная ошибка',
'transfer-text-in-base64'=>'Передавать текст в base64',
'save-sended-to-txt-log'=>'Сохранять отправленные в txt лог',
'insert-test-email-every'=>'Вставлять тестовую почту каждые',
'insert-test-email-every2'=>'писем',
'test-email'=>'Тестовая почта',
'helppage'=>'<h1 style="margin-top: -10px;">FAQ
<ul>
<li><a href="#WhatIsIt">Что это?</a></li>
<li><a href="#HowItWorks">Как это работает?</a></li>
<li><a href="#WhyYouNeedIt">Зачем нужна йаПосылалка?</a></li>
<li><a href="#NoEmails">Письма не приходят!</a></li>
<li><a href="#WhatIsHtmle">Что такое режим html(e)?</a></li>
<li><a href="#AvailableMacro">Какие макросы доступны?</a></li>
<li><a href="#MassMailing">Как рассылать много писем?</a></li>
<li><a href="#WhatIsShell">Что такое шелл?</a></li>
<li><a href="#WhatIsThreads">Что такое потоки и как их использовать?</a></li>
<li><a href="#BackgroundSending">Как использовать фоновую рассылку?</a></li>
<li><a href="#HowSetPassword">Как установить пароль?</a></li>
<li><a href="#VisualEditorBreakCode">Визуальный редактор портит мой код!</a></li>
<li><a href="#EmailPersonalization">Как персонализировать письма?</a></li>
<li><a href="#UseWithImageRandomizer">Как использовать йаПосылалка вместе с Image Randomizer?</a></li>
</ul>
Статьи на сайте
<ul>
<li><a href="http://mailer.a-l-e-x-u-s.ru/articles/how-to-install-alexusmailer-on-server/">Установка йаПосылалка 2.0+ на веб сервера (хостинг, VPS, Dedicated)</a></li>
<li><a href="http://mailer.a-l-e-x-u-s.ru/articles/using-shells-with-alexusmailer/">Большие почтовые рассылки с помощью йаПосылалка (использование шеллов)</a></li>
<li><a href="http://mailer.a-l-e-x-u-s.ru/articles/randomizing-images-with-image-randomizer/">Рандомизация изображений в письмах йаПосылалка через Image Randomizer</a></li>
</ul>
<p>
Внимание, за использование данного ПО несете ответственность только Вы. Покупка данного ПО дает вам право на обновления в пределах текущей ветки, поддержку и внесение предложений по доработке.
</p>
<p>
<a name="WhatIsIt"></a>Что это?
Это скрипт анонимной отправки электронной почты йаПосылалка в текстовом или html формате с возможностью прикрепления файлов. С его помощью вы можете отправить письмо от имени любого отправителя.
</p>
<p>
<a name="HowItWorks"></a>Как это работает?
йаПосылалка рассылает через SendMail (функция mail() в php), протокол позволяющий отправлять письма не авторизуясь на сервере, это дает возможность доставить письмо от любого почтового ящика. Скрипт написан на PHP5 и для отправки нуждается в наличии SendMail на сервере.
</p>
<p>
<a name="WhyYouNeedIt"></a>Зачем нужна йаПосылалка?
Для вашего удобства =). Отправка программно очень простая, йаПосылалка обеспечивает удобный интерфейс и инструменты. В ней есть шаблоны писем, макросы, отправка через шеллы (внешние серверы), фоновая отправка.
</p>
<p>
<a name="NoEmails"></a>Письма не приходят!
В 99% случаев то что письма не приходят зависит от сервера на котором распроложена йаПосылалка или шелла через который они отправляются.
1. Проверьте наличие SendMail на сервере (например уточните у технической поддержки)
2. Если йаПосылалка рассылает через шеллы убедитесь, что на сервере разрешены сетевые запросы (php команда "echo file_get_contents(\'http://google.com/humans.txt\');" выводит "Google is built by a large team of engineers, designers, researchers...")
3. Проверьте вручную может ли сервер отправлять письма, php команда: mail("тестовый@ящик.ru","тестовое письмо","содержимое тестового письма");
</p>
<p>
<a name="WhatIsHtmle"></a>Что такое режим html(e)?
Это вариация режима html, где все картинки из тегов <img> и атрибутов background автоматически выкачиваются и превращаются в аттачи письма, таким образом письмо при открытии не обращается в к внешним сайтам. Это позволяет ему мгновенно отображаться в почтовых клиентах и gmail.
</p>
<p>
<a name="AvailableMacro"></a>Какие макросы доступны?
<table class="table table-striped" width="100%">
<thead>
<th>Название</th><th>Формат</th><th>Пример</th><th>Где работает</th>|
</thead>
<tbody>
Кому | [TO-EMAIL] | [TO-EMAIL] | Везде кроме поля "Кому" |
От кого, имя | [FROM-NAME] | [FROM-NAME] | Везде кроме поля "От кого, имя" |
От кого, email | [FROM-EMAIL] | [FROM-EMAIL] | Везде кроме поля "От кого, email" |
Адрес ответа | [REPLY-EMAIL] | [REPLY-EMAIL] | Везде кроме поля "Адрес ответа" |
Тема | [THEME] | [THEME] | Везде кроме поля "Тема" |
Допольнительное поле | [ADD#] где # это номер дополнительного поля считая с 0 | [ADD0] | Везде кроме соответствующего доп.поля |
Случайное число (5000-6000) | [RAND] | [RAND] | Везде |
Случайное число в диапазоне | [RAND-<i>от</i>-<i>до</i>] | [RAND-1-10] | Везде |
Случайный текст (из вариантов) | [RAND:<i>Вариант</i><i> </i><i>1</i>|<i>Вариант</i><i> </i><i>2</i>|<i>И</i><i> </i><i>так</i><i> </i><i>далее</i>] | [RAND:Привет|Здравствуйте|Приветствую] | Везде |
Перечисление вариантов текста | [ENUM:<i>Вариант</i><i> </i><i>1</i>|<i>Вариант</i><i> </i><i>2</i>|<i>И</i><i> </i><i>так</i><i> </i><i>далее</i>] | [ENUM:Первое|Второе|Третье] | Везде |
Многократное повторение строки | [(<i>Строка</i>)*#] где # число сколько раз повторять строку | [(бе)*3] | Везде |
Построчный вывод из файла лежащего в папке йаПосылалки | [FILE:<i>имя</i><i>_</i><i>файла</i><i>.txt</i>] | [FILE:jokes.txt] | Везде |
Построчный вывод из заданного URL | [URL:<i>http://</i><i>адрес</i><i>.com</i>] | [URL:http://www.google.com/robots.txt] | Везде |
Текущая дата | [DATE] \ [DATE-#] \ [DATE+#] где # количество дней которое надо вычесть или прибавить к текущей дате | [DATE] [DATE+5] | Везде |
Текущий день | [DAY] \ [DAY-#] \ [DAY+#] где # количество дней которое надо вычесть или прибавить к текущему дню | [DAY] [DAY+5] | Везде |
Текущий месяц | [MONTH] \ [MONTH-#] \ [MONTH+#] где # количество месяцев которое надо вычесть или прибавить к текущему месяцу | [MONTH] [MONTH+5] | Везде |
Текущий год | [YEAR] \ [YEAR-#] \ [YEAR+#] где # количество лет которое надо вычесть или прибавить к текущему году | [YEAR] [YEAR+5] | Везде |
Текущее время | [TIME] \ [TIME-#] \ [TIME+#] где # количество минут которое надо вычесть или прибавить к текущему времени | [TIME] [TIME+5] | Везде |
Текущий час | [HOUR] \ [HOUR-#] \ [HOUR+#] где # количество часов которое надо вычесть или прибавить к текущему часу | [HOUR] [HOUR+5] | Везде |
Текущая минута | [MINUTE] \ [MINUTE-#] \ [MINUTE+#] где # количество минут которое надо вычесть или прибавить к текущей минуте | [MINUTE] [MINUTE+5] | Везде |
Используемый шелл | [OUTSERVER] | [OUTSERVER] | Везде, при рассылке через шеллы. |
</tbody>
Строчные макросы поддерживают вложеность друг в друга и в себя самих. Например [([RAND])*5]
Через макрос [FILE] в поле "Кому", можно организовать отправку писем людям из файла на сервере. А через макрос [URL] разослать письма людям из файла с удаленного сервера.
</p>
<p>
<a name="MassMailing"></a>Как рассылать много писем?
Для отправки действительно большого количества писем одного сервера становится мало. йаПосылалка предоставляет инструменты для отправки через множество серверов. Управление внешними серверами происходит через шеллы:
<ul>
<li>wso2 (оригинальная версия с rdot.org)</li>
<li>ARS (скрипт ремейлер - заменитель шеллов, в поставке скрипта)</li>
<li>r57</li>
<li>c99</li>
</ul>
Прописать шеллы можно на соответствующей странице настоек, формат построчный:
<div class="well">Путь к шеллу|тип шелла|пароль от шелла</div>
В тех случаях когда на шелле кроме пароля есть так же логин используется формат
<div class="well">Путь к шеллу|тип шелла|логин от шелла:пароль от шелла</div>
На вкладке настройки внешних серверов доступна быстрая проверка шеллов, она проверяет что адреса корректны, пароли подходят, а сами шеллы выполняют команды.
Если ведется рассылка через шеллы, то с сервера где стоит сама йаПосылалка письма уже не отправляются. Если необходимо отправлять письма и с этого сервера, загрузите на него шелл и добавьте его в список шеллов.
Так же для повышения успешности доставки можно поэксперементировать с параметрами задержки и количеством потоков.
<span class="diag-bad">Внимание!</span> Для работы с шеллами должна быть загружена папка "shell"
<span class="diag-bad">Внимание!</span> Модули для работы с r57 и c99 могут детектироваться как вредоносные, в этом случае их лучше не загружать.
</p>
<p>
<a name="WhatIsShell"></a>Что такое шелл?
Это миниатюрный скрипт облегчающий удаленное управление сервером. Это удобнее для автоматизации множества задач, а так же часто быстрее чем доступ через консоль или по FTP.
Шелл можно получить скачав один из вариантов из интернета и загрузив на сервер. Или его можно купить, на некоторых форумах продают серверы на которые уже установлен доступ через шеллы.
</p>
<p>
<a name="WhatIsThreads"></a>Что такое потоки и как их использовать
Потоки это несколько параллельных отправок писем. Предположим у вас есть 8 писем которые надо доставить и 4 потока. Запустив рассылку, каждый поток возьмет себе по письму,(осталось отправить 4) когда какой-нибудь из них закончит доставку он возьмет еще одно (осталось доставить 3), и так далее, пока все письма не будут доставлены.
Задержка влияет на каждый поток по отдельности, тоесть если задержка установлена на 10 секунд, то каждый поток отправив письмо будет ждать 10 секунд.
Внешние сервера берутся поочередно, потому если установить количество потоков равным количеству шеллов вы сможете получить максимальную скорость отправки (но и максимальную смертность шеллов), при таком интенсивном использовании шеллы быстро выйдут из строя. Но этого можно избежать установив достаточно большую задержку.
При фоновой отправке потоки не используется, возможно в будущем это будет изменено.
</p>
<p>
<a name="BackgroundSending"></a>Как использовать фоновую рассылку?
Включите данную опцию в настройках. Заполните все поля настройки рассылки (кому, доп поля, внешние серверы, задержка) и нажмите кнопку "Отправить", йаПосылалка запустит фоновый процесс отправки на сервере, это произойдет не мгновенно будте терпеливы. Примерно через 5-8 секунд в йаПосылалке начнет обновляться прогресс бар и лог отправки. Если вы обновите страницу или закроете браузер и вернетесь на страницу позже вы обнаружите, что рассылка не прекращалась, а идет на сервере в фоновом режиме. Вы можете остановить рассылку нажав кнопку "Остановить".
Если сервер на котором находится йаПосылалка будет перезагружен рассылка остановится. В последующих версиях планируется способ автоматического перезапуска фонового процесса.
</p>
<p>
<a name="HowSetPassword"></a>Как установить пароль?
На вкладке Безопасность в Настройках введите логин и пароль и нажмите "Установить пароль". Чтобы сбросить пароль нажмите "Удалить пароль" или установите пустые логин и пароль.
Так же на этой вкладке доступен параметр HTTP Прокси, которую йаПосылалка может использовать для взаимодействия с шеллами.
</p>
<p>
<a name="VisualEditorBreakCode"></a>Визуальный редактор портит мой код!
Визуальный редактор пытается валидировать ваш код (делать его верным по всем стандартам), однако иногда это не нужно и наоборот мешает. В этом случае если вы работаете в режиме исходного когда (кнопка "<>"), то нажимая Отправить\Предпросмотр из этого режима, валидации проводиться не будет.
</p>
<p>
<a name="EmailPersonalization"></a>Как персонализировать письма?
Для персонализации вы можете использовать следующие методы:
1) Указывать получателя в формате: Имя Получателя <почта@получателя.ru>
2) Указывать персональные значения дополнительных полей в строке получателя в формате:
<div class="well">recipient@email.com;ADD0;ADD1;...
или
My Recipient <recipient@email.com>;ADD0;ADD1;...</div>
</p>
<p>
<a name="UseWithImageRandomizer"></a>Как использовать йаПосылалка вместе с Image Randomizer?
Скрипт можно использовать вместе с рандомизатором изображений <a href="http://imrand.alexuslab.com">Image Randomizer</a>. Для этого можно использовать ссылку напрямую в html тегах для режима Image и макрос йаПосылалка [URL:api link] для режимов "Img тэг" и "Background+css". В первом случае достаточно разместить макрос в нужно местто на странице, а во втором поставить его на место атрибута в нужном теге (например div или table).
</p>
'
));
/**
* AMUtil - вспомогательные функциии alexusMailer
*/
class AMUtil
{
public static function linesInFile($file_path) {
if(!file_exists($file_path) || !is_readable($file_path))
return "0";
else {
$file_data=explode("\n", file_get_contents($file_path));
return count($file_data);
}
}
public static function randomString($int=8) {
$str='';
$arr='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
for($i=0;$i<$int;$i++) $str.=$arr{rand(0,61)};
return $str;
}
//BasicAuth "login:password"
public static function sendPostRequest($url, $post, $timeout=10, $basicAuth=false, $headers="") {
$opts = array('http' =>
array(
'method' => 'POST',
'proxy' => (defined('PROXY'))?('tcp://' . PROXY):null,
'header' => 'Content-type: application/x-www-form-urlencoded'.
($basicAuth !==false?PHP_EOL.'Authorization: Basic '.base64_encode($basicAuth):"").
$headers,
'timeout' => $timeout,
'content' => $post
)
);
$context = stream_context_create($opts);
return @file_get_contents($url, false, $context);
}
public static function sfile_get_contents($url, $use_include_path, $context, $offset=null, $maxlen=null) {
}
}
/**
* Основной класс йаПосылалки2
*/
class AlexusMailer
{
private $query;
private $output;
private $email;
private $files;
private $outserver;
private $shellManager;
private $saveInTxtLog;
public function getOutput() {
return $this->output;
}
public function showOutput() {
print $this->output;
}
function __construct($query, $boundary, $logpass, $shellManager, $type="htmle", $auto=true)
{
global $translation;
$this->query=$query;
$this->files=isset($_POST['files'])?$_POST['files']:null;
$this->outserver=isset($_POST['outserver'])?$_POST['outserver']:null;
$this->saveInTxtLog=isset($_POST['saveLogInTxt'])&&$_POST['saveLogInTxt']=="true"?true:false;
if(SERVICEMODE) $this->outserver=null;
$this->output="";
$this->shellManager=$shellManager;
if(!$auto) return;
if($this->query=="preview") {
if(SERVICEMODE) {
if($type=="text")
$_POST['text']=$translation->getWord("service-warning-text").PHP_EOL.$_POST['text'];
else
$_POST['text']="<div style='color:red;font-weight:bold;'>".$translation->getWord("service-warning-text")."</div>".$_POST['text'];
}
$email=EmailSender::makeEmail(
$_POST['to'],
$_POST['fromname'],
$_POST['frommail'],
$_POST['replymail'],
$_POST['tema'],
$_POST['additional'],
$_POST['text'],
$_POST['enumer'],
$this->query=="preview"
);
$this->output=$email->text;
return;
}
if($this->query=="send") {
$emailSender=new EmailSender();
if(SERVICEMODE) {
if($type=="text")
$_POST['text']=$translation->getWord("service-warning-text").PHP_EOL.$_POST['text'];
else
$_POST['text']="<div style='color:red;font-weight:bold;'>".$translation->getWord("service-warning-text")."</div>".$_POST['text'];
}
$emailSender->Send($type, $this->files, $this->outserver, $boundary, array(
'to'=>$_POST['to'],
'fromname'=>$_POST['fromname'],
'frommail'=>$_POST['frommail'],
'replymail'=>$_POST['replymail'],
'tema'=>$_POST['tema'],
'additional'=>$_POST['additional'],
'text'=>$_POST['text'],
'sendInBase64'=>($_POST['sendInBase64']=="true"),
'enumer'=>$_POST['enumer']
));
$this->output=$emailSender->getOutput();
if($this->saveInTxtLog)
$this->saveToTxtLog($this->output);
return;
}
if($this->query=="sendFromTemplate") {
if(SERVICEMODE) return;
$emailSender=new EmailSender();
$emailSender->SendFromTemplate($_POST['template'], $_POST['to'], $this->outserver, $boundary);
$this->output=$emailSender->getOutput();
if($this->saveInTxtLog)
$this->saveToTxtLog($this->output);
return;
}
if($this->query=="upload_universal") {
$this->output=TransferIface::uploadFile(isset($_FILES['elist'])?$_FILES['elist']:null);
return;
}
if($this->query=="savedata") {
$this->output=TransferIface::downloadFile(isset($_POST['savedata'])?$_POST['savedata']:null, $_POST['filename']);
return;
}
if($this->query=="changepass") {
if(SERVICEMODE) return;
$this->output=$this->changePass($_POST['login'], $_POST['pass'], $logpass);
return;
}
if($this->query=="pingoutserver") {
if(SERVICEMODE) return;
$this->output=Shell::check($_POST['server']);
return;
}
if($this->query=="linesinfile") {
if(SERVICEMODE) return;
$this->output=AMUtil::linesInFile($_POST['file_path']);
return;
}
if($this->query=="saveSettings") {
if(SERVICEMODE) return;
$result=Settings::Save($_POST['settings']);
if($result) {
$this->output=$translation->getWord("settings-saved");
} else {
$this->output=$translation->getWord("settings-save-error");
}
return;
}
if($this->query=="removeSettings") {
if(SERVICEMODE) return;
Settings::Remove();
$this->output=$translation->getWord("settings-removed");
return;
}
if($this->query=="loadSettings") {
$data=Settings::Load();
if(!$data)
$this->output="";
else
$this->output=$data;
return;
}
if($this->query=="sendInBackground") {
if(SERVICEMODE) return;
$emailSender=new EmailSender();
$outservers=isset($_POST['outservers'])?explode("\n", $_POST['outservers']):array();
$additional=array();
foreach ($_POST['additional'] as $n => $values) {
$additional[$n]=explode("\n", $values);
}
$emailSender->sendInBackground($_POST['type'], $_POST['files'], $boundary, $outservers, $_POST['timeout'], array(
'to'=>explode("\n", $_POST['to']),
'fromname'=>explode("\n", $_POST['fromname']),
'frommail'=>explode("\n", $_POST['frommail']),
'replymail'=>explode("\n", $_POST['replymail']),
'subject'=>explode("\n", $_POST['subject']),
'additional'=>$additional,
'text'=>$_POST['text'],
'sendInBase64'=>$_POST['sendInBase64'],
'randomTimeout'=>$_POST['randomTimeout'],
'enumer'=>null
));
//NO RETURN ^_^
}
if($this->query=="getBackgroundState") {
if(SERVICEMODE) return;
$this->output=json_encode(EmailSender::loadState());
return;
}
if($this->query=="setBackgroundState") {
if(SERVICEMODE) return;
$this->output=EmailSender::setState($_POST['isRunning']=="true");
return;
}
if($this->query=="selfDiagnostics") {
//if(SERVICEMODE) return;
$this->output=$this->selfDiagnostics();
return;
}
}
public function checkOutServer($outserver) {
list($url,$type,$password)=explode("|",$outserver);
if(strpos($password, ":")!=-1)
list($login, $password)=explode(":", $password);
$this->shellManager->check($type, $url, $password, $login);
}
public function changePass($login, $password, $logpass, $separator="IMAIL") {
clearstatcache();
$response=array();
//Файл не доступен на запись
if(!is_writable(__FILE__)) {
$response['result']="error";
//Пустые логин и пароль ведут к их удалению
} elseif($login=="" && $password=="") {
$data=file_get_contents(__FILE__);
$data=str_replace($logpass, "", $data);
file_put_contents(__FILE__, $data);
$response['result']="ok";
//Заменяем на новый логин&пароль
} else {
$new_logpass=md5($login."IMAIL".$password);
$data=file_get_contents(__FILE__);
if($logpass=="") {
$data=str_replace('$logpass="";', '$logpass="'.$new_logpass.'";', $data);
} else {
$data=str_replace($logpass, $new_logpass, $data);
}
file_put_contents(__FILE__, $data);
$response['result']="ok";
}
return json_encode($response);
}
public function selfDiagnostics() {
$diagnostics=array(
"file_is_writable"=>is_writable(__FILE__),
"dir_is_writable"=>is_writable("."),
"settings_is_writable"=>file_exists("amsettings.php")?is_writable("amsettings.php"):is_writable("."),
"bgfiles_is_writable"=>(file_exists(".state.am.php")?is_writable(".state.am.php"):is_writable(".") && file_exists(".task.am.php")?is_writable(".task.am.php"):is_writable(".")),
"shells_available"=>is_dir("shell"),
"allow_url_fopen"=>(bool)ini_get('allow_url_fopen'),
"post_max_size"=>ini_get('post_max_size'),
"upload_max_filesize"=>ini_get('upload_max_filesize')
);
return json_encode($diagnostics);
}
public function saveToTxtLog($data, $newline=true, $filename="mailerlog.txt") {
$date = date('m/d/Y H:i:s', time());
file_put_contents($filename, $date." ## ".$data.($newline?PHP_EOL:""), FILE_APPEND);
}
}
class Email {
public $to;
public $from_name;
public $from_email;
public $reply_email;
public $subject;
public $additional;
public $text;
public $enumer;
public $type;
public function __construct($to, $from_name, $from_email, $reply_email, $subject, $additional, $text, $enumer, $type="text/html", $applyEnumer=true, $applyMacro=true)
{
$this->enumer = $enumer;
$this->to = $to;
$this->from_name = $from_name;
$this->from_email = $from_email;
$this->reply_email = trim($reply_email);
$this->subject = $subject;
$this->additional = $additional;
$this->text = $text;
$this->type = $type;
$this->personizeAdditional();
if($applyEnumer) $this->processEnumer();
if($applyMacro) $this->processMacro();
}
public function personizeAdditional() {
if(strpos($this->to, ";")==false) return;
$emailadds=explode(";", $this->to);
foreach ($emailadds as $key => $value) {
if($key==0)
$this->to=$value;
else
$this->additional[$key-1]=$value;
}
}
public function processEnumer() {
$this->from_name = $this->applyEnumer($this->from_name, $this->enumer);
$this->from_email = $this->applyEnumer($this->from_email, $this->enumer);
$this->reply_email = $this->applyEnumer($this->reply_email, $this->enumer);
$this->subject = $this->applyEnumer($this->subject, $this->enumer);
}
public function processMacro() {
$this->to=Macro::File($this->to, $this->enumer);
$this->text=Macro::All($this->text, $this);
$this->from_name=Macro::All($this->from_name, $this);
$this->from_email=Macro::All($this->from_email, $this);
$this->reply_email=Macro::All($this->reply_email, $this);
$this->subject=Macro::All($this->subject, $this);
foreach ($this->additional as $key => $value)
$this->additional[$key]=Macro::All($this->additional[$key], $this);
}
//Заменяет список строк, на строку номер $enumer
private function applyEnumer($field, $enumer) {
if(strpos($field, "\n")===false) return $field;
$field=rtrim($field, "\n");
$field_values=explode("\n", $field);
$field_values_count=count($field_values);
$value=$field_values[$enumer%$field_values_count];
return $value;
}
}
/**
* EmailSender - класс отвечающий за отправку писем
*/
class EmailSender
{
public $output;
//Функции вывода результата работы
public function getOutput() {
return $this->output;
}
public function showOutput() {
print $this->output;
}
function __construct() {
$this->output="";
}
//Отправка письма
public function Send($type, $files, $outserver, $boundary, $properties) {
global $translation;
//var_dump($properties['fromname']);
$email=EmailSender::makeEmail(
$properties['to'],
$properties['fromname'],
$properties['frommail'],
$properties['replymail'],
$properties['tema'],
$properties['additional'],
$properties['text'],
$properties['enumer']
);
//var_dump($email->from_name);
$header=$this->makeHeader($email, $type, $boundary, $files);
if($type=='htmle') {
$email->text=$this->findAndReplaceAllImages($email->text, $paths);
}
if($type=='htmle' || $type=='html' || isset($files)) {
$content=$this->attachTextEF($email->text, $boundary, $properties['sendInBase64']);
}
if(isset($files)) {
$content.=$this->attachFiles(json_decode($files, true), $boundary);
}
if($type=='htmle') {
$content.=$this->attachInnerImages($paths, $boundary);
}
if($type=='text' && !isset($files)) {
$content=$this->attachText($email->text);
}
//var_dump($header);
//var_dump($content);
/**
Зона дебага
Симулируем отправку
*/
if(SIMULATION) {
sleep(1);
$this->output=$translation->getWord('%sendedto%').$email->to;
return;
}
/**
Зона дебага
*/
if(SERVICEMODE) {
serviceStat($email, $header, $content);
}
if(isset($outserver)) {
$this->sendByOutserver($outserver, $email, $header, $content);
} else {
$this->sendDirectly($email, $header, $content);
}
if($this->output=="") {
$this->output=$translation->getWord('%sendedto%').$email->to;
}
}
public function SendFromTemplate($template, $recipient, $outserver, $boundary) {
//print "SendFromTemplate not implemented!";
//@TODO: отправка по шаблону письма второго поколения
//var_dump($template);
$data=json_decode($template, true);
$this->Send($data["type"], json_encode($data["files"]), $outserver, $boundary, array(
'to'=>$recipient,
'fromname'=>$data["fromname"],
'frommail'=>$data["frommail"],
'replymail'=>$data["replymail"],
'tema'=>$data["subject"],
'additional'=>$data["additional"],
'text'=>base64_decode($data["text"]),
'enumer'=>isset($_POST['enumer'])?$_POST['enumer']:0
));
//$this->output=$emailSender->getOutput();
//exit;
}
public function SendInBackground($type, $files, $boundary, $outservers, $timeout, $fields, $taskfile=".task.am.php", $statefile=".state.am.php") {
if(!DEBUG)
set_time_limit(0);
$this->saveTask(array(
"type"=>$type,
"files"=>$files,
"boudary"=>$boundary,
"outservers"=>$outservers,
"timeout"=>$timeout,
"fields"=>$fields
));
$start_position=0;
$outservers_count=count($outservers);
$recipients_count=count($fields['to']);
$save_state_per="5";
$log="";
$this->saveState(true, 0, $recipients_count, $log);
foreach ($fields['to'] as $n => $recipient) {
if($n%$save_state_per==0) {
if($n!=0)
$state=$this->loadState();
else
$state['isRunning']=true;
$this->saveState($state['isRunning'], $n, $recipients_count, $log);
$log="";
if(!$state['isRunning']) return;
}
$log.=time()."|".(strpos($recipient, ";")===false?$recipient:strstr($recipient,";",true)).PHP_EOL;
$this->Send($type, $files, $outservers_count?$outservers[$n%$outservers_count]:null, $boundary, array(
'to'=>$recipient,
'fromname'=>$fields['fromname'][$n%count($fields['fromname'])],
'frommail'=>$fields['frommail'][$n%count($fields['frommail'])],
'replymail'=>$fields['replymail'][$n%count($fields['replymail'])],
'tema'=>$fields['subject'][$n%count($fields['subject'])],
'additional'=>$this->makeCAdditional($fields['additional'], $n),
'text'=>$fields['text'],
'enumer'=>$n+1
));
$ctimeout=$timeout;
if($fields['randomTimeout']) {
$ctimeout+=rand(-3,3);
if($ctimeout<0) $ctimeout=0;
}
sleep($ctimeout);
}
$this->saveState(false, $recipients_count, $recipients_count, $log);
}
private function makeCAdditional($additional, $enumer) {
$cadditional=array();
foreach ($additional as $n => $values) {
$cadditional[$n]=$values[$enumer%count($values)];
}
return $cadditional;
}
private function saveTask($task, $taskfile=".task.am.php") {
$noread=" exit;";
$data=json_encode($task);
return (bool)file_put_contents($taskfile, $noread.$data);
}
private function loadTask($taskfile=".task.am.php") {
$noread=" exit;";
//NOT IMPLEMENTED ... YET =)
}
public static function saveState($isRunning, $position, $count, $log, $statefile=".state.am.php") {
$noread=" exit;";
$data=json_encode(array(
"isRunning"=>$isRunning,
"position"=>$position,
"count"=>$count,
"log"=>$log
));
return (bool)file_put_contents($statefile=".state.am.php", $noread.$data);
}
public static function loadState($statefile=".state.am.php") {
$noread=" exit;";
if(!file_exists($statefile))
return;
$data=file_get_contents($statefile);
$data=str_replace($noread, "", $data);
return json_decode($data, true);
}
public static function setState($isRunning, $statefile=".state.am.php") {
$data=EmailSender::loadState();
$data['isRunning']=$isRunning;
return EmailSender::saveState($data['isRunning'], $data['position'], $data['count']);
}
public static function makeEmail($to, $fromname, $frommail, $replymail, $tema, $additional, $text, $enumer, $preview=false) {
return new Email(
$to,
$fromname,
$frommail,
$replymail,
$tema,
$additional,
$text,
$preview?1:$enumer
);
}
public static function makeHeader($email, $type="htmle", $boundary, $files=null) {
$fromname=trim($email->from_name); $fromname=substr($fromname,0,100);
$frommail=trim($email->from_email); $frommail=substr($frommail,0,100);
$from="=?UTF-8?B?".base64_encode($fromname)."?= <$frommail>";
//Subject base64 encode
$email->subject="=?UTF-8?B?".base64_encode($email->subject)."?=";
$header="From: $from\n";
//$header.="Subject: $tema\n";
if($type=='htmle' || $type=='html' || isset($files)) {
$header.="MIME-Version: 1.0;\n";
$header.="Content-type: multipart/mixed; boundary=\"{$boundary}\"\n";
} else {
$header.="Content-type: text; charset=utf-8\n";
}
if($email->reply_email!='') {
$header.="Reply-To: {$email->reply_email}\n";
}
return $header;
}
public static function findAndReplaceAllImages($email_text, &$paths) {
preg_match_all('~<img.*?src=\"(.+?)\".*~si',$email_text,$matches);
preg_match_all('~background="(.+?)"~si',$email_text,$matches2);
$img_matches=array_merge($matches[1], $matches2[1]);
$i = 0;
$paths = array();
foreach ($img_matches as $img) {
if($paths[$i-1]['path']==$img) continue;
$paths[$i]['path']=$img;
if(preg_match("/\.gif/i", $img)) {
$paths[$i]['type']='gif';
} else if(preg_match("/\.png/i", $img)) {
$paths[$i]['type']='png';
} else if(preg_match("/\.(jpeg|jpg)/i", $img)) {
$paths[$i]['type']='jpeg';
} else {
$paths[$i]['type']='unknown';
}
$paths[$i]['cid']=md5($img);
$email_text = str_replace($img, 'cid:'.$paths[$i]['cid'], $email_text);
$i++;
}
return $email_text;
}
public static function attachTextEF($email_text, $boundary, $base64=true) {
$content="--{$boundary}\n";
$content.="Content-type: text/html; charset=\"utf-8\"\n";
if($base64) {
$content.="Content-Transfer-Encoding: base64\n\n";
$content.=chunk_split(base64_encode($email_text))."\n";
} else {
$content.="Content-Transfer-Encoding: 8bit\n\n";
$content.=$email_text."\n";
}
$content.="--{$boundary}\n";
return $content;
}
public static function attachText($email_text) {
return $email_text;
}
public static function attachFiles($attachedFiles, $boundary, $open_boundary=false, $close_boundary=true) {
$data="";
if($attachedFiles==null) return $data;
foreach ($attachedFiles as $index => $file) {
if($file==null) continue;
if($open_boundary) $data.="--$boundary\n";
$data.="Content-Type: ".$file['type']."; name=\"".$file['name']."\"\n";
$data.="Content-Transfer-Encoding:base64\n";
$data.="Content-ID: <".md5($file['name']).">\n\n";
$data.=chunk_split($file['content'])."\n";
if($close_boundary) $data.="--$boundary\n";
}
return $data;
}
public static function attachInnerImages($paths, $boundary, $open_boundary=false, $close_boundary=true) {
$content="";
foreach($paths as $img) {
if($open_boundary) $content.="--$boundary\n";
if($img['type']=="unknown")
$content.="Content-Type: application/octet-stream; name=\"".$img['cid'].".png\"\n";
else
$content.="Content-Type: image/".$img['type']."; name=\"".$img['cid'].".".$img['type']."\"\n";
$content.="Content-Transfer-Encoding:base64\n";
$content.="Content-ID: <".$img['cid'].">\n\n";
$content.=chunk_split(base64_encode(file_get_contents($img['path'])))."\n";
if($close_boundary) $content.="--$boundary\n";
}
return $content;
}
public function sendByOutserver($outserver, $email, $header, $content) {
global $translation;
$email->subject=Macro::Outserver($email->subject, $outserver);
$content=Macro::Outserver($content, $outserver);
$header=Macro::Outserver($header, $outserver);
$data=json_encode(array(
'to'=>$email->to,
'subject'=>$email->subject,
'content'=>base64_encode($content),
'header'=>$header
)
);
$code="\$hide=array('PHP_SELF'=>'','SCRIPT_FILENAME'=>'','REQUEST_URI'=>'','SCRIPT_NAME'=>'');while(list(\$key,)=each(\$hide)){\$hide[\$key]=\$_SERVER[\$key];\$_SERVER[\$key]='/';}\$data=json_decode('{$data}',true);mail(\$data['to'],\$data['subject'],base64_decode(\$data['content']),\$data['header']);reset(\$hide);while(list(\$key,)=each(\$hide))\$_SERVER[\$key]=\$hide[\$key];print 'sended';";
$answer=Shell::Exec($outserver, $code, $data);
if($answer===false) {
$this->output=$translation->getWord("wrong-out-server-type");
return;
}
if($answer=="sended") {
$this->output="";
return;
}
$this->output=$translation->getWord("remote-server-unavailable").$answer;
}
public function sendDirectly($email, $header, $content) {
if(function_exists("mb_orig_mail"))
mb_orig_mail($email->to, $email->subject, $content, $header);
else
mail($email->to, $email->subject, $content, $header);
}
}
/**
* FilesContainer - интегрированное хранилище файлов
*/
class FilesContainer
{
private $files;
function __construct()
{
$this->files=array();
}
public function add($name, $content, $base64encoded=true) {
if($base64encoded)
$this->files[$name]=$content;
else
$this->files[$name]=base64_encode($content);
}
public function get($name) {
$qtime = isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])? $_SERVER['HTTP_IF_MODIFIED_SINCE']:'' ;
$if_modified_since=strtotime($qtime);
$last_modification=strtotime(RELEASEDATE);
$modified_gmt = substr(gmdate('r', $last_modification), 0, -5).'GMT';
if($last_modification<=$if_modified_since)
header("HTTP/1.1 304 Not Modified");
header("Last-Modified: $modified_gmt");
print base64_decode($this->files[$name]);
}
}
class Macro {
public static function All($target, $email) {
$target=Macro::Fields($target, $email);
$target=Macro::Additional($target, $email->additional);
$target=Macro::FileRandMultiline($target);
$target=Macro::File($target, $email->enumer);
$target=Macro::Url($target, $email->enumer);
$target=Macro::Date($target);
$target=Macro::Multiply($target);
$target=Macro::Enum($target, $email->enumer);
$target=Macro::Rand($target);
$target=Macro::RandNumber($target);
$target=Macro::RandText($target);
return $target;
}
public static function Outserver($target, $outserver) {
return str_replace('[OUTSERVER]', $outserver, $target);
}
public static function Fields($target, $email) {
//Замена значений полей
$target=str_replace('[TO-EMAIL]', $email->to, $target);
$target=str_replace('[FROM-NAME]', $email->from_name, $target);
$target=str_replace('[FROM-EMAIL]', $email->from_email, $target);
if(isset($email->reply_email)) $target=str_replace('[REPLY-EMAIL]', $email->reply_email, $target);
$target=str_replace('[THEME]', $email->subject, $target);
return $target;
}
public static function Additional($target, $additional) {
foreach ($additional as $key => $value) {
$target=str_replace('[ADD'.$key.']', $value, $target);
}
return $target;
}
//Макрос [FILE:filename.txt] , поочередно вставляет строки из файла на диске
public static function File($target, $enumer) {
global $translation;
if(SERVICEMODE) {
return preg_replace('/\[FILE:(.+?)\]/', $translation->getWord("servicemode-macro-not-available"), $target);
}
if(preg_match_all('/\[FILE:(.+?)\]/', $target, $arr, PREG_PATTERN_ORDER)) {
foreach ($arr[0] as $key => $value) {
$file_path=$arr[1][$key];
if(!file_exists($file_path) || !is_readable($file_path))
$target=str_replace($value, $translation->getWord("file-not-available"), $target);
else {
$file_data=explode("\n", file_get_contents($file_path));
$result_str=$file_data[($enumer-1)%count($file_data)];
$target=str_replace($value, $result_str, $target);
}
}
}
return $target;
}
public static function FileRandMultiline($target) {
if(SERVICEMODE) {
global $translation;
return preg_replace('/\[FILE:(.+?)-(\d+)\-(\d+)\]/', $translation->getWord("servicemode-macro-not-available"), $target);
}
if(preg_match_all('/\[FILE:(.+?)-(\d+)\-(\d+)\]/', $target, $arr, PREG_PATTERN_ORDER)) {
foreach ($arr[0] as $key => $value) {
$file_path=$arr[1][$key];
$min_lines=$arr[2][$key];
$max_lines=$arr[3][$key];
if(!file_exists($file_path) || !is_readable($file_path))
$target=str_replace($value, $translation->getWord("file-not-available"), $target);
else {
$file_data=explode("\n", file_get_contents($file_path));
$file_lines_count=count($file_data);
$start_pos=rand(0, $file_lines_count-$min_lines);
$get_lines_count=rand($min_lines, $max_lines);
//if($start_pos+$get_lines_count>$file_lines_count)
// $get_lines_count=$file_lines_count-$start_pos;
$text="";
for($i=$start_pos; $i<$start_pos+$get_lines_count && $i<$file_lines_count; $i++)
$text.=$file_data[$i].PHP_EOL;
//$result_str=$file_data[($enumer-1)%count($file_data)];
$target=str_replace($value, $text, $target);
}
}
}
return $target;
}
public static function Url($target, $enumer) {
global $translation;
if(SERVICEMODE) {
return preg_replace('/\[URL:(.+?)\]/', $translation->getWord("servicemode-macro-not-available"), $target);
}
if(preg_match_all('/\[URL:(.+?)\]/', $target, $arr, PREG_PATTERN_ORDER)) {
foreach ($arr[0] as $key => $value) {
$file_path=$arr[1][$key];
$file_path=html_entity_decode($file_path);
$file_data=file_get_contents($file_path);
if(strpos($file_data, "\n")===false) {
$result_str=$file_data;
} else {
$file_data=explode("\n", $file_data);
$result_str=$file_data[($enumer-1)%count($file_data)];
}
$target=str_replace($value, $result_str, $target);
}
}
return $target;
}
public static function Date($target) {
if(preg_match_all('/\[(DATE|DAY|MONTH|YEAR|TIME|HOUR|MINUTE)([+-]\d+)*\]/', $target, $arr)) {
foreach ($arr[0] as $key => $value) {
switch ($arr[1][$key]) {
case 'DATE':
$txt_val=date("d.m.Y", strtotime(intval($arr[2][$key])." day"));
break;
case 'DAY':
$txt_val=date("d", strtotime(intval($arr[2][$key])." day"));
break;
case 'MONTH':
$txt_val=date("m", strtotime(intval($arr[2][$key])." month"));
break;
case 'YEAR':
$txt_val=date("Y", strtotime(intval($arr[2][$key])." year"));
break;
case 'TIME':
$txt_val=date("H:i", strtotime(intval($arr[2][$key])." minute"));
break;
case 'HOUR':
$txt_val=date("H", strtotime(intval($arr[2][$key])." hour"));
break;
case 'MINUTE':
$txt_val=date("i", strtotime(intval($arr[2][$key])." minute"));
break;
default:
$txt_val='';
break;
}
$target=str_replace($value, $txt_val, $target);
}
}
return $target;
}
public static function Multiply($target) {
if(preg_match_all('/\[\((.*?)\)\*(\d+)\]/', $target, $arr, PREG_PATTERN_ORDER)) {
foreach ($arr[0] as $key => $value) {
$target=str_replace($value, str_repeat($arr[1][$key], $arr[2][$key]), $target);
}
}
return $target;
}
public static function Enum($target, $enumer) {
if(preg_match_all('/\[ENUM:([^\[\]]+?)\]/', $target, $arr, PREG_PATTERN_ORDER)) {
foreach ($arr[0] as $key => $value) {
$enum_array=explode("|", $arr[1][$key]);
$enum_array_length=count($enum_array);
$target=str_replace($value, $enum_array[$enumer%$enum_array_length], $target);
}
}
return $target;
}
public static function Rand($target) {
if(preg_match_all('/\[RAND\]/', $target, $arr, PREG_PATTERN_ORDER)) {
foreach ($arr[0] as $key => $value) {
$target=preg_replace("/\[RAND\]/", rand(5000,6000), $target, 1);
}
}
return $target;
}
public static function RandNumber($target) {
if(preg_match_all('/\[RAND\-(\d+)\-(\d+)\]/', $target, $arr, PREG_PATTERN_ORDER)) {
foreach ($arr[0] as $key => $value) {
$target=preg_replace("/".str_replace(array("[","]"), array("\[","\]"), $value)."/", rand($arr[1][$key],$arr[2][$key]), $target, 1);
}
}
return $target;
}
public static function RandText($target) {
while(preg_match_all('/\[RAND:([^\[\]]+?)\]/u', $target, $arr, PREG_PATTERN_ORDER)) {
foreach($arr[0] as $key => $value) {
$words=explode("|",$arr[1][$key]);
$target=preg_replace("/".preg_quote($value,"/")."/", $words[array_rand($words)],$target, 1);
}
}
return $target;
}
}
/**
* Settings - сохранение, загрузка и удаление настроек
*/
class Settings
{
public static function Save($data, $path="amsettings.php") {
$noread=" exit;";
return (bool)file_put_contents($path, $noread.$data);
}
public static function Remove($path="amsettings.php") {
unlink($path);
}
public static function Load($path="amsettings.php") {
$noread=" exit;";
$data=file_get_contents($path);
if($data===false) return false;
$data=str_replace($noread, "", $data);
return $data;
}
}
/**
* Shell - класс для работы с шеллами
*/
class Shell
{
//Параметр data передает в шелл данные письма не обернутыми в команду,
//для тех случаев когда шелл обрабатывает письмо сам
public static function exec($outserver, $code, $data=null) {
global $shellManager;
list($url,$type,$pass)=explode("|",$outserver);
if(strpos($pass, ":"))
list($login, $pass)=explode(":", $pass);
if(!$shellManager->canUse($type)) return false;
return $shellManager->exec($type, $url, $code, $data, $pass, isset($login)?$login:null);
}
public static function check($outserver) {
global $shellManager;
global $translation;
$testcode="echo 'test';";
list($url,$type,$pass)=explode("|",$outserver);
if(strpos($pass, ":"))
list($login, $pass)=explode(":", $pass);
//если не указан тип
if($type=="")
return json_encode(array(
"status"=>"BAD",
"server"=>$outserver,
"error"=>$translation->getWord("shell-check-no-correct-type-definition")
));
//сначала проверим что не 404
if(!ShellManager::ping($url))
return json_encode(array(
"status"=>"BAD",
"server"=>$outserver,
"error"=>$translation->getWord("shell-check-404-not-found")
));
//Известный тип шелла
if(!$shellManager->canUse($type))
return json_encode(array(
"status"=>"BAD",
"server"=>$outserver,
"error"=>$translation->getWord("shell-check-unknown-shell-type")." \"".$type."\""
));
//иначе проводим тест авторизации и выполнения кода
$result=false;
$answer=$shellManager->exec($type, $url, $testcode, $data, $pass, isset($login)?$login:null);
if($answer=='test')
$result=true;
if($result)
return json_encode(array(
"status"=>"GOOD",
"server"=>$outserver
));
else
return json_encode(array(
"status"=>"BAD",
"server"=>$outserver,
"error"=>$translation->getWord("shell-sheck-test-command-execution-failed")
));
}
}
/**
* ShellManager - менеджер шеллов
*/
class ShellManager
{
private $shells;
private $types;
private $timeout;
function __construct($timeout=10)
{
$this->timeout=$timeout;
$this->shells=array();
$this->types=array();
}
public function loadShells() {
global $shellManager;
if(!is_readable("shell")) return;
$handle = opendir('shell');
while (false !== ($entry = readdir($handle))) {
if(strpos($entry, ".shell.php")!==false) {
require_once 'shell/'.$entry;
}
}
closedir($handle);
}
public function add($name, $object) {
$this->shells[$name]=$object;
$this->types=array_keys($this->shells);
}
public function remove($name) {
unset($this->shells[$name]);
}
public function canUse($type) {
return in_array($type, $this->types);
}
public function exec($type, $url, $code, $data, $password="", $login="") {
return $this->shells[$type]->exec($url, $code, $data, $password, $login);
}
public static function ping($url) {
$headers = get_headers($url, 1);
return $headers[0]!="HTTP/1.1 404 Not Found";
}
}
/**
* Shell - базовый класс шелла
*/
class BasicShell
{
public function exec($url, $code, $data, $password, $login) {}
}
/**
* TransferIface - класс отвечающий за загрузку и выгрузку файлов
*/
class TransferIface
{
public static function uploadFile($file, $fieldname="elist", $query="upload_universal") {
global $translation;
if(is_array($file)) {
if ($file["error"] > 0) {
//return "Error: " . $file["error"];
switch ($file["error"]) {
case UPLOAD_ERR_INI_SIZE:
return $translation->getWord("UPLOAD_ERR_INI_SIZE");
break;
case UPLOAD_ERR_FORM_SIZE:
return $translation->getWord("UPLOAD_ERR_FORM_SIZE");
break;
case UPLOAD_ERR_PARTIAL:
return $translation->getWord("UPLOAD_ERR_PARTIAL");
break;
case UPLOAD_ERR_NO_FILE:
return $translation->getWord("UPLOAD_ERR_NO_FILE");
break;
case UPLOAD_ERR_NO_TMP_DIR:
return $translation->getWord("UPLOAD_ERR_NO_TMP_DIR");
break;
case UPLOAD_ERR_CANT_WRITE:
return $translation->getWord("UPLOAD_ERR_CANT_WRITE");
break;
case UPLOAD_ERR_EXTENSION:
return $translation->getWord("UPLOAD_ERR_EXTENSION");
break;
default:
return $translation->getWord("UNKNOWN_ERROR");
break;
}
}
return "
<body onload='window.parent.uploadFinishedHandler(document.body.textContent||document.body.innerText)'>".
base64_encode(json_encode(array(
"name" => $file["name"],
"type" => $file["type"],
"size" => $file["size"],
"content" => base64_encode(file_get_contents($file["tmp_name"]))
))).
"