I was poking around and saw this was never updated. Version below will authenticate and also use ssl. It can connect to any mail server now.
Looks for NEW (not modified) files and emails them. Delete "-UseSsl" if you don't want encrypted connection.
Powershell:
Code: Select all
### Email Variables ###############################
#
$smtpSubject = "File Found: Pickup Folder" #
$smtpFrom = "notify@mydomain.tld" #
$smtpTo = "user@yourdomain.tld" #
$smtpServer = "localhost" #
$SMTPAuthUser = "notify@mydomain.tld" #
$SMTPAuthPass = "supersecretpassword" #
#
### File Variables ################################
#
$MonitorFolder = "C:\scripts\pickup\pickup" #
$MonitorStopFile = "end.Mon" #
#
###################################################
$SourceID = "MonitorFiles"
$Query = @"
SELECT * FROM __InstanceCreationEvent WITHIN 10
WHERE targetInstance ISA 'Cim_DirectoryContainsFile'
AND targetInstance.GroupComponent = 'Win32_Directory.Name="$($MonitorFolder.Replace("\", "\\\\"))"'
"@
Try {
$smtp = New-Object -TypeName "Net.Mail.SmtpClient" -ArgumentList $smtpServer
Register-WmiEvent -Query $Query -SourceIdentifier $SourceID
Do {
"Waiting for a new file to arrive in '$($MonitorFolder)'; to stop, hit <Ctrl-C> or create a file '$MonitorStopFile'." | Write-Host
$FileEvent = Wait-Event -SourceIdentifier $SourceID
Remove-Event -EventIdentifier $FileEvent.EventIdentifier
$FileName = $FileEvent.SourceEventArgs.NewEvent.TargetInstance.PartComponent.Split("=", 2)[1].Trim('"').Replace("\\", "\")
If ((Split-Path -Path $FileName -Leaf) -eq $MonitorStopFile) {
$smtpBody = "[$(Get-Date -Format HH:mm:ss)]`tStop file arrived: '$($FileName)'; monitor is going down!"
Remove-Item -Path (Join-Path -Path $MonitorFolder -ChildPath $MonitorStopFile)
$FileEvent = $Null
} Else {
$smtpBody = "[$(Get-Date -Format HH:mm:ss)]`tA new fax has arrived: '$($FileName)'"
}
$smtpBody | Write-Host -Fore Yellow
$SecPasswd = ConvertTo-SecureString $SMTPAuthPass -AsPlainText -Force
$Cred = New-Object System.Management.Automation.PSCredential ($SMTPAuthUser, $SecPasswd)
Send-MailMessage -SmtpServer $smtpServer -To $smtpTo -From $smtpFrom -Credential $Cred -Port 587 -Subject $smtpSubject -Body $smtpBody -Attachments $FileName -UseSsl
} While ($FileEvent)
} Catch {
$_ | Out-String | Write-Error
} Finally {
Remove-Event -SourceIdentifier $SourceID -ErrorAction SilentlyContinue
Unregister-Event -SourceIdentifier $SourceID -ErrorAction SilentlyContinue
}
This one below satisfies Jimi's OP for a file containing headers. However, I only used To and Subject. The sender is a fixed variable. Create a text file, add the following to the top of the file with your own email address/subject:
Code: Select all
To: recipient@domain.tld
Subject: This is the message subject line
Message:
The message can be anything. Then drop the file into the pickup folder and it will automatically send.
Powershell:
Code: Select all
### Email Variables ########################################
#
$smtpFrom = "notify@mydomain.tld" #
$smtpServer = "localhost" #
$SMTPAuthUser = "notify@mydomain.tld" #
$SMTPAuthPass = "supersecretpassword" #
#
### File Variables #########################################
#
$MonitorFolder = "C:\scripts\pickup\pickup" #
$MonitorStopFile = "end.Mon" #
#
############################################################
$SourceID = "MonitorFiles"
$Query = @"
SELECT * FROM __InstanceCreationEvent WITHIN 10
WHERE targetInstance ISA 'Cim_DirectoryContainsFile'
AND targetInstance.GroupComponent = 'Win32_Directory.Name="$($MonitorFolder.Replace("\", "\\\\"))"'
"@
Try {
$smtp = New-Object -TypeName "Net.Mail.SmtpClient" -ArgumentList $smtpServer
Register-WmiEvent -Query $Query -SourceIdentifier $SourceID
Do {
"Waiting for a new file to arrive in '$($MonitorFolder)'; to stop, hit <Ctrl-C> or create a file '$MonitorStopFile'." | Write-Host
$FileEvent = Wait-Event -SourceIdentifier $SourceID
Remove-Event -EventIdentifier $FileEvent.EventIdentifier
$FileName = $FileEvent.SourceEventArgs.NewEvent.TargetInstance.PartComponent.Split("=", 2)[1].Trim('"').Replace("\\", "\")
If ((Split-Path -Path $FileName -Leaf) -eq $MonitorStopFile) {
$smtpBody = "[$(Get-Date -Format HH:mm:ss)]`tStop file arrived: '$($FileName)'; monitor is going down!"
Remove-Item -Path (Join-Path -Path $MonitorFolder -ChildPath $MonitorStopFile)
$FileEvent = $Null
} Else {
If ((Get-Content $FileName | ? {$_.startswith('To: ')} | % {$_.substring(4)}) -ne ''){
$smtpTo = Get-Content $FileName | ? {$_.startswith('To: ')} | % {$_.substring(4)}
$smtpSubject = Get-Content $FileName | ? {$_.startswith('Subject: ')} | % {$_.substring(9)}
$smtpBody = Get-Content $FileName | out-string
}
}
$SecPasswd = ConvertTo-SecureString $SMTPAuthPass -AsPlainText -Force
$Cred = New-Object System.Management.Automation.PSCredential ($SMTPAuthUser, $SecPasswd)
Send-MailMessage -SmtpServer $smtpServer -To $smtpTo -From $smtpFrom -Credential $Cred -Subject $smtpSubject -Body $smtpBody -Port 587 -UseSsl
} While ($FileEvent)
} Catch {
$_ | Out-String | Write-Error
} Finally {
Remove-Event -SourceIdentifier $SourceID -ErrorAction SilentlyContinue
Unregister-Event -SourceIdentifier $SourceID -ErrorAction SilentlyContinue
}
In both scripts, creating a file named "end.mon" will stop the script (end monitoring).