gifts2017

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

Опубликовал Ярослав Володимирович (myr4ik07) в раздел Администрирование - Системное

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

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

rem Так как мы скопировали туда куда надо файлы архива то ниже строку не меняем
set file_blat=blat.exe
rem Предварительно создаем файл report.txt, где описываем текст сообщения
set file_text=D:\report.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)\stunnel\stunnel.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

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Дмитрий Дидковский (didkovskij) 02.10.15 07:54
Аналогичным образом использую blat для отправки уведомлений о наличие свободного места на серверах, их перезагрузки и т.д.
2. Максим *** (premier) 02.10.15 09:24
А у меня почему-то отправка из 1С 8.2 не взлетела....
3. Ярослав Володимирович (myr4ik07) 02.10.15 10:14
(2) premier, в смысле? тут отправка через 1с-ку не описана, имелось ввиду отправка из ком.строки + повершел
4. Ярослав Володимирович (myr4ik07) 02.10.15 10:23
(1) didkovskij, поделитесь каким образом вычисляете окончания свободного места?
5. ash (ashvik) 02.10.15 11:10
6. Юрий Дешин (blackhole321) 04.10.15 17:45
$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
myr4ik07; +1 Ответить
7. Максим *** (premier) 05.10.15 13:56
(3) myr4ik07, а какая разница какой будет почтовый клиент? Главное в этой теме то, что stunnel выполняет функцию прокси сервера с SSL шифрованием.
Кстати, покопавшись в настройках, удалось-таки настроить работу с почтой через stunnel из 1С. Может, конечно, не совсем в тему публикации, но, повторюсь: в теме публикации главное - отправка почты с SSL шифрованием. А какой почтовый клиент - не важно.
8. Дмитрий Недоступно (BenjaminFranklin) 05.10.15 14:10
(4) myr4ik07, в cmd можно так
FOR /F "skip=2 delims=" %a IN ('fsutil volume diskfree c:') DO @SET str=%a
ECHO %str:~32%

на выходе будет строка с числом определяющим остаток свободного места на диске с: в байтах.
для МБ делим это число два раза на 1024. для ГБ три раза.
myr4ik07; +1 Ответить
9. Ярослав Володимирович (myr4ik07) 05.10.15 22:38
(7) premier, если вы о ССЫЛКА то где то и на этом ресурсе видел аналогичные способы
10. Максим *** (premier) 07.10.15 09:06
(9) myr4ik07, да, в данном случае я об этом. И на инфостарте, кстати, тоже нашёл пример.
В тему публикации: есть ещё один способ отправки электронной почты из командной строки - объект Windows CDO.Message.
С его помощью также можно отправлять почту, используя шифрование. Я, например, делаю это с помощью Windows Script Host.
Пишется скрипт на jscript или vbscript (я предпочитаю jscript). В него в качестве аргументов передаем параметры (в примере они объявлены как переменные, но их можно и как аргументы передавать). И так же, как описано выше, создаем задание в планировщике, где вызываем csript.exe путь_к_нашему_скрипту аргументы. Файл csript.exe находится в системном каталоге Windows, так что полный путь до него можно и не указывать.
Прикрепленные файлы:
sendmail.js
7OH; le_; +2 Ответить
11. Евгений (le_) 07.10.15 09:22
Через 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
...Показать Скрыть
Прикрепленные файлы:
Отправка почты CDO.vbs
12. Ярослав Володимирович (myr4ik07) 07.10.15 09:27
(11) le_, отлично, пускай множество вариантов отправки будет приведено, спасибо
viptextil; +1 Ответить
13. Виктор Пинчуков (viptextil) 06.05.16 09:35
Ну, тогда в комментах тоже отмечусь. Для отправки использую консольную программу отправки почты Mailsend она умеет работать по ssl без stunnel.
myr4ik07; +1 Ответить
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа