Как отправить простое электронное письмо из пакетного файла Windows? - PullRequest
28 голосов
/ 27 января 2012

Я использую Windows 2003 Service Pack 2. У меня есть командный файл, который запускается по требованию. Я хочу, чтобы электронная почта отправлялась каждый раз, когда запускается пакетный файл. Письмо простое, просто предложение, указывающее, что пакетный файл запущен; это то же самое каждый раз.

Я попробовал пару вещей, чтобы сделать это. Я думал о telnet, но не могу понять, как перенаправить набор команд в telnet; Пакетные файлы Windows не имеют Unix-стиля «здесь документ», и вызов "telnet <scriptfile", где scriptfile содержит команды для отправки электронной почты, не работает. Я также нашел несколько решений в Интернете с использованием CDO.Message, но я никогда не использовал это раньше, и я продолжал получать сообщения об ошибках, которые я не понимаю.

Как я могу отправить простое электронное письмо из пакетного файла Windows?

Ответы [ 6 ]

18 голосов
/ 28 января 2012

Макс идет по правильному пути с предложением использовать Windows Scripting для способа сделать это без установки каких-либо дополнительных исполняемых файлов на машину.Его код будет работать, если у вас настроена служба IIS SMTP для пересылки исходящей электронной почты с использованием параметра «промежуточный узел» или на компьютере также работает Microsoft Exchange.В противном случае, если это не настроено, вы увидите, что ваши электронные письма просто накапливаются в папке очереди сообщений (\ inetpub \ mailroot \ queue).Таким образом, если вы не можете настроить эту службу, вы также сможете указать почтовый сервер, который вы хотите использовать для отправки сообщения.Чтобы сделать это, вы можете сделать что-то вроде этого в вашем файле скрипта Windows:

Set objMail = CreateObject("CDO.Message")
Set objConf = CreateObject("CDO.Configuration")
Set objFlds = objConf.Fields
objFlds.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2 'cdoSendUsingPort
objFlds.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtp.your-site-url.com" 'your smtp server domain or IP address goes here
objFlds.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25 'default port for email
'uncomment next three lines if you need to use SMTP Authorization
'objFlds.Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = "your-username"
'objFlds.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "your-password"
'objFlds.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1 'cdoBasic
objFlds.Update
objMail.Configuration = objConf
objMail.FromName = "Your Name"
objMail.From = "your@address.com"
objMail.To = "destination@address.com"
objMail.Subject = "Email Subject Text"
objMail.TextBody = "The message of the email..."
objMail.Send
Set objFlds = Nothing
Set objConf = Nothing
Set objMail = Nothing
13 голосов
/ 27 января 2012

Я использовал Blat (http://www.blat.net/) много лет. Это простая утилита командной строки, которая может отправлять электронную почту из командной строки. Это бесплатно и с открытым исходным кодом.

Вы можете использовать команду типа "Blat myfile.txt -to fee@fi.com -server smtp.domain.com -port 6000"

Вот некоторые другие программы, которые вы можете попробовать отправить по электронной почте из командной строки (я никогда не использовал их):
http://caspian.dotconf.net/menu/Software/SendEmail/
http://www.petri.co.il/sendmail.htm
http://www.petri.co.il/software/mailsend105.zip
http://retired.beyondlogic.org/solutions/cmdlinemail/cmdlinemail.htm

Здесь (http://www.petri.co.il/send_mail_from_script.htm) вы можете найти другой способ отправки электронной почты из сценария VBS, а также ссылку на некоторые из упомянутых программ

Следующий код VBScript взят с этой страницы

Set objEmail = CreateObject("CDO.Message")
objEmail.From = "me@mydomain.com"
objEmail.To = "you@yourdomain.com"
objEmail.Subject = "Server is down!"
objEmail.Textbody = "Server100 is no longer accessible over the network."
objEmail.Send

Сохранить файл как что-то .vbs

Set Msg = CreateObject("CDO.Message")

With Msg

 .To = "you@yourdomain.com"
 .From = "me@mydomain.com"
 .Subject = "Hello"
 .TextBody = "Just wanted to say hi."
 .Send

End With

Сохранить файл как что-то2.vbs

Я думаю, что эти VBS-скрипты используют почтовый сервер Windows по умолчанию, если он есть. Я не проверял эти сценарии ...

3 голосов
/ 03 мая 2017

Если доступен PowerShell, командлет Send-MailMessage представляет собой одну однострочную команду, которую можно легко вызвать из пакетного файла для обработки уведомлений по электронной почте. Ниже приведен пример строки, которую вы включили бы в свой пакетный файл для вызова сценария PowerShell (%xVariable% - это переменная, которую вы, возможно, захотите передать из своего пакетного файла в сценарий PowerShell):

- [ФАЙЛ ФАЙЛА] -

:: ...your code here...
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe  -windowstyle hidden -command C:\MyScripts\EmailScript.ps1 %xVariable%

Ниже приведен пример того, что вы можете включить в ваш скрипт PowerShell (вы должны включить строку PARAM в качестве первой строки без примечаний в вашем скрипте, если вы включили передачу %xVariable% из вашего пакетного файла:

- [СКРИПТ ОБОЛОЧКИ] -

Param([String]$xVariable)
# ...your code here...
$smtp = "smtp.[emaildomain].com"
$to = "[Send to email address]"
$from = "[From email address]" 
$subject = "[Subject]" 
$body = "[Text you want to include----the <br> is a line feed: <br> <br>]"    
$body += "[This could be a second line of text]" + "<br> "

$attachment="[file name if you would like to include an attachment]"
send-MailMessage -SmtpServer $smtp -To $to -From $from -Subject $subject -Body $body -BodyAsHtml -Attachment $attachment -Priority high  
0 голосов
/ 26 июня 2019

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

Я использую пакетный скрипт для вызова powershell Send-MailMessage

Пакетный скрипт: send_email.bat

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe  -command 'E:\path\send_email.ps1

Скрипт Pwershell send_email.ps1

Send-MailMessage -From "noreply@$env:computername" -To '<target_email@example.com>' -Subject 'Blah Blah' -SmtpServer  'smtp.domain.com'  -Attachments 'E:\path\file.log' -BODY "Blah Blah on Host: $env:computername "
0 голосов
/ 19 июня 2019
$emailSmtpServerPort = "587"
$emailSmtpUser = "username"
$emailSmtpPass = 'password'
$emailMessage = New-Object System.Net.Mail.MailMessage
$emailMessage.From = "[From email address]"
$emailMessage.To.Add( "[Send to email address]" )
$emailMessage.Subject = "Testing e-mail"
$emailMessage.IsBodyHtml = $true
$emailMessage.Body = @"
<p>Here is a message that is <strong>HTML formatted</strong>.</p>
<p>From your friendly neighborhood IT guy</p>
"@
$SMTPClient = New-Object System.Net.Mail.SmtpClient( $emailSmtpServer , $emailSmtpServerPort )
$SMTPClient.EnableSsl = $true
$SMTPClient.Credentials = New-Object System.Net.NetworkCredential( $emailSmtpUser , $emailSmtpPass );
$SMTPClient.Send( $emailMessage )
0 голосов
/ 28 января 2012

Если вы не можете следовать предложению Макса установить Blat (или любую другую утилиту) на ваш сервер, то, возможно, на вашем сервере уже установлено программное обеспечение, которое может отправлять электронные письма.

Я знаю, что и Oracle, и SqlServer имеют возможность отправлять электронную почту. Возможно, вам придется работать с вашим администратором баз данных, чтобы включить эту функцию и / или получить привилегию для ее использования. Конечно, я вижу, как это может представлять свой собственный набор проблем и волокиту. Предполагая, что вы можете получить доступ к этой функции, достаточно просто зарегистрировать пакетный файл в базе данных и отправить почту.

Пакетный файл может легко запустить VBScript через CSCRIPT. Быстрый поиск в Google находит много ссылок, показывающих, как отправлять электронную почту с помощью VBScript. Первый случай, на который мне довелось взглянуть, был http://www.activexperts.com/activmonitor/windowsmanagement/adminscripts/enterprise/mail/. Выглядит прямо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...