Отправка почты через командную строку или powershell

Мне, как и вам, небось, хотелось получать уведомление по электронной почте об успешном исполнении какого-то действия. Например, после сохранении резервной копии файловой БД http://infostart.ru/public/400349/ отправилось по почте уведомление, что «все ок!».
Или же уведомить при наступлении какого-то события, системного или нет, например, доступность сервера из интернета и т.д.

Итак, чтобы отправить с «батника» электронное письмо, нужно качнуть http://sourceforge.net/projects/blat/files/ разархивировать и содержимое папки «…full» скопировать в папку «C:WindowsSystem32«, а далее создаем файл send.bat, где пишем

rem Так как мы скопировали туда куда надо файлы архива то ниже строку не меняем
set file_blat=blat.exe
rem Предварительно создаем файл report.txt, где описываем текст сообщения
set file_text=D:
eport.txt
rem Предварительно создаем файл log_blat.txt, где будут ложиться логи
set file_log=D:log_blat.txt
rem SMTP сервер для отправки сообщения, например smtp.mail.ru
set from_server=smtp.inbox.ru
rem Порт SMTP сервера для отправки, например 2525 порт
set from_port=2525
rem Данные пользователя от которого будет отправлено сообщение
set from_mail=login@inbox.ru
rem Данные пользователя от которого отправляется сообщение
set from_name=login@inbox.ru
rem Пароль от почтового ящика пользователя от которого отправляется сообщение
set from_pass=1111
rem Электронный адрес, кому мы отправляем сообщение
set to_mail=login@mail.ru
rem Тема сообщения
set to_subject=»Report»
%file_blat% %file_text% -server %from_server%:%from_port% -f %from_mail% -u %from_name% -pw %from_pass% -to %to_mail% -s %to_subject% -log %file_log%

! Хочу обратить внимание на вот эти данные

rem SMTP сервер для отправки сообщения, например, smtp.mail.ru
set from_server=smtp.inbox.ru
rem Порт SMTP сервера для отправки, например 2525 порт
set from_port=2525

Так как почтовики сейчас перевели свои smtp сервера на безопасное соединение, типа SSL, поэтому для успешной отправки по данному соединению нужно еще качнуть вот эту беду https://www.stunnel.org/index.html, которую нужно установить, и при установке можно ставить все по умолчанию, без указания каких то параметров.

Эта штуковина, в нашем случае, дает нам возможность подключаться по безопасному соединению с локального компьютера.

После установки утилиты нужно через cmd.exe перейти в папку, куда была установлена программа, и выполнить

stunnel –install

чтобы установить программу как службу

stunnel –start

чтобы программа запустилась как служба

! Не закрываем командную строку

Потом, открыть и отредактировать файл

C:Program Files (x86)stunnelstunnel.conf

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

[mail-pop3]

client = yes

accept = 127.0.0.1:110

connect = pop.mail.ru:995

[mail-smtp]

client = yes

accept = 127.0.0.1:587

connect = smtp.mail.ru:465

сберечь отредактированный файл, а далее в незакрытом ранее терминале выполняем

stunnel –reload

этим самым мы обновляем конфигурационный файл.

Ну, а теперь вернемся к указанию SMTP сервера и порта для отправки почты с командной строки, а именно, заменяем

rem SMTP сервер для отправки сообщения, например smtp.mail.ru
set from_server=smtp.inbox.ru
rem Порт SMTP сервера для отправки, например 2525 порт
set from_port=2525

нами ранее строки в файле send.bat на

rem Теперь SMTP сервер это наш компьютер

set from_server=127.0.0.1

rem Порт, взятый из stunnel.conf

set from_port=587

Вот и все, кидаем этот «батник» в Планировщик заданий, привязав к какому то событию, или вставляем все содержимое из send.bat в свой батник, например, который делает что-то полезное, и будет вам уведомление, что что-то полезное выполнилось, в моем случае вышло, что один «батник» вызывается Планировщиком, который сначала архивирует файловую базу БД, отправляет БД на фтп сервер и потом отправляет мне сообщение о выполнении.


 

Так же, приведу пример, для общего обозрения отправки электронного письма с помощью Powershell.

Создадим файл name.ps1 куда поместим

$EmailFrom = «Электронный адрес отправителя»

$EmailTo = » Электронный адрес получателя»

$Subject = «Тема сообщения»

$Body = «Текст сообщения»

$SMTPServer = «127.0.0.1 так как и выше, нужно использовать для отправки stunnel»

# 587 здесь иммется ввиду порт, см. выше о stunnel

$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 587)

$SMTPClient.Credentials = New-Object System.Net.NetworkCredential(«Электронный адрес отправителя», «Пароль отправителя»);

$SMTPClient.Send($EmailFrom, $EmailTo, $Subject, $Body)

Send-MailMessage -From $EmailFrom -To $EmailTo  -Subject $Subject -Body $Body -SmtpServer $SMTPServer

14 Comments

  1. didkovskij

    Аналогичным образом использую blat для отправки уведомлений о наличие свободного места на серверах, их перезагрузки и т.д.

    Reply
  2. premierex

    А у меня почему-то отправка из 1С 8.2 не взлетела….

    Reply
  3. jaroslav.h

    (2) premier, в смысле? тут отправка через 1с-ку не описана, имелось ввиду отправка из ком.строки + повершел

    Reply
  4. jaroslav.h

    (1) didkovskij, поделитесь каким образом вычисляете окончания свободного места?

    Reply
  5. ashvik

    (1) Тоже интересно

    Reply
  6. blackhole321

    $SMTPServer = «127.0.0.1 так как и выше, нужно использовать для отправки stunnel»

    Для использование ssl в случае PowerShell, stunnel не требуется. Используйте $SMTPClient.EnableSsl = $true

    https://msdn.microsoft.com/ru-ru/library/system.net.mail.smtpclient.enablessl(v=vs.110).aspx

    Reply
  7. premierex

    (3) а какая разница какой будет почтовый клиент? Главное в этой теме то, что stunnel выполняет функцию прокси сервера с SSL шифрованием.

    Кстати, покопавшись в настройках, удалось-таки настроить работу с почтой через stunnel из 1С. Может, конечно, не совсем в тему публикации, но, повторюсь: в теме публикации главное — отправка почты с SSL шифрованием. А какой почтовый клиент — не важно.

    Reply
  8. BenjaminFranklin

    (4) в cmd можно так

    FOR /F «skip=2 delims=» %a IN (‘fsutil volume diskfree c:’) DO @SET str=%a
    ECHO %str:~32%

    на выходе будет строка с числом определяющим остаток свободного места на диске с: в байтах.

    для МБ делим это число два раза на 1024. для ГБ три раза.

    Reply
  9. jaroslav.h

    (7) premier, если вы о ССЫЛКА то где то и на этом ресурсе видел аналогичные способы

    Reply
  10. premierex

    (9) да, в данном случае я об этом. И на инфостарте, кстати, тоже нашёл пример.

    В тему публикации: есть ещё один способ отправки электронной почты из командной строки — объект Windows CDO.Message.

    С его помощью также можно отправлять почту, используя шифрование. Я, например, делаю это с помощью Windows Script Host.

    Пишется скрипт на jscript или vbscript (я предпочитаю jscript). В него в качестве аргументов передаем параметры (в примере они объявлены как переменные, но их можно и как аргументы передавать). И так же, как описано выше, создаем задание в планировщике, где вызываем csript.exe путь_к_нашему_скрипту аргументы. Файл csript.exe находится в системном каталоге Windows, так что полный путь до него можно и не указывать.

    Reply
  11. le_

    Через CDO.Message, по-моему, удобнее и устанавливать ничего дополнительно не нужно.

    Вот пример с шифрованием пароля в скрипте.

    Set objMessage = CreateObject(«CDO.Message»)
    objMessage.Subject = «Тема сообщения»
    objMessage.From = «my_acc@gmail.com»
    objMessage.To = «my_acc@gmail.com»
    objMessage.HTMLBody = «Текст сообщения.»
    
    objMessage.Configuration.Fields.Item(«http://schemas.microsoft.com/cdo/configuration/smtpserver»).Value = «smtp.gmail.com»
    objMessage.Configuration.Fields.Item(«http://schemas.microsoft.com/cdo/configuration/smtpserverport»).Value = 465
    objMessage.Configuration.Fields.Item(«http://schemas.microsoft.com/cdo/configuration/sendusing»).Value = 2
    objMessage.Configuration.Fields.Item(«http://schemas.microsoft.com/cdo/configuration/smtpauthenticate»).Value = 1
    objMessage.Configuration.Fields.Item(«http://schemas.microsoft.com/cdo/configuration/smtpusessl»).Value = true
    objMessage.Configuration.Fields.Item(«http://schemas.microsoft.com/cdo/configuration/sendusername»).Value = «my_acc@gmail.com»
    objMessage.Configuration.Fields.Item(«http://schemas.microsoft.com/cdo/configuration/sendpassword»).Value = D(«sЎRЮ¬ЩgT», «‘njghjcnjgfhjkm»)
    
    objMessage.Configuration.Fields.Update
    
    objMessage.Send
    
    Function D(str,key)
    Dim lenKey, KeyPos, LenStr, x, Newstr
    
    Newstr = «»
    lenKey = Len(key)
    KeyPos = 1
    LenStr = Len(Str)
    
    str=StrReverse(str)
    For x = LenStr To 1 Step -1
    Newstr = Newstr & chr(asc(Mid(str,x,1)) — Asc(Mid(key,KeyPos,1)))
    KeyPos = KeyPos + 1
    If KeyPos > lenKey Then KeyPos = 1
    Next
    Newstr=StrReverse(Newstr)
    D = Newstr
    End Function

    Показать

    Reply
  12. jaroslav.h

    (11) le_, отлично, пускай множество вариантов отправки будет приведено, спасибо

    Reply
  13. viptextil

    Ну, тогда в комментах тоже отмечусь. Для отправки использую консольную программу отправки почты Mailsend она умеет работать по ssl без stunnel.

    Reply
  14. user966382

    (11)

    //schemas.microsoft.com/cdo/configuration/sendpassword»).Value = D(«sЎRЮ¬ЩgT», «‘njghjcnjgfhjkm»)

    Я так понял что это не реальный а уже зашифрованный пароль, а как его получить чтобы вбить в эту строку?

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *