Компьютерный форум 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=157748)

uptk 20-11-2009 17:13 1275795

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

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

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

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

NiOl 20-11-2009 19:48 1275936

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

Лично для себя - отправляю логи через 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 Задание не выполнено


amel27 22-11-2009 09:14 1276993

Цитата:

Цитата 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()


vitaliyboch 23-11-2009 08:31 1277738

Быть может Вам подойдет не 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)


amel27 23-11-2009 08:58 1277751

Цитата:

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

- упаковывать никто не обязывает;
- тут отправка по SMTP, не вижу необходимости в Exchange.

uptk 23-11-2009 17:33 1278168

Цитата:

Цитата 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, подобное имя?

amel27 24-11-2009 05:45 1278603

Цитата:

Цитата uptk
имя файла с логом формируеться по текущей дате »

Код:

$file = "Log_BackUp-" + (Get-Date -format "dd.mm.yyyy") + ".txt"

uptk 24-11-2009 10:32 1278745

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

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

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

amel27 24-11-2009 11:04 1278763

Цитата:

Цитата uptk
как прикрутить авторизацию в скрипте »

может так?... проверить пока нет возможности
Код:

$smtp.Credentials = new-object Net.NetworkCredential("user", "password")

uptk 24-11-2009 11:38 1278785

Цитата:

Цитата amel27
$file = "Log_BackUp-" + (Get-Date -format "dd.mm.yyyy") + ".txt" »

с такой конструкцией возникли "козявки" в секции (Get-Date -format "dd.mm.yyyy") выводились минуты.

Исправил на вот такое
Код:

(Get-Date -uformat "%d.%m.%Y")
С авторизацией попробую, отпишусь.

uptk 24-11-2009 18:06 1279036

C авторизацией оказалось совсем по другому, чем думал.

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

В остальном все хорошо, всем спасибо!

ameelien 16-09-2012 14:39 1989625

Камрады, а как сделать отправку без внешнего SMTP?
Может как то срипт надо пделать так, что бы локальная машина выступала в роли SMTP сервера и отправка шла от localhost?

Iska 16-09-2012 20:18 1989835

ameelien, элементарно. Разверните на локальной машине smtp-сервер.

Можете, конечно, попробовать и без него, но, скорее всего, принимающий сервер такое письмо попросту отвергнет.

vova_kansk 02-10-2013 08:50 2227217

я сделал так, когда вызывается батник с параметрами он собирает vbs файлик запускает его а потом грохает
пример VBS взят кстати с этой темы
читать дальше »
echo off

echo off

mode con codepage select=1251 > nul

rem ============== установить рабочую папку для скрипта ==================
cd c:
cd "C:\Documents and Settings\Администратор\Рабочий стол\"

rem ============== отправка почты ===================================
echo Const EmailFrom = "******@ya.ru" ' от кого будет отправляться e-mail >>%1.vbs
echo Const EmailPassword = "пароль от почты" ' пароль от e-mail >>%1.vbs
echo Const strSmtpServer = "smtp.yandex.ru" ' smtp сервер >>%1.vbs
echo Const EmailTo = "7913******@sms.mtslife.ru" ' Кому будет отправляться e-mail >>%1.vbs
echo Set objEmail = CreateObject("CDO.Message") >>%1.vbs
echo objEmail.From = EmailFrom >>%1.vbs
echo objEmail.To = EmailTo >>%1.vbs

echo objEmail.Subject = "%DATE% %TIME%" 'тема письма >>%1.vbs

echo objEmail.Textbody = "-"%1"-" 'текст письма тореннт передает параметр уже в кавычках >>%1.vbs

'echo objEmail.AddAttachment "C:\Documents and Settings\Администратор\Рабочий стол\00.txt" 'прикрепить файл к письму >>%1.vbs

echo objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2 >>%1.vbs
echo objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1 >>%1.vbs
echo objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusername") = EmailFrom >>%1.vbs
echo objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendpassword") = EmailPassword >>%1.vbs
echo objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = strSmtpServer >>%1.vbs
echo objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25 >>%1.vbs
echo objEmail.Configuration.Fields.Update >>%1.vbs
echo objEmail.Send >>%1.vbs
echo WScript.Quit >>%1.vbs

rem запуск отправки и уничтожение
%1.vbs
del %1.vbs
rem ================= конец отправка почты =================



Время: 04:39.

Время: 04:39.
© OSzone.net 2001-