通过Outlook在命令行发送电子邮件而无需点击“发送”按钮

23

我需要通过命令行自动化发送电子邮件,不需要任何人工干预。

我知道我们可以使用mailto命令,但这只是组合电子邮件的主题、正文等内容,除非我点击“发送”,否则不会发送电子邮件。

我在网上看到可以使用blat命令,但我不能使用除Outlook以外的其他程序。

我找到了一个关闭的帖子 SOF帖子链接,供您参考。

仅供参考:我正在尝试使用telnet命令发送电子邮件,但还没有成功。 这里有一些用telnet命令发送电子邮件的指南

4个回答

26

选项1
您没有提及您的环境,但假设您可以使用它,那么您可以使用PowerShell脚本,例如这里。其实质是:

$smtp = New-Object Net.Mail.SmtpClient("ho-ex2010-caht1.exchangeserverpro.net")
$smtp.Send("reports@exchangeserverpro.net","administrator@exchangeserverpro.net","Test Email","This is a test")

您可以按照此示例的方式,从命令行启动脚本:

powershell.exe -noexit c:\scripts\test.ps1

请注意,Windows 7和Windows Server 2008 R2默认安装的PowerShell 2.0包括一个更简单的Send-MailMessage命令,使操作更容易。 选项2
如果您准备使用第三方软件,则可以考虑使用此SendEmail命令行工具。但这取决于目标环境; 如果要将批处理文件部署到多台机器上,则需要每次添加(但不需要正式安装)。 选项3
您可以直接使用VBA脚本驱动Outlook,然后从批处理文件触发它,这可以让您使用Outlook本身发送电子邮件,看起来最接近您想要的。这有两个部分;首先,找出所需的VBA脚本以发送电子邮件。这方面的在线示例很多,包括Microsoft 在此提供的示例。其本质是:
Sub SendMessage(DisplayMsg As Boolean, Optional AttachmentPath)
    Dim objOutlook As Outlook.Application
    Dim objOutlookMsg As Outlook.MailItem
    Dim objOutlookRecip As Outlook.Recipient
    Dim objOutlookAttach As Outlook.Attachment
    
    Set objOutlook = CreateObject("Outlook.Application")
    Set objOutlookMsg  = objOutlook.CreateItem(olMailItem)
    
    With objOutlookMsg
        Set objOutlookRecip = .Recipients.Add("Nancy Davolio")
        objOutlookRecip.Type = olTo
        ' Set the Subject, Body, and Importance of the message.
        .Subject = "This is an Automation test with Microsoft Outlook"
        .Body = "This is the body of the message." &vbCrLf & vbCrLf
        .Importance = olImportanceHigh  'High importance
        
        If Not IsMissing(AttachmentPath) Then
            Set objOutlookAttach = .Attachments.Add(AttachmentPath)
        End If
        
        For Each ObjOutlookRecip In .Recipients
            objOutlookRecip.Resolve
        Next
        
        .Save
        .Send
    End With
    Set objOutlook = Nothing
End Sub

然后,根据这篇答案的说明,在命令行中使用/autorun参数启动Outlook(必要时更改路径和宏名):

C:\Program Files\Microsoft Office\Office11\Outlook.exe" /autorun macroname

选项 4
您可以使用与选项 3 相同的方法,但是将 Outlook VBA 移动到 PowerShell 脚本中(您将从命令行运行该脚本)。 示例在此处。 在我看来,这可能是最整洁的解决方案。


我在那里添加了另外几个选项。你也可能需要重新考虑是否要在批处理文件中执行此操作 - 这很大程度上取决于你想何时/为何触发它等因素。 - Geoff
1
谢谢Geoff,最终我创建了一个使用gmail发送电子邮件的PowerShell脚本:( 我没有其他选择,在我的批处理脚本中,我将输出发送到txt文件,然后从那里调用Powershell脚本,在我的PS脚本中,我使用 cat 命令将文件内容作为电子邮件正文。这是一个变通方法,但我已经暂时解决了问题。 - Mowgli
1
@Mowgli:你展示的那个链接是我认为的第三种选择的例子(如果是我,这将是我的解决方案)。 - Geoff
1
@jvriesem 你是在使用WSL2中的Bash吗?如果是这样,你可以使用我回答中的PowerShell方法,并使用类似于powershell.exe -File "c:\users\myuser\Desktop\mymailscript.ps1"的命令来调用PowerShell脚本。请注意,路径是本机Windows路径,而不是/mnt路径。 - Geoff
@Geoff:我是一名Mac用户,我的组织使用Outlook。:-)虽然我对Windows非常熟悉,但我在PowerShell方面是个新手。不过,我非常熟悉Bash脚本编写,所以我想知道在macOS上使用Outlook是否有脚本方法。 - jvriesem
显示剩余5条评论

5

使用PowerShell可以发送电子邮件并将其集成到Bat文件脚本中。但是,您需要在计算机上安装Outlook。这对我在本地PC上有效,但在服务器上却无效。在服务器上,每次使用此命令时都会要求我授权,而且在服务器上安装Outlook可能不是许多人首选的方法。

在本地PC上运行时,此方法功能完美。

$Outlook = New-Object -ComObject Outlook.Application
$Mail = $Outlook.CreateItem(0)
$Mail.To = "xyz@mail.com"
$Mail.Subject = "Action"
$Mail.Body ="Pay rise please"
$Mail.Send()

1

使用VBScript从命令行发送短信/文本消息!

如果VBA符合VB Script的规则,则可以通过将它放入文本文件中来从命令行调用它 - 在这种情况下,无需专门打开Outlook。

我有一个需要从命令行发送自动化文本消息给自己的需求,因此我使用了下面的代码,这只是@Geoff上面答案的压缩版本。

大多数全球移动电话运营商提供您的移动电话号码的电子邮件地址“版本”。例如在加拿大的或,发送到<YourPhoneNumber>@pcs.rogers.com的电子邮件将立即传递到您的Rogers/Chatr手机作为文本消息。

* 您可能需要在手机上“授权”第一条消息,有些运营商可能会收取额外费用,尽管据我所知,所有加拿大运营商都提供这个鲜为人知的服务免费。请查看您运营商的网站以获取详细信息。

还有更多说明和各种编制的全球运营商电子邮件到短信地址列表可在网上找到,例如thisthisthis


代码和说明

  1. 复制下面的代码并粘贴到您喜欢的文本编辑器中的新文件中。
  2. 使用任何名称将文件保存为.VBS扩展名,例如TextMyself.vbs

就这些了!
只需双击文件即可发送测试短信,或者使用START从批处理文件运行它。

Sub SendMessage()
    Const EmailToSMSAddy = "3215551212@pcs.rogers.com"
    Dim objOutlookRecip
    With CreateObject("Outlook.Application").CreateItem(0)
        Set objOutlookRecip = .Recipients.Add(EmailToSMSAddy)
        objOutlookRecip.Type = 1
        .Subject = "The computer needs your attention!"
        .Body = "Go see why Windows Command Line is texting you!"
        .Save
        .Send
    End With
End Sub

批处理文件使用示例:

START x:\mypath\TextMyself.vbs

当然,这可以被无限地改编和定制以适应各种实际或创意需求。

谢谢您的回答。我也尝试了同样的方法,没有出现任何错误。但是我在我的邮箱中没有收到任何电子邮件。我也查看了垃圾邮件和垃圾箱。我检查了拼写错误或其他问题。脚本运行没有问题。但是为什么我看不到任何邮件呢?:( 这让人失望。 - Priya
这个程序的目的不是用于发送电子邮件,而是用于短信消息,因此理论上你应该在“已发送项目”中看到一条消息,并且在脚本中指定的电话号码收到一条短信。 - ashleedawg
然而,理论上它也应该适用于发送电子邮件,但我刚刚测试了一下,它对我也不再起作用。自从我使用它已经过去几年了,所以我不确定问题可能是什么,但我猜测它与Outlook中的一些新安全设置有关,这些设置可能可以被禁用。(哦,你需要安装Outlook。)很抱歉我没有时间进行故障排除。现在,我通过Email-to-SMS类似地发送短信,但是通过调用我的Web服务器上的PHP脚本,并使用PHP的简单mail()命令。 - ashleedawg
也许您需要更改 Outlook 设置以允许“程序访问。我想当我写那个答案时它可能已经默认启用了...但这只是一个猜测。 - ashleedawg
请注意,这不是一个 BAT 文件...它是一个 VBS 文件(Visual Basic 脚本),类似于 Office 的 VBA。这里有关于运行 VBS 的更多信息。另一个可能的问题是您的杀毒软件阻止访问(因为这很容易被恶意软件滥用)。祝好运,并且如果您找到解决方案,请随时更新答案! :-) - ashleedawg
非常感谢您详细的回复,十分感激。我已经查看了那些允许编程访问的Outlook设置,但仍然无法找到解决方法。我还发现可以使用PowerShell脚本发送邮件,但是在服务器上成功运行且没有错误返回,却没有在服务器上收到任何邮件(是的,我需要在服务器上安装Outlook,但我不想这样做)。在服务器上,它每次都要求我的确认。如果我找到任何解决方案,我会发布的。非常感谢您的时间。 - Priya

-5

你可以使用cURL和CRON在设定的时间运行.php文件。

以下是cURL运行.php文件所需的示例:

curl http://localhost/myscript.php

然后设置CRON作业来运行上述cURL:
nano -w /var/spool/cron/root
or
crontab -e

跟随:

01 * * * * /usr/bin/curl http://www.yoursite.com/script.php

了解更多信息,请查看以下文章: https://www.scalescale.com/tips/nginx/execute-php-scripts-automatically-using-cron-curl/

了解更多关于cURL的信息: 什么是PHP中的cURL?

了解更多关于CRON的信息: http://code.tutsplus.com/tutorials/scheduling-tasks-with-cron-jobs--net-8800

另外,如果您想学习如何在托管服务器上设置CRON作业,请向您的主机提供商查询,他们可能会有一个GUI来在c面板中设置它(如http://godaddy.comhttp://1and1.com/

注意:从技术上讲,我相信您可以设置一个CRON作业来直接运行.php文件,但我不确定。

祝您自动运行PHP一切顺利 :-)


1
这个人要求 Outlook 的解决方案,而不是 PHP 的解决方案。祝好! - user1052080

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接