我正在运行Windows 2003 Service Pack 2.我有一个按需运行的批处理文件。我希望每次批处理文件运行时都会发送一封电子邮件。电子邮件很简单,只是一个表示批处理文件运行的句子;每次都是一样的。
我已经尝试了几件事来完成这件事。我想到了telnet,但我无法弄清楚如何将一组命令重定向到telnet; Windows批处理文件没有Unix风格的“here here”,并且调用"telnet <scriptfile"
其中 scriptfile 包含发送电子邮件的命令不起作用。我还使用CDO.Message在互联网上找到了几个解决方案,但我以前从未使用过,我不断收到我不理解的错误消息。
如何从Windows批处理文件发送简单的电子邮件?
答案 0 :(得分:18)
Max在他正确的轨道上建议使用Windows Scripting来实现这一目的,而无需在机器上安装任何其他可执行文件。如果您使用“SMTP主机”设置转发出站电子邮件的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
答案 1 :(得分:12)
我多年来一直使用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
将文件另存为something.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
将文件另存为something2.vbs
我认为这些VBS脚本使用Windows默认邮件服务器(如果存在)。 我没有测试过这些脚本......
答案 2 :(得分:2)
如果PowerShell可用, Send-MailMessage 命令行开关是一个单行命令,可以从批处理文件轻松调用以处理电子邮件通知。下面是您要在批处理文件中包含的用于调用PowerShell脚本的行示例(user
是您可能希望从批处理文件传递到PowerShell脚本的变量):
- [BATCH FILE] -
%xVariable%
以下是您可能包含在PowerShell脚本中的示例(如果您从批处理文件中传递:: ...your code here...
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -windowstyle hidden -command C:\MyScripts\EmailScript.ps1 %xVariable%
,则必须将PARAM行包含为脚本中的第一个非注释行:
- [POWERSHELL SCRIPT] -
%xVariable%
答案 3 :(得分:0)
如果您无法遵循Max关于在您的服务器上安装Blat(或任何其他实用程序)的建议,那么您的服务器可能已经安装了可以发送电子邮件的软件。
我知道Oracle和SqlServer都具有发送电子邮件的功能。您可能必须与DBA合作才能启用该功能和/或获得使用它的权限。当然,我可以看到它可能会出现一系列问题和繁文缛节。假设您可以访问该功能,那么让批处理文件登录到数据库并发送邮件非常简单。
批处理文件可以通过CSCRIPT轻松运行VBScript。快速谷歌搜索找到许多链接,显示如何使用VBScript发送电子邮件。我碰巧看到的第一个是http://www.activexperts.com/activmonitor/windowsmanagement/adminscripts/enterprise/mail/。它看起来很直接。
答案 4 :(得分:0)
$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 )
答案 5 :(得分:0)
通过对变量使用双引号,它对我有用。
我正在使用批处理脚本来调用Powershell Send-MailMessage
批处理脚本:send_email.bat
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -command 'E:\path\send_email.ps1
Powershell脚本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 "