# encoding: ascii
# api: powershell
# title: rss2email
# description: Generate an email from an RSS feed and store the feed item in a cache file to support emailing only new feed items since last execution.
# version: 0.1
# type: script
# license: CC0
# function: Get-MD5
# x-poshcode-id: 742
# x-archived: 2008-12-21T05:41:29
#
#
# ---------------------------------------------------------------------------
### <Script>
### <Author>
### Chad Miller
### </Author>
### <Description>
### Checks an RSS feed and sends the feed information through email if it hasn't
### been seen before.
### </Description>
### <Usage>
### ./rss2email.ps1 'mailrelay.acme.com' "$ProfileDir\guidcache.txt" "myemail@acme.com" "http://rss.cnn.com/rss/cnn_topstories.rss/
### </Usage>
### </Script>
# ---------------------------------------------------------------------------
param ($smtpServer, $rssCacheFile, $recipients, $rssUrl)
#######################
function Get-MD5
{
param ($str)
$cryptoServiceProvider = [System.Security.Cryptography.MD5CryptoServiceProvider]
$hashAlgorithm = new-object $cryptoServiceProvider
$byteArray = [Text.Encoding]::UTF8.GetBytes($str)
$hashByteArray = $hashAlgorithm.ComputeHash($byteArray)
$hex = $null
$hashByteArray | foreach {$hex += $_.ToString("X2")}
$hex
} #Get-MD5
#######################
function Get-Rss
{
$feed = [xml](new-object System.Net.WebClient).DownloadString($rssUrl)
#Set the description to the empty string, since it contains html markup
$feed.rss.channel.Item | foreach {$_.description = ""}
#Convert the rss.channel item to a string
$results = $feed.rss.channel.Item | Out-String
$title = $feed.rss.channel.title
#if guid available we could do something like $feed.rss.GetElementsByTagName("guid") | % {$_.get_InnerXml()}
#however some rss feeds don't have guids so we'll generate hex hash to uniquely identify the rss feed
#return a hash table with array
@{$(Get-MD5 $results) = @($title,$results)}
} #Get-Rss
#######################
function Send-RssEmail
{
param ($recipients,$subject,$message)
$smtpmail = [System.Net.Mail.SMTPClient]("$smtpServer")
$smtpmail.Send($recipients, $recipients, $subject, $message)
} #Send-RssEmail
#######################
function Get-RssCache
{
if (test-path $rssCacheFile) {
$guidcache = Get-Content $rssCacheFile
} else {
$guidcache = @()
}
return $guidcache
} #Get-RssCache
#######################
$rss = $(Get-Rss $rssUrl)
$guidcache = $(Get-RssCache)
#If we haven't read seen this rss feed, send an email then add the feed MD5 hash to our cache file so we won't send it again
if (!($guidcache -contains $rss.keys))
{
Send-RssEmail $recipients $($rss.values)[0] $($rss.values)[1]
$rss.keys >> $rssCacheFile
}