【问题标题】:Email Notification when file added to folder文件添加到文件夹时的电子邮件通知
【发布时间】:2016-02-10 22:17:29
【问题描述】:

我对脚本知之甚少,但我认为我想要的都是可能的。我只想在将文件添加到特定文件夹时收到电子邮件通知。我没有任何特定的软件,所以我猜它必须是一个批处理文件或 VBS?

【问题讨论】:

  • 您在哪方面遇到困难 - 更改检测或电子邮件生成?
  • 我们使用一款名为 WatchDirectory 的软件来监控文件夹并对这些文件执行操作。
  • 我有一个发送电子邮件的 .vbs 文件,但我发现的每个用于检查新文件的脚本都不起作用。

标签: windows batch-file


【解决方案1】:

您可以在启用了 powershell 的批处理文件中执行此操作:

@echo off
setlocal EnableDelayedExpansion
set "emailUserName=dummyEmail@gmail.com"
set "emailPassword=dummyPassword"
set "target=yourEmail@email.com"
set "subject=File Changed"
FOR %%G IN (*) DO attrib -A "%%G"
:loop
set "body="
FOR %%G IN (*) DO (
    attrib "%%G" | findstr /B /L A 1>nul
    if !errorlevel! equ 0 (
        echo "%%G"
        set "body=!body!^<br ^/^>%%G"
        attrib -A "%%G"
        )
    ) 2>nul
if not "%body%"=="" echo sending email
if not "%body%"=="" set "body=The following files have been changed:!body!"
if not "%body%"=="" powershell.exe -command "Send-MailMessage -From '!emailUserName!' -to '!target!' -Subject '!subject!' -Body '!body!' -BodyAsHtml -SmtpServer 'smtp.gmail.com' -port '587' -UseSsl -Credential (New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList ('!emailUserName!', (ConvertTo-SecureString -String '!emailPassword!' -AsPlainText -Force)))"
goto :loop

为此,您需要创建一个用于发送电子邮件的虚拟 gmail 帐户。这支持正文中的 HTML 标记,如示例所示。

请注意,这不适用于删除文件,仅适用于更改和新文件。

【讨论】:

  • @dingram10 已更新,因此它现在会发送电子邮件通知批处理文件所在文件夹的更改。
  • @dingram10 如果我的回答解决了您的问题,您应该考虑单击它左侧的检查,以便在谷歌上搜索相同问题的人可以找到它。请参阅 this 了解为什么这很重要。
  • 它确实有效!我所做的唯一更改是为我们的交换服务器设置服务器并使用内部电子邮件地址。我可能做出的唯一其他更改是,是否有办法让它在后台运行,而不需要命令提示符窗口。但是,这纯粹是一种偏好。
【解决方案2】:

您有关于您的电子邮件服务器的信息吗?你有什么版本的 Windows 和 Powershell?

这个简短的 Powershell 脚本适用于我的环境:

$folder = "D:\"
$mailserver = "your.mailserver.your.company"
$recipient = "your.email@your.company"

$fsw = New-Object System.IO.FileSystemWatcher $folder -Property @{
   IncludeSubdirectories = $true
   NotifyFilter = [IO.NotifyFilters]'FileName'
}

$created = Register-ObjectEvent $fsw -EventName Created -Action {
   $item = Get-Item $eventArgs.FullPath
   $s = New-Object System.Security.SecureString
   $anon = New-Object System.Management.Automation.PSCredential ("NT AUTHORITY\ANONYMOUS LOGON", $s)
   Send-MailMessage -To $recipient `
                    -From "alerts@your.company" `
                    -Subject “File Creation Event” `
                    -Body "A file was created: $($eventArgs.FullPath)" `
                    -SmtpServer $mailserver `
                    -Credential $anon
}

用这个停止警报:

Unregister-Event -SourceIdentifier Created -Force

【讨论】:

  • 我将该脚本复制到记事本文件中,更改了相应的信息,并将其保存为我的 DC (2008R2) 上的 .ps1。然后我右键单击并使用 PowerShell 运行。添加文件后我没有收到任何通知。我错过了什么吗?此外,将新文件扫描到该文件夹​​ (pdf) 中是否会有所不同?
  • 不确定 PowerShell 的版本,但我想在 Server 2008 R2 上运行它。或者,我可以在装有 Windows 7 的工作站上运行它。我们有一个交换服务器。我有名字和 IP。
【解决方案3】:

我根据@xXhRQ8sD2L7Z 贡献的内容构建了我的解决方案。但是我在测试时收到了多封电子邮件,每次运行注册脚本时都会收到一封新电子邮件。取消注册行不起作用:

    Unregister-Event -SourceIdentifier Created -Force

所以我发现了这个:Unregister a registered filewatcher event does not work

    Get-EventSubscriber -SourceIdentifier "filechanged" | Unregister-Event

但它仍然无法正常工作,所以我自己运行 Get-EventSubscriber 并获得了该事件的订阅列表,并发现在我的情况下,-SourceIdentifier 是一个 GUID。有了这种理解,我抓住了每个单独的 GUID 并着手取消注册它们。 (我本可以遍历它们,但我可能只会使用一次。另外,在我意识到发生了什么之前,我只创建了 6 次订阅)

这消除了我每次测试时收到的所有额外电子邮件。

    Get-EventSubscriber -SourceIdentifier "<very long GUID>" | Unregister-Event

然后我想发送给多个收件人,所以我发现了这个:Powershell send-mailmessage - email to multiple recipients

    $recipients = "<User1@domain.com>", "<User2@domain.com>"

您也可以使用电子邮件通讯组。

【讨论】:

    猜你喜欢
    • 2013-07-03
    • 2018-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-18
    • 1970-01-01
    • 2021-10-28
    相关资源
    最近更新 更多