Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Отправить письмо с вложением.

Ответить
Настройки темы
CMD/BAT - [решено] Отправить письмо с вложением.

Аватара для uptk

Пользователь


Сообщения: 124
Благодарности: 1

Профиль | Отправить PM | Цитировать


Как можно реализовать сабж, с использованием CMD.

Без использования сторонних программ - утилит. Возможно использование PowerShell.

Суть такова:
Есть bat файл, который ведет лог своей работы и в конце работы делает call Send-Log-Email.bat
Send-Log-Email.bat должен отправить на почту лог предидущего бат файла.

Как реализовать в бат файле отправку письма с вложением?

-------
Надо зделать усилие, а дальше будет легче.


Отправлено: 17:13, 20-11-2009

 

Старожил


Сообщения: 426
Благодарности: 108

Профиль | Отправить PM | Цитировать


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

Лично для себя - отправляю логи через ftp (есть у многих хостеров с бесплатной почтой). Могу поделиться одним из:
Батник на удаленном объекте по Шедулу паковал архив с некой базой и логом и отправлял его на ftp сервер (используется до сих пор). В главном офисе другой батник (также по Шедулу, но на пару часов позже) скачивал и распаковывал архив.
При необходимости апдейта версии или прочих "действиях" на удаленном объекте, батник поддерживает передачу 2х файлов - один из них батник апдейта, а другой - некоторые данные, например архив.
Пересылка
Код: Выделить весь код
@Echo Off
echo MyLogin>SendBase.ftp
echo MyPassword>>SendBase.ftp
echo binary>>SendBase.ftp
echo delete MyBase.rar>>SendBase.ftp
echo send MyBase.rar>>SendBase.ftp
echo recv UpDate._>>SendBase.ftp
echo delete UpDate._>>SendBase.ftp
echo recv UpDate.upd>>SendBase.ftp
echo delete UpDate.upd>>SendBase.ftp
echo bye>>SendBase.ftp

set DB=\\DataServer\MyBase\
set RAR="C:\Program Files\WinRAR\WinRAR.exe"

echo ========== %Date% %Time% ==========>>%DB%MyBase.log
del /Q MyBase.rar>>%DB%MyBase.log
%RAR% a -r -dh -m5 -mdg MyBase.rar %DB%*.*>>%DB%MyBase.log
ftp -i -s:SendBase.ftp ftp.MyFtpServer>>%DB%MyBase.log
del /Q SendBase.ftp

if not exist UpDate._ goto End
echo Starting UpDate module>>%DB%MyBase.log
del /Q UpDate.bat>nul
copy /y UpDate._ UpDate.bat>>%DB%MyBase.log
del /Q UpDate._>nul
UpDate.bat
:End
echo.>>%DB%MyBase.log
echo.>>%DB%MyBase.log
Ну а если FTP не катит - могу поделиться старой памяткой МТУшников для работы с почтой без клиента (не было у них веб-интерфейса):
Код: Выделить весь код
Работа с почтовым ящиком через Telnet. 

Чтобы немножко разобраться какие команды дает 
Ваш почтовый клиент pop/smtp-серверу при 
отправке/получение почты, я написал эту статью. 
Теперь я хочу добавить, что протокол POP 
использует 110 порт, а SMTP - 25. Где же 
вводить команды и какие команды? Команды 
можно вводить в любой телнет-программе, 
я опишу как это можно сделать с помощью 
встроенной в Windows программы Telnet. 
Чтобы вызвать эту программу выполните 
следующие действия: зайдите в меню "ПУСК", 
затем "Выполнить" и набираете "telnet". 
В результате Вы видите перед собой такой экран: 
Теперь заходите в раздел меню 
"Подключение(Подключить)" и выбираете пункт 
меню "Удаленная система". Появилось новое 
окно: В него вводите адрес сервера, порт 
вписываете тот что Вам нужен, еще раз 
напомню: POP - 110 порт - чтение почты 
SMTP - 25 порт - оправка почты Тип 
терминала оставляете - vt100. И жмите 
на кнопку "Подключить". Работа с POP(110 порт)
по Telnetу. Появляется приглашение сервера и 
Вы вводите логин и пароль, ввод производится 
следующим образом: набираете "USER логин", 
затем вводите пароль: "PASS пароль". Тут 
появляется проблема, пароль отображается 
на экране в том же виде в котором Вы его
вводите, а значит любой человек, который 
находится рядом сможет увидеть Ваш пароль. 
Что же надо сделать что бы не было видно 
пароля при вводе? Просто заходите в пункт 
меню "Терминал", дальше в раздел "Параметры" 
и убираете там галку напротив "Отображение 
ввода", и теперь спокойно вводите пароль, 
только не забудьте после ввода пароля галочку 
поставить обратно. Команды возможно выполнять 
подключившись к серверу по POP: STAT 
Запрашивает и выводит информацию о количестве 
непрочитанных сообщений и их размер в байтах. 
RETR n Показывает сообщение номер n. DELE n 
Удаляет сообщение номер n. LAST Запрашивает 
номер последнего прочитанного сообщения. 
LIST (n) Запрашивает информацию о размере 
сообщения номер n или о размере всех 
сообщений.. RSET Восстанавливает удаленные 
сообщения и устанавливает счетчик сообщений 
в 1. TOP n Печатает заголовок и первую строку 
сообщения n. NOOP Режим ожидания. HELP Вывод 
помощи и используемых команд. QUIT Завершение 
сеанса. Работа с SMTP(25 порт) по Telnetу или 
отправка почты. После подключения к серверу 
Вам не надо вводить логин и пароль как при 
подключение по POP, аутентификация происходит 
после того как Вы "приветствуете" сервер 
командой "HELO сервер отправителя", иногда 
сервер индетифицирует пользователя по команде 
"MAIL from: e-mail-адрес отправителя". Следующей 
командой Вы определяете получателя - 
"RCPT to: адрес@получателя". После того как 
системе стал известен оправитель и получатель 
можно начать писать свое сообщение. Начало 
сообщения задается командой "DATA" без параметров,
потом Вы вводите текст сообщения, закончить надо 
вводом "." и нажатием за ней клавиши "Enter" на 
новой строчке. Все, сообщение отправлено! А вот 
список команд, которые можно выполнять на сервере,
подключившись к нему по SMTP: HELO 
сервер-отправитель Идентифицирует SMTP-сервер 
отправителя. MAIL FROM адрес@отправителя Задает 
адрес отправителя. RCPT TO: адрес@получателя 
Задает адрес получателя. DATA Указывает на 
начало сообщения. Для окончания сообщения 
указывается (.). RSET Прерывает передачу 
сообщения. VRFY email@адрес Проверяет 
существование почтового ящика, но на 
большинстве эта опция закрыта или выполняется
автоматически при вводе команды: 
"RCPT to: адрес@получателя" . EXPN <> 
Запрашивает список адресов электронной почты. 
HELP Запрашивает online-помощь. Выводит 
описание команд, реализованных в системе. 
QUIT Завершает SMTP-сеанс. Cписок ответов, 
возращаемых сервером при подключении по 
SMTP: 211 Статус системы 214 Сообщение помощи 
220 Сервер готов к выполнению команд 
221 Закрытие канала передачи 250 Требуемые 
действия, выполнены успешно 251 Не локальный 
пользователь; отправить по заданному пути 
354 Приглашение ввести текст сообщения и по 
завершению письма ввести "." на новой строчке 
и нажать Enter 421 Не предусмотрено системой 
и закрытие канала 450 Команда не выполнена 
по причине занятости ящика 451 Требуемое 
действие прервано из-за локальной ошибки 
452 Требуемое действие не выполнено из-за 
недостатка ресурсов 500 Синтаксическая ошибка,
команда не распознана 501 Синтаксическая ошибка 
в параметрах 502 Команда не выполнена 
503 Неправильная последовательность команд 
504 Параметры команды не выполнены 
550 Действия не выполнены, ящик не доступен 
551 Пользователь не локальный; пожалуйста 
попробуйте этот путь 552 Действие прервано 
из-за превышения объема 553 Требуемое действие 
прервано: неправильно введено имя ящика 
554 Задание не выполнено
Это сообщение посчитали полезным следующие участники:

Отправлено: 19:48, 20-11-2009 | #2



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

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


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


Цитата uptk:
Возможно использование PowerShell »
Код: Выделить весь код
$emailFrom = "user@yourdomain.com"
$emailTo = "user@yourdomain.com"
$subj = "your subject"
$body = "your body"
$file = "c:\file.txt"
$smtpServer = "your smtp server"

$att  = new-object Net.Mail.Attachment($file)
$smtp = new-object Net.Mail.SmtpClient($smtpServer)
$msg  = new-object Net.Mail.MailMessage

$msg.From = $emailFrom
$msg.To.Add($emailTo)
$msg.Subject = $subj
$msg.Body = $body
$msg.Attachments.Add($att)

$smtp.Send($msg)
$att.Dispose()
Это сообщение посчитали полезным следующие участники:

Отправлено: 09:14, 22-11-2009 | #3


Пользователь


Сообщения: 72
Благодарности: 27

Профиль | Сайт | Отправить PM | Цитировать


Быть может Вам подойдет не PowerShell, а VBS/WSH? Вот тут пример есть: Примеры скриптов для администрирования
Скрипт сжимает указанную папку с логами и отправляет по указанному адресу.
Недостатки решения:
- использование внешней утилиты сжатия 7z.exe;
- необходимость Exchange server в организации.
Код: Выделить весь код
' === Script Information Header ===
' Script Name: SendArchive.vbs
' Date:        19.10.09
' Author:      Виталий Бочкарев
' Description: Скрипт сжатия папки и отправки архива по почте

' === Initialization Block ===
Option Explicit
On Error Resume Next
Dim mWorkDir, mCommand
Dim oShell, oFSO, oEmail
Const mFolderToCompress = "C:\Test Folder\*"
Const mArhiveName = "Attachment.zip"
Const mFrom = "script@domain.com"
Const mTo = "user@domain.com"
Const mSubject = "Letter Subject"
Const mTextBody = "Look the attachment."
Const mSMTPServer = "mail.domain.com"
Const mSMTPport = 25

' ==== Script Main Logic ====
' Создание объекта оболочки
Set oShell = CreateObject("WScript.Shell")
' Создание объекта файловой системы
Set oFSO = CreateObject("Scripting.Filesystemobject")
' Создание объекта почтового сообщения
Set oEmail = CreateObject("CDO.Message")
' Получение рабочей директории скрипта
mWorkDir = Left(WScript.ScriptFullName,Len(WScript.ScriptFullName)-Len(WScript.ScriptName))
' Составление команды для упаковки указанной директории
mCommand = """" & mWorkDir & "7z.exe""" & " a -y " & """" & mWorkDir & mArhiveName _
  & """ """ & mFolderToCompress & """"
' Упаковка директории
Call oShell.Run(mCommand, 0, True)
' Составление почтового сообщения
oEmail.From = mFrom
oEmail.To = mTo
oEmail.Subject = mSubject
oEmail.Textbody = mTextBody
' Прикрепление архива к сообщению
Call oEmail.AddAttachment(mWorkDir & mArhiveName)
' Настройка почтового канала
oEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/" & _
  "cdo/configuration/sendusing") = 2
oEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/" & _
  "cdo/configuration/smtpserver") = mSMTPServer
oEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/" & _
  "cdo/configuration/smtpserverport") = mSMTPport
oEmail.Configuration.Fields.Update
' Отправка сообщения
oEmail.Send
WScript.Sleep 300
' Удаление архива
Call oFSO.DeleteFile(mWorkDir & mArhiveName, True)

-------
Статьи для системных инженеров http://www.sysengineering.ru


Последний раз редактировалось vitaliyboch, 16-12-2009 в 07:54.

Это сообщение посчитали полезным следующие участники:

Отправлено: 08:31, 23-11-2009 | #4


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


Цитата vitaliyboch:
Недостатки решения:
- использование внешней утилиты сжатия 7z.exe;
- необходимость Exchange server в организации. »
- упаковывать никто не обязывает;
- тут отправка по SMTP, не вижу необходимости в Exchange.

Отправлено: 08:58, 23-11-2009 | #5


Аватара для uptk

Пользователь


Сообщения: 124
Благодарности: 1

Профиль | Отправить PM | Цитировать


Цитата amel27:
$emailFrom = "user@yourdomain.com"
$emailTo = "user@yourdomain.com"
$subj = "your subject"
$body = "your body"
$file = "c:\file.txt"
$smtpServer = "your smtp server"
$att = new-object Net.Mail.Attachment($file)
$smtp = new-object Net.Mail.SmtpClient($smtpServer)
$msg = new-object Net.Mail.MailMessage
$msg.From = $emailFrom
$msg.To.Add($emailTo)
$msg.Subject = $subj
$msg.Body = $body
$msg.Attachments.Add($att)
$smtp.Send($msg)
$att.Dispose() »
В *.bat файле имя файла с логом формируеться по текущей дате
Код: Выделить весь код
Log_BackUp-%DATE:~-10%.txt
имя файла выглядит, так
Код: Выделить весь код
Log_BackUp-23.11.2009.txt
подскажите, как передать в скрипт PowerShell-a, подобное имя?

-------
Надо зделать усилие, а дальше будет легче.


Отправлено: 17:33, 23-11-2009 | #6


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


Цитата uptk:
имя файла с логом формируеться по текущей дате »
Код: Выделить весь код
$file = "Log_BackUp-" + (Get-Date -format "dd.mm.yyyy") + ".txt"
Это сообщение посчитали полезным следующие участники:

Отправлено: 05:45, 24-11-2009 | #7


Аватара для uptk

Пользователь


Сообщения: 124
Благодарности: 1

Профиль | Отправить PM | Цитировать


Как использовать авторизацию на почтовом сервере?

Можно использовать почтовый сервер для отправки без авторизации, но он находится в другой сети и не всегда может быть доступен.
А почтовый сервер, который находиться в одной сети с машиной на которой это будет работать, требует авторизации.

Подскажите как прикрутить авторизацию в скрипте.

-------
Надо зделать усилие, а дальше будет легче.


Отправлено: 10:32, 24-11-2009 | #8


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


Цитата uptk:
как прикрутить авторизацию в скрипте »
может так?... проверить пока нет возможности
Код: Выделить весь код
$smtp.Credentials = new-object Net.NetworkCredential("user", "password")
Это сообщение посчитали полезным следующие участники:

Отправлено: 11:04, 24-11-2009 | #9


Аватара для uptk

Пользователь


Сообщения: 124
Благодарности: 1

Профиль | Отправить PM | Цитировать


Цитата amel27:
$file = "Log_BackUp-" + (Get-Date -format "dd.mm.yyyy") + ".txt" »
с такой конструкцией возникли "козявки" в секции (Get-Date -format "dd.mm.yyyy") выводились минуты.

Исправил на вот такое
Код: Выделить весь код
(Get-Date -uformat "%d.%m.%Y")
С авторизацией попробую, отпишусь.

-------
Надо зделать усилие, а дальше будет легче.


Отправлено: 11:38, 24-11-2009 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Отправить письмо с вложением.

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
[решено] Как отправить письмо с вложением? CyberStyLe AutoIt 5 10-02-2010 06:26
[решено] не могу с одного ящика отправить письмо на один ящик asci Хочу все знать 7 22-10-2009 13:01
как отправить письмо? AnGel_of_Death Хочу все знать 6 06-06-2006 23:50
Не отправить письмо через mail.ru Anatoly Belov Хочу все знать 2 07-03-2006 13:56
Как беспомощи PHP и Perl отправить письмо с прикрепленным фа Xcode Программирование и базы данных 3 20-11-2003 19:33




 
Переход