Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Отправка скриншота на email (http://forum.oszone.net/showthread.php?t=228512)

andrew_gurylyov@vk 22-02-2012 13:22 1864301

Отправка скриншота на email
 
Здравствуйте. Помогите, пожалуйста, написать батник. Не обессудьте, если задача слишком сложна или же проста, я батниками пока умею лишь копировать ><

Суть задачи:

Есть папка со скриншотами, например, C:\Dropbox\Public\img\
В ней время от времени (после нажатия PrintScreen) появляются картинки. Их имена имеют одинаковое начало, например, Capture и одинаковый формат: .JPEG. Единственное их отличие - нумерация. Соответственно, файлы выглядят следующим образом: Capture1.JPEG, Capture2.JPEG, Capture3.JPEG и т.д. При появлении новых файлов должен запускаться батник, лежащий в любом месте, например, в папке с этими файлами. Его автоматически запустит программа (Auto Screenshot Maker), которая делает скриншоты после того, как сохранит скриншот. В самом батнике адрес к папке должен преобразовываться из C:\Dropbox\Public\img\ в http://dl.dropbox.com/u/1033383/img/
Дальше самое сложное, вроде бы, что я вообще не понимаю, как сделать: батник должен определять последний файл в папке (то есть файл с наибольшим числом после Capture), добавлять его к адресу, чтобы получилось, например, http://dl.dropbox.com/u/1033383/img/Capture1.JPEG и отправлять его на почтовый ящик, например, example@example.com
Желательно, чтоб функционал этого батника был в .exe, а-то я что-то сомневаюсь, что программа запустит иные форматы.
Помогите, пожалуйста, я очень нуждаюсь в вашей помощи! Заранее безмерно благодарен!

Anonymоus 22-02-2012 15:32 1864408

Вложений: 1
Сам скрипт:
Код:

@Echo Off
For /F "eol=# delims== tokens=1,2 usebackq" %%A In ("config.ini") Do (Set %%A=%%B)
For /F "delims=" %%F In ('Dir "%WorkDir%\Capture*.jpeg" /A:-D /B /O:-D') Do (
blat.exe -server %Server% -u %Login% -pw %Password% -subject "Screenshot" -body "http://dl.dropbox.com/u/%ID%/img/%%F " -to %EMail% -f %Login% -attach "%WorkDir%\%%F">nul
Exit
)

Его файл настроек, config.ini
Код:

# Директория со скриншотами
WorkDir=C:\Dropbox\Public\img
# ID дропбокс-юзера
Set ID=1033383
# Получатель
EMail=guest@mail.ru
# Почтовый сервер для отправки
Server=smtp.mail.ru
# Логин
Login=script.backup@mail.ru
# Пароль к ящику
Password=test123

При запуске определяет последний добавленный файл, шлет на указанный ящик ссылку на него в public дропбокса и сам файл в аттаче письма. Данные поменяете на свои, сейчас там тестовый ящик для отправки используется. К скрипту нужна утилита blat, которая может отправлять почту из командной строки.
Во вложении к этому посту - уже откомпилированный в exe скрипт со всеми нужными вложениями и конфигурационный файл, если захотите сами откомпилировать - используйте этот конвертер, и не забудьте вложить blat.exe, blat.lib и blat.dll.

andrew_gurylyov@vk 22-02-2012 16:36 1864447

Вау! Не ожидал такой быстрой реакции! Спасибо огромное!

Потестил... почему-то не отправляет. Ни с моего компа, ни с ещё одного. Все данные введены верно, проверил несколько раз. В чём может быть проблема, не подскажете?

Как оно происходит: запускаю файл, он распаковывает блат, видимо, отправляет, файлы блат снова пропадают. Вероятно, больше ничего и не должно быть. Но во входящих как ничего не было, так и нет. Оба почтовые ящики - гугловские. Сервером указан smtp.gmail.com. В настройках гугла у обоих ящиков разрешены IMAP и POP. Также на всякий случай выключены фаерволы.
p.s. также была отключена функция smtp на уровне провайдера у обоих компьютеров, включил в личном кабинете и переподключился к интернету - безрезультатно.

Anonymоus 22-02-2012 17:04 1864467

Проверьте на всякий случай, указав отправляющим ящиком именно тот, тестовый, на mail.ru, с паролем test123. С gmail я не проверял, подозреваю, что там надо принудительно порт указывать.
У меня локально всё отработало, вот:

Я не могу воспроизвести вашу проблему с неотправкой письма (пробовал на xp sp3 и winserver 2008), соответственно, и подсказать, как ее решить, тоже не могу.

andrew_gurylyov@vk 22-02-2012 17:24 1864483

Anonymоus, да, похоже, нужно принудительно порт указывать, в гугл-инструкциях указано (POP, IMAP).
С вашими данными всё замечательно отправляется.
В принципе, так как всё отправляется, проблему можно считать решённой. Но если вы всё-таки подскажете, как отправить гугловской почтой, будет совсем здорово, ибо компьютеров у меня несколько (3: мать, отец и сестра, мой не в счёт) и было бы здорово отличать не только по скриншоту, с которого приходит письмо, а почта у всех гугловская.

Anonymоus 22-02-2012 17:42 1864494

andrew_gurylyov@vk, после непродолжительных поисков в интернете выяснилось, что логин в Gmail производится исключительно через SSL, чего blat "из коробки" не умеет делать. Для этого нужна дополнительная программа Stunnel. Вам проще будет сделать несколько копий config.ini с разными не-gmail отправляющими ящиками (получателем может быть и gmail).

Кстати, я заметил ошибку - замените в config.ini строку Set ID=1033383 на ID=1033383, без Set

UPD: Если всё же захотите использовать gmail, вот тут есть статья о настройке stunnel
http://slaviksg.narod.ru/texts/smtpgmail.htm
Скрипт в таком случае, придется немножко подправить (добавить -port 465 к аргументам blat) и откомпилировать заново.

andrew_gurylyov@vk 22-02-2012 17:51 1864499

Может быть, вы подскажете, как через Stunnel сделать? По идее, на эти компьютеры сколько угодно чего угодно ставить можно =)

Anonymоus 22-02-2012 17:57 1864501

Вот же, снизу шестого сообщения ссылка. Я только что сам нашел эту страницу в поисковике, так что сомневаюсь, что обьясню вам лучше, чем там описано.

andrew_gurylyov@vk 22-02-2012 19:02 1864551

Вложений: 1
И снова не получается(
Я даже завёл новую почту на имя Blat Stunnel.

Как вы посоветовали:
Код:

blat.exe -port 465 -u %Login% -pw %Password% -subject "Screenshot" -body "http://dl.dropbox.com/u/%ID%/img/%%F " -to %EMail% -f %Login% -attach "%WorkDir%\%%F">nul
Первый отличный от вашего вариант
Код:

blat.exe -serverSMTP 127.0.0.1 -port 465 -try 1 -u %Login% -pw %Password% -subject "Screenshot" -body "http://dl.dropbox.com/u/%ID%/img/%%F " -to %EMail% -f %Login% -attach "%WorkDir%\%%F">nul
Второй
Код:

blat.exe -serverSMTP 127.0.0.1 -portSMTP 465 -try 1 -u %Login% -pw %Password% -subject "Screenshot" -body "http://dl.dropbox.com/u/%ID%/img/%%F " -to %EMail% -f %Login% -attach "%WorkDir%\%%F">nul
Вариант, как в статье
Код:

blat.exe -serverSMTP 127.0.0.1 -portSMTP 1099 -u %Login% -pw %Password% -subject "Screenshot" -body "http://dl.dropbox.com/u/%ID%/img/%%F " -to %EMail% -f %Login% -attach "%WorkDir%\%%F">nul
Все эти варианты не заработали(

Anonymоus 22-02-2012 20:06 1864637

andrew_gurylyov@vk, если честно, не хочется возиться с этим stunnel - его устанавливать нужно ещё, запускать как службу. У вас jabber-аккаунт есть? Могу помочь с отправкой уведомлений на любой jabber-аккаунт, только не на серверах google. Jabber.ru например, или яндексовский.

Ещё одна из причин, по которой могло не заработать - у вас в ini-файле логин записан, как Login=blatstunnel@mail.ru

andrew_gurylyov@vk 22-02-2012 20:08 1864640

есть жаббер квипа. avenger-inkognito@qip.ru подойдёт?

Anonymоus 22-02-2012 20:33 1864658

andrew_gurylyov@vk, да, подойдет. Вам только что приходило сообщение с текстом "Тест"? Если да, то сейчас реализую скрипт, который будет слать уведомления.

andrew_gurylyov@vk 22-02-2012 20:36 1864661

Не приходило. Вероятно оттого, что был включен анти-спам. Отключил, можно попробовать снова.

Anonymоus 22-02-2012 20:40 1864662

Попробовал, а сейчас приходило? У меня на тестовый qip-аккаунт отправляет.

andrew_gurylyov@vk 22-02-2012 20:40 1864663

Нет, ничего нет. В настройках квипа всё разрешил, антиспам выключил.

jabber.bot! пришло)

Anonymоus 22-02-2012 20:44 1864667

Попробуйте в контакты добавить jabber.bot@qip.ru
Только что еще раз попробовал вам отправить, на мой тестовый jid (только что завел на квипе) приходит, но тут может быть проблема ещё в разных клиентах, у меня Psi+, и в опциях отключено "не принимать сообщения от неавторизованных контактов"

andrew_gurylyov@vk 22-02-2012 20:45 1864669

Чуть выше написал. Пришло)

Тема: Уведомление

Проверка связи

Anonymоus 22-02-2012 21:03 1864679

Последняя проверка, только что вам ссылка приходила?

andrew_gurylyov@vk 22-02-2012 21:03 1864680

Приходила. Файла, правда, по тому адресу не было, но ссылка пришла.

Anonymоus 22-02-2012 21:10 1864687

Тогда держите готовый скрипт. Файла естественно не было, я имитировал его наличие. Сообщения в джаббер отправляются с помощью вот этого ruby-скрипта, спасибо его автору.
Скачать уже скомпилированный скрипт вместе с интерпретатором ruby можно отсюда http://rghost.ru/36655943
Когда я тестировал отправку, иногда бывало, зависало секунд на 30. С нормальными серверами, не qip.ru обычно такого не происходит.
Вот скрипт, если захотите сами скомилировать:
Скрипт

@Echo Off
SetLocal EnableDelayedExpansion
:: Прописываемся в path до конца сессии
Echo %Path%|Find "%CD%\xmpp">nul||Set Path=%Path%;%CD%\xmpp
:: Читаем настройки из файла
Set CfgFile=settings.cfg
Call :ReadKeyValue
:: Создаем профиль со значениями по умолчанию для бота
Call :WriteAccountData
For /F "delims=" %%F In ('Dir "%Dropbox.Path%\Capture*.jpeg" /A:-D /B /O:-D') Do (
Echo Sending message...
xmpp_sender -b "http://dl.dropbox.com/u/%Dropbox.ID%/img/%%F">nul
Exit
)
pause


rem Запись данных в профиль бота
:WriteAccountData
>"%Jabber.Config%" (
Echo xmpp_sender:
Echo server: %Jabber.Server%
Echo login: %Jabber.SenderLogin%
Echo password: %Jabber.SenderPswd%
Echo to: %Jabber.Receiver%
Echo subject: %Jabber.MessageSubj%
Echo body: %Jabber.MessageBody%
)
Exit /B

rem ====== Функции для работы с файлами формата key=value
rem Inquisitor, 2011
:ReadKeyValue
:: Читает значения из файла, назначает переменные и подготавливает данные для :WriteKeyValue
If Not Exist %CfgFile% (Exit 1)
Set i=0
For /F "usebackq tokens=1,2* delims==" %%A In ("%CfgFile%") Do (
Set /A i+=1
Set %%A=%%B
Set CfgKey!i!=%%A
Set CfgStrings=!i!
)
Exit /B

:WriteKeyValue
:: Записывает данные обратно в файл, соответственно, с внесенными изменениями
If Exist "%CfgFile%" (Del "%CfgFile%")
For /L %%S In (1,1,%CfgStrings%) Do (
Call :SingleLine "!CfgKey%%S!"
)
Exit /B
:SingleLine
If "%~1"=="" Exit /B
If Not "!%~1!"=="" (Echo %~1=!%~1!>>"%CfgFile%") Else (Echo %~1>>"%CfgFile%")
Exit /B

:AddEntry
:: Добавляет значение (пустое), которое позже можно назначить через Set и записать через WriteKeyValue
:: Пример - Call :AddEntry "# тестовый комментарий", Call :AddEntry "Key123",
If Not "%~1"=="" (
Set /A CfgStrings+=1
Set CfgKey!CfgStrings!=%~1
)
Exit /B

:RemoveEntry
:: Удаляет точно или частично совпавшие ключи, регистрозависимо, используется Find
:: Пример - Call :RemoveEntry "TestKey"
If Not "%~1"=="" (
For /L %%L In (1,1,%CfgStrings%) Do (
Echo !CfgKey%%S!|Find "%~1">nul&&Set CfgKey%%L=
)
)
Exit /B
rem ===============================

Файл настроек

[Jabber]
# Сервер. Отправитель и получатель должны находится на том же сервере.
Jabber.Server=qip.ru
# Логин бота
Jabber.SenderLogin=jabber.bot
# Пароль бота
Jabber.SenderPswd=qwerty123
# Получатель
Jabber.Receiver=avenger-inkognito
# Тема по умолчанию - используется, если не задано
Jabber.MessageSubj=Уведомление
# Текст по умолчанию - используется, если не задано
Jabber.MessageBody=test
# Файл, из которого бот читает значения по умолчанию
Jabber.Config=xmpp\xmpp_sender.yml

[Dropbox]
# Путь к директории со скриншотами
Dropbox.Path=C:\Dropbox\Public\img
# ID пользователя
Dropbox.ID=1011483

Оба в кодировке UTF-8, для поддержки кириллицы в джаббере.

andrew_gurylyov@vk 23-02-2012 05:25 1864847

Прошу прощения, вынужден был вчера очень быстро пропасть, не успел предупредить.

Оно как-то через раз отправляет. Иногда включаешь и через пару секунд или меньше закрывается, отправив. А иногда включаешь и висит пока не вырубишь или где-то с минуту, но не отправлет.

Попытался я сам скомпилировать... Вовсе отправляется. Файлы в utf-8 (без BOM). Блат уже не добавляю (хотя и добавлять пробовал), раз jabber теперь. Цель компиляции - сделать невидимый режим работы программы. В идеале ещё удалить из сообщения слово "Тема: ", но не могу врубиться, где оно вообще написано.

Anonymоus 23-02-2012 10:37 1864917

Цитата:

Цитата andrew_gurylyov@vk
Оно как-то через раз отправляет »

Чуть выше писал, на нормальных серверах такого не происходит, это локальные проблемы qip.ru (долгая авторизация). Я у себя для уведомлений использую аккаунт яндекс-джаббера, приходит в ту же секунду.
Перекомпилировал для вас с режимом без видимого окна, тему убрал (она в файле настроек указана) http://rghost.ru/36662943

andrew_gurylyov@vk 23-02-2012 11:52 1864981

Попробовал через яндекс. Действительно быстро. Вот им тогда и буду пользоваться. Огромное спасибо, вы мне очень здорово помогли!


Время: 17:41.

Время: 17:41.
© OSzone.net 2001-