В общем сразу к делу. Дано:
- Мне приходит почта и все вложения автоматически складываются в одну папку.
- Всё…
Надо:
- Упаковать файлы с определенным расширением в архив
- Отправить по определенному адресу электронной почты.
- Повторить каждый день
Задача очень простая, но зачем мне этим заниматься, если за меня может поработать компьютер, верно? Сначала собирался использовать nncron, или xstarter.. Но nncron плохо работал на семерке и выше, а xstarter для такой задачи я посчитал слишком тяжелым, да и не нравится мне он. Тут же было решено состряпать батник на скорую руку:
Создаем папку “d:\auto“, внутри создаем наш батник (пока что пустой): d:\autotoOrg.cmd, который будет делать за нас работу. Все вложения у меня собираются в папку d:\mailin. Для начала мне нужно взять файлы с расширениями 582, 583, 584, 585 и т д.., заархивировать, имя архива должно содержать текущий день и месяц.
Создадим папки для работы батника:
D:\autoorg
В эту папку будем складывать входящие файлы:
D:\autoorgreestr
Здесь файлы будут помещены в архив:
D:\autoorgorgout
А сюда будем скидывать уже отправленные файлы.. Так на всякий случай. Люблю когда есть копии:
D:\autoorgorgarch
Собственно поехали наполнять батник.. Почему то я ему сделал расширение cmd, но на результат это не повлияет:
move /Y d:\mailin*.648 d:\autoorgreestr move /Y d:\mailin*.583 d:\autoorgreestr move /Y d:\mailin*.584 d:\autoorgreestr move /Y d:\mailin*.585 d:\autoorgreestr move /Y d:\mailin*.582 d:\autoorgreestr move /Y d:\mailin*.636 d:\autoorgreestr move /Y d:\mailin*.414 d:\autoorgreestr move /Y d:\mailin*.614 d:\autoorgreestr move /Y d:\mailinr*.639 d:\autokabarh move /Y d:\mailinr*.ost d:\autokabarh move /Y d:\mailin*.639 d:\autokab move /Y d:\mailin*.ost d:\autokab move /Y d:\autokabr* d:\autokabarch
Пока думал в задачу добавились новые файлы, поэтому включил их в командный файл. Вообще по-хорошему лучше создать переменные, но мне что то лениво. Следующий шаг – архивация. Здесь я решил защиту от дурака сделать небольшую, чтобы не уходили архивы кусками, а именно – батник ничего не будет делать до 17-00. Реализуется очень просто – получаем текущее время, если час меньше 17, то ничего не делаем:
set day=%date:~0,2% set month=%date:~3,2% set hour=%time:~0,2% if %hour% GTR 17 (
Ну вот, пора архивировать:
if exist d:\autoorgreestr*01*.* d:\auto7za.exe -tzip a d:\autoorgoutorg%day%%month%.zip d:\autoorgreestr*.* if exist d:\autoorgoutorg%day%%month%.zip del /Q d:\autoorgreestr*.*
В качестве архиватора я использую бесплатный 7-zip, который скачал с одноименного сайта. В первом условии я проверяю, есть ли вообще какие то файлы для архивации, если есть, то архивируем. Вторая команда удаляет исходные файлы, если существует архив.
Файлы упаковали, пришло время отправлять. Для отправки я нашел два интересных решения – mailsend и cmail. Т.к. файлы мне нужно отправлять уже по двум адресам, то использовать я буду обе программы, чисто для эксперимента. Заранее скажу, что mailsend всем хорош, кроме одного – он не умеет отправлять файлы из папки по маске, с чем отлично справляется cmail. Из примеров на сайтах этих программ и из подсказок в командной строке сформировал команды для отправки:
if exist d:\autoorgoutorg%day%%month%.zip d:\automailsend1.18.exe -smtp smtp.gmail.com -port 465 -t poluchatel@gmail.com +cc +bc -f otpravitel@gmail.com -ssl -auth -user otpravitel@gmail.com -pass password -q -attach "d:\autoorgoutorg%day%%month%.zip" -sub "Отчет от наших к вашим" -M "Здесь сообщение, которое будет отображаться в письме" rem echo "Результат: %errorlevel%" if ERRORLEVEL 0 move /Y d:\autoorgout*.* d:\autoorgarch if exist d:\autokab*.639 d:\autocmail.exe -secureport -host:otpravitel@gmail.com:password@smtp.gmail.com:465 -from:otpravitel@gmail.com -to:poluchatel@mail.ru -subject:Отчет_от_наших_вашим_тема "-body:"Сообщение "-awild:\:d:\autokab*.*" move /Y d:\autokab*.* d:\autokabarch rem echo "Результат: %errorlevel%" ) ELSE echo Ещё не время отправлять отчеты....
В принципе всё. кидаем тестовые файлы, предварительно указав в качестве получателя собственный адрес, проверяем – всё работает. Кидаем в планировщик задание запускать каждый день часиков в семь и благополучно забываем. Под спойлером полный текст:
@echo off move /Y d:\mailin*.648 d:\autoorgreestr move /Y d:\mailin*.583 d:\autoorgreestr move /Y d:\mailin*.584 d:\autoorgreestr move /Y d:\mailin*.585 d:\autoorgreestr move /Y d:\mailin*.582 d:\autoorgreestr move /Y d:\mailin*.636 d:\autoorgreestr move /Y d:\mailin*.414 d:\autoorgreestr move /Y d:\mailin*.614 d:\autoorgreestr move /Y d:\mailinr*.639 d:\autokabarh move /Y d:\mailinr*.ost d:\autokabarh move /Y d:\mailin*.639 d:\autokab move /Y d:\mailin*.ost d:\autokab move /Y d:\autokabr* d:\autokabarch set day=%date:~0,2% set month=%date:~3,2% set hour=%time:~0,2% rem zakat solnca vruchnuy rem set day=21 rem set month=10 rem set hour=18 if %hour% GTR 17 ( if exist d:\autoorgreestr*01*.* d:\auto7za.exe -tzip a d:\autoorgoutorg%day%%month%.zip d:\autoorgreestr*.* if exist d:\autoorgoutorg%day%%month%.zip del /Q d:\autoorgreestr*.* if exist d:\autoorgoutorg%day%%month%.zip d:\automailsend1.18.exe -smtp smtp.gmail.com -port 465 -t poluchatel@gmail.com +cc +bc -f otpravitel@gmail.com -ssl -auth -user otpravitel@gmail.com -pass password -q -attach "d:\autoorgoutorg%day%%month%.zip" -sub "Отчет от наших к вашим" -M "Здесь сообщение, которое будет отображаться в письме" rem echo "Результат: %errorlevel%" if ERRORLEVEL 0 move /Y d:\autoorgout*.* d:\autoorgarch if exist d:\autokab*.639 d:\autocmail.exe -secureport -host:otpravitel@gmail.com:password@smtp.gmail.com:465 -from:otpravitel@gmail.com -to:poluchatel@mail.ru -subject:Отчет_от_наших_вашим_тема "-body:"Сообщение "-awild:\:d:\autokab*.*" move /Y d:\autokab*.* d:\autokabarch rem echo "Результат: %errorlevel%" ) ELSE echo Ещё не время отправлять отчеты....
Julia says:
Если с командной строки письма успешно отправляются, а при помощи php нет, попробуйте поэкспериментировать с четвертым параметром функции mail либо с настройкой sendmail_path, находящейся в файле php.ini
Алексей says:
PHP был бы лишним