如何从Windows批处理文件发送简单的电子邮件?

时间:2012-01-27 19:28:40

标签: windows email batch-file

我正在运行Windows 2003 Service Pack 2.我有一个按需运行的批处理文件。我希望每次批处理文件运行时都会发送一封电子邮件。电子邮件很简单,只是一个表示批处理文件运行的句子;每次都是一样的。

我已经尝试了几件事来完成这件事。我想到了telnet,但我无法弄清楚如何将一组命令重定向到telnet; Windows批处理文件没有Unix风格的“here here”,并且调用"telnet <scriptfile"其中 scriptfile 包含发送电子邮件的命令不起作用。我还使用CDO.Message在互联网上找到了几个解决方案,但我以前从未使用过,我不断收到我不理解的错误消息。

如何从Windows批处理文件发送简单的电子邮件?

6 个答案:

答案 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 "