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

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

foma24 05-07-2013 12:20 2179740

Отправка почты с вложением
 
Добрый день. Есть the Bat v.3 и есть папка C:\otpravka\ в которую периодически кидаются файлы с расширениями *.014 и *.015. Нужен скрипт, который бы каждый файл из папки отправлял отдельным письмом. Почта отправителя otpravitel@mail1.mail2.ru

Файлы с расширением *.014 необходимо отправлять на poluchatel1@mail1.mail2.ru. Файлы с расширением *.015 необходимо отправлять на poluchatel2@mail1.mail2.ru

Тема всех писем одинаковая - INFO

sunnykey 05-07-2013 15:13 2179798

Код:

#Powershell script.
#Don't forget unlock script executing by
#using command "Set-ExecutionPolicy RemoteSigned" or "Set-ExecutionPolicy Unrestricted"
#Save this file with ".ps1" extension

function SendMailToUser($To,$FileMask) {
    $From="otpravitel@mail1.mail2.ru"
    $Subject="INFO"
    $Body="This is test message"
    $Password="password"
    $SecPassword=New-Object -TypeName System.Security.SecureString
    $Password.ToCharArray() | foreach {$SecPassword.AppendChar($_)}
    $Credintial=New-Object -TypeName System.Management.Automation.PSCredential `
        -ArgumentList $From,$SecPassword
    $smtpServer="smtp.mail1.mail2.ru"
    Get-ChildItem "C:\otpravka\*" -Include $FileMask -Recurse | `
        Where-Object {$_.Attributes -ne [System.IO.FileAttributes]::Directory} | `
        foreach {$_.FullName} | `
        Send-MailMessage -From $From -To $To -Subject $Subject `
        -Body $Body -Credential $Credintial -SmtpServer $smtpServer
}

SendMailToUser -To "poluchatel1@mail1.mail2.ru" -FileMask "*.014"
SendMailToUser -To "poluchatel2@mail1.mail2.ru" -FileMask "*.015"


foma24 05-07-2013 16:00 2179820

sunnykey, большое спасибо, протестировать получится только в понедельник, вопрос - будут ли письма отображаться в Отправленных в the Bat при отправке через этот скрипт

Iska 05-07-2013 17:27 2179866

Цитата:

Цитата foma24
будут ли письма отображаться в Отправленных в the Bat при отправке через этот скрипт »

Разумеется, нет: Send-MailMessage.

sunnykey 06-07-2013 09:25 2180175

Цитата:

Цитата foma24
sunnykey, большое спасибо, протестировать получится только в понедельник, вопрос - будут ли письма отображаться в Отправленных в the Bat при отправке через этот скрипт »

Я знаю, что thunderbird есть CLI. Ссылку прилагаю Thunderbird CLI

foma24 06-07-2013 10:22 2180190

Вот команда для отправки письма

thebat.exe /MAILU=otpravitel;TO= poluchatel1@mail1.mail2.ru;S=INFO;A=C:\otpravka\*.014;SEND

, но как ее заставить отправлять в одном письме только один файл, названия файлов различные, т.е. допустим в папке C:\otpravka\ три файла 111.014, 222.014, 333.014 каждый файл нужно отправить отдельным письмом

zion87 06-07-2013 11:35 2180207

Попробуйте так
Код:

Set put=C:\otpravka
For /f "Delims=" %%i In ('Dir /b "%put%\*.014"') Do (
        thebat.exe /MAILU=otpravitel;TO=poluchatel1@mail1.mail2.ru;S=INFO;A="%put%\%%i";SEND
)


sunnykey 06-07-2013 14:10 2180278

Цитата zion87:
Попробуйте так
Код:
Set put=C:\otpravka
For /f "Delims=" %%i In ('Dir /b "%put%\*.014"') Do (
thebat.exe /MAILU=otpravitel;TO=poluchatel1@mail1.mail2.ru;S=INFO;A="%put%\%%i";SEND
) »
Думаю правильнее будет перечислить вложения через запятую, а то вдруг этих файлов тьма и столько же исходящих будет
Код:

#Powershell script.
#Don't forget unlock script executing by
#using command "Set-ExecutionPolicy RemoteSigned" or "Set-ExecutionPolicy Unrestricted"
#Save this file with ".ps1" extension

$TheBatCmd="/MAILU=otpravitel;TO= poluchatel1@mail1.mail2.ru;S=INFO;A="
$FileList=gci "D:\Аудио какое-то\*" -Include "*.log"
foreach ($el in $FileList) {
    $TheBatCmd+='"'+$el+'"'+","
}
$TheBatCmd=$TheBatCmd.TrimEnd(',')+";SEND"
Start-Process -FilePath "C:\Program Files\TheBat.exe" -ArgumentList $TheBatCmd `
    -NoNewWindow


foma24 07-07-2013 00:35 2180519

Цитата:

Цитата sunnykey
Думаю правильнее будет перечислить вложения через запятую »

Файлов от силы 10 штук в день.

Спасибо всем, проверю в понедельник, тогда отпишусь

Iska 07-07-2013 03:35 2180546

sunnykey, foma24, как правило, важно не количество, а суммарный размер: у многих бесплатных публичных серверов есть ограничения на размер вложений (а у некоторых — и на их количество на письмо).

sunnykey 07-07-2013 04:31 2180550

Цитата:

Цитата Iska
sunnykey, foma24, как правило, важно не количество, а суммарный размер: у многих бесплатных публичных серверов есть ограничения на размер вложений (а у некоторых — и на их количество на письмо). »

Я исходил из того, что файлы малого размера (не более 100 КиБ) и их много, поэтому лучше прикрепить их все в одно письмо, чем городить множество исходящих. А то ещё почтовый сервер заблокирует за спам=)

Iska 07-07-2013 07:19 2180553

Цитата:

Цитата sunnykey
А то ещё почтовый сервер заблокирует за спам »

Запросто ;).

foma24 08-07-2013 11:21 2181115

Всем спасибо, все работает как нужно.

foma24 11-07-2013 12:21 2183035

Здравствуйте еще раз, пришлось поднять тему, возник новый вопрос. Использую этот скрипт:
Set put=C:\otpravka
For /f "Delims=" %%i In ('Dir /b "%put%\*.014"') Do (
thebat.exe /MAILU=otpravitel;TO=poluchatel1@mail1.mail2.ru;S=INFO;A="%put%\%%i";SEND
)
del /Q c:\otchet\*.014

проблема в том, что похоже пока письмо еще формируется скрипт успевает удалить файл, в итоге письмо уходит без вложенного файла, как можно исправить таую ситуацию ?

Iska 11-07-2013 13:41 2183078

foma24, а ежели попробовать исполнять «thebat.exe» посредством «start /wait»?

sunnykey 11-07-2013 14:45 2183121

Цитата:

Цитата foma24
проблема в том, что похоже пока письмо еще формируется скрипт успевает удалить файл, в итоге письмо уходит без вложенного файла, как можно исправить таую ситуацию ? »

Есть такая функция как
Код:

C:\>timeout /?

TIMEOUT [/T] <таймаут> [/NOBREAK]

Описание:
    Принимает значение таймаута, задающего фиксированный период времени
    ожидания (в секундах), или ожидание до нажатия клавиши. Имеется также
    параметр, зaдающий игнорирование нажатий клавиш.

Параметры:
    /T <таймаут>        Время ожидания в секундах.
                        Допустимый интервал: от -1 до 99999 секунд.

    /NOBREAK            Игнорировать нажатия клавиш, ждать указанное время.

    /?                  Вывод справки по использованию.

Примечание: значение таймаута, равное -1 задает неограниченное время
            ожидания до нажатия клавиши.

Примеры:
    TIMEOUT /?
    TIMEOUT /T 10
    TIMEOUT /T 300 /NOBREAK
    TIMEOUT /T -1


foma24 11-07-2013 15:16 2183142

спасибо, попробую

foma24 11-07-2013 15:37 2183156

небольшая проблемка, почему то при вводе timeout /? появляется

"TIMEOUT" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

Хотя на другом компьютере все нормально, может что то с Path ?

sov44 11-07-2013 15:57 2183168

Решил попробовать отправить почту посредством bat. Скопировал исполнительный файл в папку (библиотеки не копировал, не знаю, нужны ли?), почитал мануал http://www.nobat.ru/cmd_intro.html, но при запуске батника(код.866)
Код:

thebat.exe /MAILU=почта@yandex.ru;TO=почта@gmail.com;S=proba;A="c:\2\файл.jpg";SEND
выскакивает окно http://savepic.org/3987188.jpg. Подскажите, где ошибка?

foma24 11-07-2013 16:14 2183179

а если в bat войти просто такого окна нет, такое ощущение что почтовый ящик просто не заведен ?

sov44 11-07-2013 16:18 2183181

Цитата:

Цитата foma24
а если в bat войти просто такого окна нет, такое ощущение что почтовый ящик просто не заведен ? »

я бат не устанавливал (см. пост выше), почтовые ящики рабочие.

sunnykey 11-07-2013 16:21 2183185

Цитата:

Цитата foma24
небольшая проблемка, почему то при вводе timeout /? появляется
"TIMEOUT" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.
Хотя на другом компьютере все нормально, может что то с Path ? »

Проверь на проблемном компе, существует ли файл %windir%\system32\timeout.exe
По оф. мануалу это приложение есть в WinXP и выше
http://technet.microsoft.com/en-us/l...=ws.10%29.aspx

foma24 11-07-2013 16:26 2183192

нет его там, хотя XP стоит

Iska 11-07-2013 16:32 2183200

sunnykey, не верьте. Ни в Windows 2000, ни в Windows XP его нет (только в Resource Kit'ах, с отличающимся форматом).

foma24, что скажете по поводу «start /wait»?

sunnykey 11-07-2013 16:44 2183205

Цитата:

Цитата Iska
sunnykey, не верьте. Ни в Windows 2000, ни в Windows XP его нет (только в Resource Kit'ах, с отличающимся форматом). »

Да я уже на 95% задач по автоматизации использую Powershell, поэтому меня особо не волнует
Цитата:

Цитата Iska
foma24, что скажете по поводу «start /wait»? »

Думаю стоит привести пример с использованием данной команды
Код:

start /wait thebat.exe /MAILU=otpravitel;TO=poluchatel1@mail1.mail2.ru;S=INFO;A="%put%\%%i";SEND
читать дальше »
Код:

C:\>start /?
Запуск указанной программы или команды в отдельном окне.

START ["заголовок"] [/D путь] [/i] [/MIN] [/MAX] [/SEPARATE | /SHARED]
      [/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENORMAL | /BELOWNORMAL]
      [/NODE <узел NUMA>] [/AFFINITY <маска сходства>] [/WAIT] [/b]
      [команда/программа] [параметры]

    "заголовок" Заголовок окна.
    путь        Исходный каталог.
    B          Запуск приложения без создания нового окна с отключением
                обработки сочетания клавиш ^C. Если приложение не
                обрабатывает сочетание клавиш ^C самостоятельно,
                единственным способом его прерывания является
                использование сочетания клавиш ^Break.
    I          Новой средой станет исходная среда, переданная
                cmd.exe, а не текущая среда.
    MIN        Запуск команды/программы в свернутом окне.
    MAX        Запуск команды/программы в развернутом окне.
    SEPARATE    Запуск 16-разрядной программы Windows в отдельной
                области памяти.
    SHARED      Запуск 16-разрядной программы Windows в общей
                области памяти.
    LOW        Запуск приложения с приоритетом IDLE.
    NORMAL      Запуск приложения с приоритетом NORMAL.
    HIGH        Запуск приложения с приоритетом HIGH.
    REALTIME    Запуск приложения с приоритетом REALTIME.
    ABOVENORMAL Запуск приложения с классом приоритета ABOVENORMAL
    BELOWNORMAL Запуск приложения с классом приоритета BELOWNORMAL
    NODE        Указывает предпочтительный узел NUMA
                в качестве десятичного целого числа.
    AFFINITY    Содержит маску сходства процессора в виде шестнадцатеричного
                числа. Процесс будет выполняться только на этих процессорах.

                Маска сходства интерпретируется по-разному при совмещении
                параметров /AFFINITY и /NODE. Укажите маску сходства таким
                образом, как если бы маска процессора узла NUMA сдвинута вправо
                и начинается на нулевом бите.
                Выполнение этих процессов ограничено процессорами,
                общими для указанной маски сходства и узла NUMA.
                Если общих процессоров не существует, то выполнение
                процесса ограничено указанным узлом NUMA.
    WAIT        Запуск приложения с ожиданием его завершения.
    команда/программа
                Если это внутренняя команда cmd.exe или пакетный файл,
                обработчик команд (cmd.exe) запускается с ключом /K.
                Это означает, что окно не будет закрыто после завершения
                команды.

                Если это не внутренняя команда cmd.exe и не пакетный файл,
                значит, это программа, которая будет запущена в графическом
                или текстовом окне.

    параметры  Параметры, передаваемые команде/программе.

Примечание: параметры SEPARATE и SHARED не поддерживаются на 64-разрядных
платформах.

Указание параметра /NODE позволяет создавать процессы таким образом, чтобы
использовать память в системах NUMA. Например, два процесса, которые
взаимодействуют друг с другом через общую память, могут совместно использовать
один и тот же предпочтительный узел NUMA для минимизации задержки памяти.
Память выделается из одного узле NUMA по возможности, что позволяет процессам
выполняться на процессорах вне указанного узла.

    start /NODE 1 application1.exe
    start /NODE 1 application2.exe

Эти процессы можно ограничить для выполнения на определенных процессорах в
одном узле NUMA.  В следующем примере приложение application1 выполняется
на низкоприоритетных процессорах узла, а приложение application2 выполняется
на двух следующих процессорах узла.  В этом примере предполагается, что
указанный узел имеет минимум четыре логических процессора.  Обратите внимание
на то, что номер узла можно изменить на другой действительный номер для
компьютера без изменения маски сходства.

    start /NODE 1 /AFFINITY 0x3 application1.exe
    start /NODE 1 /AFFINITY 0xc application2.exe

Изменения вызова внешних команд из командной строки или с помощью команды
START при включении расширенной обработки команд:

Для вызова неисполняемых файлов через механизм сопоставления типов файлов
    достаточно просто ввести имя файла в командной строке.  Например, команда
    WORD.DOC запускает приложение, сопоставленное расширению имени файла .DOC.
    Сведения о создании подобных сопоставлений из пакетных файлов приведены
    в описаниях команд ASSOC и FTYPE.

При запуске 32-разрядного приложения с графическим интерфейсом пользователя
    обработчик команд CMD.EXE не ожидает завершения работы приложения перед
    возвратом к приглашению командной строки.  Подобное новое поведение НЕ
    относится к запуску приложений из пакетных файлов.

При выполнении командной строки, первым элементом которой является текстовая
    строка "CMD" без расширения имени файла или указания пути, она заменяется
    значением переменной COMSPEC. Это предотвращает запуск CMD.EXE из
    текущей активной папки, если таковая программа там имеется.

Если первый элемент командной строки не содержит расширения имени файла,
    обработчик команд CMD.EXE использует значение переменной среды PATHEXT,
    чтобы определить расширения имен исполняемых файлов и порядок поиска
    нужного файла.  По умолчанию для переменной PATHEXT задается
    значение:

        .COM;.EXE;.BAT;.CMD

    Обратите внимание, что этот синтаксис подобен синтаксису для переменной
    PATH, то есть отдельные элементы разделяются точкой с запятой.

Если при поиске исполняемого файла нет соответствия ни одному из расширений,
выполняется проверка соответствия указанного имени папки. Если имя папки
соответствует указанному, то команда START запускает EXPLORER для этого
пути. Если такое действие выполняется из командной строки, то оно
эквивалентно выполнению команды CD /D для указанного пути.


foma24 11-07-2013 16:58 2183207

Iska, «start /wait» опробую завтра и отпишусь, спасибо

foma24 12-07-2013 09:30 2183487

Немного поменялась проблема, батник такого вида:

Set put=C:\otchet1
Set put1=C:\otchet2
For /f "Delims=" %%i In ('Dir /b "%put%\*.*"') Do (
"C:\Program Files\The Bat!\thebat.exe" /MAILU=otpravka@mail.ru;TO=poluchenie1@mail.ru;S=INFO;A="%put%\%%i";SEND
)

For /f "Delims=" %%i In ('Dir /b "%put1%\*.*"') Do (
"C:\Program Files\The Bat!\thebat.exe" /MAILU=otpravka@mail.ru;TO=poluchenie2@mail.ru;S=INFO;A="%put1%\%%i";SEND
)

del /Q C:\otchet1\*.*
del /Q C:\otchet2\*.*

Данный батник установлен в Назначенные задачи, чтобы отрабатывался каждые 2 минуты начиная с 9-00. Сам the bat включается автоматически при запуске винды раньше чем начинает работать батник.

Так вот при первом запуске батника в 9-00 он просто удаляет файл и не отправляет его, если повторно положить файл в папку, то он отправляется.

sunnykey 12-07-2013 11:09 2183523

[q=foma24]Так вот при первом запуске батника в 9-00 он просто удаляет файл и не отправляет его, если повторно положить файл в папку, то он отправляется. »
а если перед удалением добавить
Код:

ping -n 30 127.0.0.1>nul

foma24 12-07-2013 11:29 2183535

попробую, но уже утром в понедельник, спасибо

sov44 12-07-2013 13:24 2183608

а не проще удаление файлов сунуть в соответствующий цикл-удаление после успешной отправки?
Код:

For /f "Delims=" %%i In ('Dir /b "%put%\*.*"') Do (
 "C:\Program Files\The Bat!\thebat.exe" /MAILU=otpravka@mail.ru;TO=poluchenie1@mail.ru;S=INFO;A="%put%\%%i";SEND && del /q "%put%\%%i"
 )


foma24 12-07-2013 15:27 2183695

Цитата:

Цитата sunnykey
ping -n 30 127.0.0.1>nul »

не получится, пока батник ждал 30 пакетов появился файл и соответственно он не отправился, а удалился

sov44, попробую спасибо

Iska 12-07-2013 17:40 2183772

Я третий раз настоятельно рекомендую опробовать запуск «thebat.exe» на исполнение посредством «start /wait».

foma24 15-07-2013 09:26 2184783

Цитата:

Цитата sov44
&& del /q "%put%\%%i »

все тоже самое

Цитата:

Цитата Iska
«start /wait». »

тоже не работает

Видно все дело в самом почтовом клиенте, если он включается и начинает проверяет почту до включения интернета, то появляется ошибка, что сервер недоступен. Очень похоже, что через командную строку он не проверяет сервер, т.е. видит что сервер недоступен и письмо не отправляет, при этом батник считает что команда выполнена успешно и удаляет файлы.

Iska 15-07-2013 12:15 2184875

Цитата:

Цитата foma24
при этом батник считает что команда выполнена успешно »

Где это видно? Я не видел у Вас попытки проверки errorlevel (вопрос ещё в том, конечно, что возвращает «The Bat!» в том или ином случае).

foma24 16-07-2013 09:25 2185362

Похоже все дела было в the Bat v3 , поставил 4 версию (к счастью лицензия была), все вроде нормально работает


Время: 03:15.

Время: 03:15.
© OSzone.net 2001-