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

01.10.15

База данных - Инструменты администратора БД

Мне, как и вам, небось, хотелось получать уведомление по электронной почте об успешном исполнении какого-то действия. Например, после сохранении резервной копии файловой БД 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

E-MAIL Почта cmd Powershell

См. также

Автоподбор ролей для профилей и групп доступа в любых типовых базах 1С УТ 11, КА 2, ERP2, Розница 2/3, УНФ 16/3, БП 3, ЗУП 3 и подобных (УФ, Платформа 8.3.14+)

Инструменты администратора БД Роли и права 8.3.14 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:Документооборот 1С:Зарплата и кадры государственного учреждения 3 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Платные (руб)

Роли… Вы тратите много времени и сил на подбор ролей среди около 2400 в ERP или 1500 в Рознице 2, пытаясь понять какими правами они обладают? Вы все время смотрите права в конфигураторе или отчетах чтоб создать нормальные профили доступа? Вы хотите наглядно видеть какие права дает профиль и редактировать все в простом виде? А может хотите просто указать подсистему и дать права на просмотр и добавление на объекты и не лезть в дебри прав и чтоб обработка сама подобрала нужные роли? Все это теперь стало возможно! Обновление от 15.12.2023, версия 1.1.

12000 руб.

06.12.2023    2762    11    1    

30

"Акты сверки +" Групповая подготовка и рассылка актов сверки для Бухгалтерии 3.0.

Взаиморасчеты Email рассылки Акт сверки Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 3.0 Бухгалтерский учет Платные (руб)

Внешняя обработка для Бухгалтерии 3.0 - позволяет автоматически формировать документы «Акт сверки расчетов» с контрагентами за выбранный период с последующей фоновой отправкой на почту контрагента.

3000 руб.

25.11.2020    21987    157    4    

146

Infostart УДиФ: Управление данными и формами

Инструменты администратора БД Инструментарий разработчика Роли и права Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

Расширение позволяет без изменения кода конфигурации выполнять проверки при вводе данных, скрывать от пользователя недоступные ему данные, выполнять код в обработчиках. Не изменяет данные конфигурации, легко устанавливается практически на любую конфигурацию на управляемых формах.

10000 руб.

10.11.2023    3251    10    1    

31

SALE! 30%

PowerTools

Инструментарий разработчика Инструменты администратора БД Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Россия Платные (руб)

Универсальный инструмент программиста для администрирования конфигураций. Сборник наиболее часто используемых обработок под единым интерфейсом.

3600 2520 руб.

14.01.2013    177345    1070    0    

846

Email, SMS, Telegram рассылки из 1С - Директ Маркетинг

Управление взаимоотношениями с клиентами (CRM) Мессенджеры и боты SMS рассылки Email рассылки Платформа 1С v8.3 Конфигурации 1cv8 Управленческий учет Платные (руб)

Полный набор инструментов для качественных транзакционных и маркетинговых Email, SMS, Telegram рассылок из 1С. Даже простые уведомления об оплате счетов способны существенно упростить сбор дебиторской задолженности. Применение всех возможностей прямого маркетинга выводит коммуникацию с клиентами, уровень сервиса и лояльность на новый уровень.

7788 руб.

07.04.2014    83521    40    191    

127

Ускоренное проведение документов (x4), устранение ошибок 60/62 счетов и зачет авансов (Бухгалтерия 3.0)

Закрытие периода Инструменты администратора БД Корректировка данных Бухгалтерский учет 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

Расширение «Оперативное проведение» в 4 раза уменьшает время проведения документов и закрытия месяца. Является комплексным решением проблем 62 и 60 счетов. Оптимизирует проведение при включенной функциональной опции «Раздельный учет НДС». Используется в более 10 организациях уже 2 года. Совместимо с конфигурацией Бухгалтерия 3.0 (+КОРП).

14400 руб.

29.04.2020    27169    78    146    

59
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. didkovskij 44 02.10.15 07:54 Сейчас в теме
Аналогичным образом использую blat для отправки уведомлений о наличие свободного места на серверах, их перезагрузки и т.д.
4. jaroslav.h 180 02.10.15 10:23 Сейчас в теме
(1) didkovskij, поделитесь каким образом вычисляете окончания свободного места?
8. BenjaminFranklin 05.10.15 14:10 Сейчас в теме
(4) в cmd можно так
FOR /F "skip=2 delims=" %a IN ('fsutil volume diskfree c:') DO @SET str=%a
ECHO %str:~32%

на выходе будет строка с числом определяющим остаток свободного места на диске с: в байтах.
для МБ делим это число два раза на 1024. для ГБ три раза.
Pyhar; jaroslav.h; +2 Ответить
5. ashvik 02.10.15 11:10 Сейчас в теме
2. premierex 204 02.10.15 09:24 Сейчас в теме
А у меня почему-то отправка из 1С 8.2 не взлетела....
3. jaroslav.h 180 02.10.15 10:14 Сейчас в теме
(2) premier, в смысле? тут отправка через 1с-ку не описана, имелось ввиду отправка из ком.строки + повершел
7. premierex 204 05.10.15 13:56 Сейчас в теме
(3) а какая разница какой будет почтовый клиент? Главное в этой теме то, что stunnel выполняет функцию прокси сервера с SSL шифрованием.
Кстати, покопавшись в настройках, удалось-таки настроить работу с почтой через stunnel из 1С. Может, конечно, не совсем в тему публикации, но, повторюсь: в теме публикации главное - отправка почты с SSL шифрованием. А какой почтовый клиент - не важно.
9. jaroslav.h 180 05.10.15 22:38 Сейчас в теме
(7) premier, если вы о ССЫЛКА то где то и на этом ресурсе видел аналогичные способы
10. premierex 204 07.10.15 09:06 Сейчас в теме
(9) да, в данном случае я об этом. И на инфостарте, кстати, тоже нашёл пример.
В тему публикации: есть ещё один способ отправки электронной почты из командной строки - объект Windows CDO.Message.
С его помощью также можно отправлять почту, используя шифрование. Я, например, делаю это с помощью Windows Script Host.
Пишется скрипт на jscript или vbscript (я предпочитаю jscript). В него в качестве аргументов передаем параметры (в примере они объявлены как переменные, но их можно и как аргументы передавать). И так же, как описано выше, создаем задание в планировщике, где вызываем csript.exe путь_к_нашему_скрипту аргументы. Файл csript.exe находится в системном каталоге Windows, так что полный путь до него можно и не указывать.
Прикрепленные файлы:
sendmail.js
7OH; le_; +2 Ответить
6. blackhole321 1303 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
jaroslav.h; +1 Ответить
11. le_ 237 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
dima532301; jaroslav.h; +2 Ответить
12. jaroslav.h 180 07.10.15 09:27 Сейчас в теме
(11) le_, отлично, пускай множество вариантов отправки будет приведено, спасибо
viptextil; +1 Ответить
14. user966382 27.04.18 10:53 Сейчас в теме
(11)
//schemas.microsoft.com/cdo/configuration/sendpassword").Value = D("sЎRЮ¬ЩgT", "'njghjcnjgfhjkm")

Я так понял что это не реальный а уже зашифрованный пароль, а как его получить чтобы вбить в эту строку?
13. viptextil 40 06.05.16 09:35 Сейчас в теме
Ну, тогда в комментах тоже отмечусь. Для отправки использую консольную программу отправки почты Mailsend она умеет работать по ssl без stunnel.
Tangram; jaroslav.h; +2 Ответить
15. user1338585 08.02.22 23:29 Сейчас в теме
Через павершел получилось отправить через яндекс почту напрямую:
$EmailTo = "po4ta@mail.ru"
$EmailFrom = "PowerShell mymail@yandex.ru"
$Subject = "Отправка из PowerShell"
$Body = "Тестовое сообщение, отправленное из командной строки PowerShell"
$SMTPServer = "smtp.yandex.ru"
$filenameAndPath = "C:\Users\777\Downloads\003435.pdf"
$SMTPMessage = New-Object System.Net.Mail.MailMessage($EmailFrom,$EmailTo,$Subject,$Body)
$attachment = New-Object System.Net.Mail.Attachment($filenameAndPath)
$SMTPMessage.IsBodyHTML=$true
$SMTPMessage.Attachments.Add($attachment)
$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 587)
$SMTPClient.EnableSsl = $true
$SMTPClient.Credentials = New-Object System.Net.NetworkCredential("mymail@ya.ru", "mymail123");
$SMTPClient.Send($SMTPMessage)
Оставьте свое сообщение