PDA

Показать полную графическую версию : [решено] Отправка скриншота на email


Страниц : [1] 2

andrew_gurylyov@vk
22-02-2012, 13:22
Здравствуйте. Помогите, пожалуйста, написать батник. Не обессудьте, если задача слишком сложна или же проста, я батниками пока умею лишь копировать ><

Суть задачи:

Есть папка со скриншотами, например, 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
Сам скрипт:

@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 скрипт со всеми нужными вложениями и конфигурационный файл, если захотите сами откомпилировать - используйте этот (http://www.f2ko.de/programs.php?lang=en&pid=b2e) конвертер, и не забудьте вложить blat.exe, blat.lib и blat.dll.

andrew_gurylyov@vk
22-02-2012, 16:36
Вау! Не ожидал такой быстрой реакции! Спасибо огромное!

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

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

Anonymоus
22-02-2012, 17:04
Проверьте на всякий случай, указав отправляющим ящиком именно тот, тестовый, на mail.ru, с паролем test123. С gmail я не проверял, подозреваю, что там надо принудительно порт указывать.
У меня локально всё отработало, вот:
http://rghost.ru/36651201/image.png
Я не могу воспроизвести вашу проблему с неотправкой письма (пробовал на xp sp3 и winserver 2008), соответственно, и подсказать, как ее решить, тоже не могу.

andrew_gurylyov@vk
22-02-2012, 17:24
Anonymоus, да, похоже, нужно принудительно порт указывать, в гугл-инструкциях указано (POP (http://support.google.com/mail/bin/answer.py?hl=ru&answer=13287), IMAP (https://support.google.com/mail/bin/answer.py?hl=ru&answer=78799)).
С вашими данными всё замечательно отправляется.
В принципе, так как всё отправляется, проблему можно считать решённой. Но если вы всё-таки подскажете, как отправить гугловской почтой, будет совсем здорово, ибо компьютеров у меня несколько (3: мать, отец и сестра, мой не в счёт) и было бы здорово отличать не только по скриншоту, с которого приходит письмо, а почта у всех гугловская.

Anonymоus
22-02-2012, 17:42
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
Может быть, вы подскажете, как через Stunnel сделать? По идее, на эти компьютеры сколько угодно чего угодно ставить можно =)

Anonymоus
22-02-2012, 17:57
Вот же, снизу шестого сообщения ссылка (http://slaviksg.narod.ru/texts/smtpgmail.htm). Я только что сам нашел эту страницу в поисковике, так что сомневаюсь, что обьясню вам лучше, чем там описано.

andrew_gurylyov@vk
22-02-2012, 19:02
И снова не получается(
Я даже завёл новую почту на имя 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
andrew_gurylyov@vk, если честно, не хочется возиться с этим stunnel - его устанавливать нужно ещё, запускать как службу. У вас jabber-аккаунт есть? Могу помочь с отправкой уведомлений на любой jabber-аккаунт, только не на серверах google. Jabber.ru например, или яндексовский.

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

andrew_gurylyov@vk
22-02-2012, 20:08
есть жаббер квипа. avenger-inkognito@qip.ru подойдёт?

Anonymоus
22-02-2012, 20:33
andrew_gurylyov@vk, да, подойдет. Вам только что приходило сообщение с текстом "Тест"? Если да, то сейчас реализую скрипт, который будет слать уведомления.

andrew_gurylyov@vk
22-02-2012, 20:36
Не приходило. Вероятно оттого, что был включен анти-спам. Отключил, можно попробовать снова.

Anonymоus
22-02-2012, 20:40
Попробовал, а сейчас приходило? У меня на тестовый qip-аккаунт отправляет.

andrew_gurylyov@vk
22-02-2012, 20:40
Нет, ничего нет. В настройках квипа всё разрешил, антиспам выключил.

jabber.bot! пришло)

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

andrew_gurylyov@vk
22-02-2012, 20:45
Чуть выше написал. Пришло)

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

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

Anonymоus
22-02-2012, 21:03
Последняя проверка, только что вам ссылка приходила?

andrew_gurylyov@vk
22-02-2012, 21:03
Приходила. Файла, правда, по тому адресу не было, но ссылка пришла.

Anonymоus
22-02-2012, 21:10
Тогда держите готовый скрипт. Файла естественно не было, я имитировал его наличие. Сообщения в джаббер отправляются с помощью вот этого ruby-скрипта (http://habrahabr.ru/blogs/ruby/137505/), спасибо его автору.
Скачать уже скомпилированный скрипт вместе с интерпретатором 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, для поддержки кириллицы в джаббере.




© OSzone.net 2001-2012