答案1
概括
我们将创建一个 Powershell 脚本,该脚本将通过 Google 的 smtp 服务器发送电子邮件。此脚本可以通过任务计划程序运行,允许您按计划运行它。当 Outlook 收到电子邮件时,查找该电子邮件的规则将触发 Outlook VBA 脚本。Viola。
步骤1: 为您将用于发送“触发”电子邮件以触发 VBA 脚本的 Gmail 帐户创建一个安全凭证文件。
在 Powershell 中,运行
read-host -assecurestring | convertfrom-securestring | out-file $Home\autopass.txt
这会将您该 Gmail 帐户密码的安全版本存储在您的用户目录中。请注意,如果您使用双因素身份验证,您需要获取应用程序密码而不是此凭证的正常密码,您将在以下步骤中使用该密码。
第2步: 此 Powershell 脚本将使用您自己提供的凭据通过 Google 的 smtp 服务器发送电子邮件。适当设置字段,选择一个特定的非常独特的主题(例如,“@TRIGGERMYVBA21”),您将在 Outlook 规则中注明该主题。
# You must paste your password after running the command:
# read-host -assecurestring | convertfrom-securestring | out-file $Home\autopass.txt
# before running the next part of the script.
#Create credential file
$password = get-content $Home\autopass.txt | convertto-securestring
$credentials = new-object -typename System.Management.Automation.PSCredential -argumentlist "[email protected]",$password
#Send automatic email
$From = "[email protected]"
$To = "[email protected]"
$Subject = "@TRIGGERMYVBA21"
$Body = "some body"
$SMTPServer = "smtp.gmail.com"
$SMTPPort = "587"
Send-MailMessage -From $From -to $To -Subject $Subject `
-Body $Body -SmtpServer $SMTPServer -port $SMTPPort -UseSsl `
-Credential ($credentials)
# possible additions
# $Cc = "[email protected]"
# $Attachment = "dir\attachment.txt"
# both of which require the following tags in the Send-MailMessage command
# -Attachments $Attachment -Cc $Cc
将脚本保存为 .ps1 文件。
步骤3:确保您可以在 Outlook 中制定规则,以便将“运行脚本”作为操作。如果不能,您需要使用 regedit 转到HKEY_CURRENT_USER\Software\Microsoft\Office\16.0\Outlook\Security
并添加一个新的 DWORD(32 位值),标题为,"EnableUnsafeClientMailRules"
值为 1。
步骤4: 创建一条规则来查找:
- 您将在 Powershell 脚本中用来触发规则的 Gmail 地址
- 您在 Powershell 脚本中创建的唯一主题行(例如“@TRIGGERMYVBA21”)
进而:
- 删除电子邮件,
- 并运行一个脚本
步骤5: 设置任务计划程序规则,在您想要运行 Powershell 脚本时触发该脚本。您将选择“启动程序”作为操作,然后在程序中键入“powershell”,最后在添加参数框中键入“-File directory\script.ps1”。
顺便说一下,我使用这个来暂停电子邮件,直到它们可以使用文件夹移动 VBA 脚本进行操作。我将电子邮件移动到特定文件夹,然后当该特定文件夹的规则触发时,它们会移回收件箱。
为了完整性,将该脚本包含在这里:
Sub moveTheItems(item As Outlook.MailItem)
Dim myNameSpace As Outlook.NameSpace
Dim myInbox As Outlook.Folder
Dim myDestFolder As Outlook.Folder
Dim myItems As Outlook.Items
Dim myItem As Object
Set myNameSpace = Application.GetNamespace("MAPI")
Set myInbox = myNameSpace.GetDefaultFolder(olFolderInbox)
Set myItems = myInbox.Items
Set myDestFolder = myInbox
Set myItems = myInbox.Folders("Snooze Until 3 PM").Items
For i = myItems.Count To 1 Step -1 'Iterates from the end backwards
myItems.item(i).Move myDestFolder
Next
End Sub