Search code examples
powershellemailemail-attachments

Sorting, automatically adding an attachment to an email, and forwarding an email


What I am hoping to do is once a new email hits a folder containing a specific subject. That email is then forwarded to another inbox and a specific file is automatically attached. The code I have been able to cobble together so far is this. Is a .Net method the appropriate method to achieve my goal or would using Send-MailMessge to a hastable be better method? I am new to PowerShell code I am able to get both methods to work. But was wondering A. which method is preferred. B. is there a better/more efficient way?

#####Define Variables########
$fromaddress = "donotreply@fromemail.com"
$toaddress = "blah@toemail.com"
$bccaddress = "blah@bcc.com"
$CCaddress = "blah@cc.com"
$Subject = "ACtion Required"
$body = get-content .\content.htm
$attachment = "C:\sendemail\test.txt"
$smtpserver = "smtp.labtest.com"

##############################
$message = new-object System.Net.Mail.MailMessage
$message.From = $fromaddress
$message.To.Add($toaddress)
$message.CC.Add($CCaddress)
$message.Bcc.Add($bccaddress)
$message.IsBodyHtml = $True
$message.Subject = $Subject
$attach = new-object Net.Mail.Attachment($attachment)
$message.Attachments.Add($attach)
$message.body = $body
$smtp = new-object Net.Mail.SmtpClient($smtpserver)
$smtp.Send($message)


(Example of the hashtable method 

$emailHashSplat = @{ To = $toAddress 
From = $fromAddress 
Subject =  $emailSubject 
Body = $emailBody SMTPServer = $smtpServer BodyAsHtml = 
$true Attachments = "C:\sendemail\test.txt" # Attachments =)

Solution

  • Stick with Powershell commands whenever possible, .NET might be faster in some cases but it is a best practice to use only Powershell commands when possible.

    Also make sure your code is easy to read and understand by others, using hastables with splatting wil help with this, see the following example: Github Gist Link (Click Me!)

    Copy of the code, in case of link failure.

    ### Script Global Settings
    #Declare SMTP Connection Settings
    $SMTPConnection = @{
        #Use Office365, Gmail, Other or OnPremise SMTP Relay FQDN
        SmtpServer = 'outlook.office365.com'
    
        #OnPrem SMTP Relay usually uses port 25 without SSL
        #Other Public SMTP Relays usually use SSL with a specific port such as 587 or 443
        Port = 587 
        UseSsl = $true    
    
        #Option A: Query for Credential at run time.
        Credential = Get-Credential -Message 'Enter SMTP Login' -UserName "emailaddress@domain.tld"
    
        <#
        #Option B: Hardcoded Credential based on a SecureString
        Credential = New-Object -TypeName "System.Management.Automation.PSCredential" -ArgumentList @( 
    
            #The SMTP User Emailaddress
            "emailaddress@domain.tld"
    
            #The Password as SecureString encoded by the user that wil run this script!
            #To create a SecureString Use the folowing Command: Read-Host "Enter Password" -AsSecureString | ConvertFrom-SecureString
            "Enter the SecureString here as a single line" | ConvertTo-SecureString
        ) 
        #> 
    }
    
    ### Script Variables
    #Declare Mailmessages.
    $MailMessageA = @{
        From = "emailaddress@domain.tld"
        To = @(
            "emailaddress@domain.tld"
        )
        #Cc = @(
        #    "emailaddress@domain.tld"
        #)
        #Bcc = @(
        #    "emailaddress@domain.tld"
        #)
    
        Subject = 'Mailmessage from script'
        #Priority = 'Normal' #Normal by default, options: High, Low, Normal
        #Attachments = @(
            #'FilePath'    
        #)
        #InlineAttachments = @{
            #'CIDA'='FilePath'
        #} #For more information about inline attachments in mailmessages see: https://gallery.technet.microsoft.com/scriptcenter/Send-MailMessage-3a920a6d
    
        BodyAsHtml = $true    
        Body = "Something Unexpected Occured as no Content has been Provided for this Mail Message!" #Default Message
    }
    
    ### Script Start
    
    #Retrieve Powershell Version Information and store it as HTML with Special CSS Class
    $PSVersionTable_HTLM = ($PSVersionTable.Values | ConvertTo-Html -Fragment) -replace '<table>', '<table class="table">'
    
    #Retrieve CSS Stylesheet
    $CSS = Invoke-WebRequest "https://raw.githubusercontent.com/advancedrei/BootstrapForEmail/master/Stylesheet/bootstrap-email.min.css" | Select-Object -ExpandProperty Content
    
    #Build HTML Mail Message and Apply it to the MailMessage HashTable
    $MailMessageA.Body = ConvertTo-Html -Title $MailMessageA.Subject -Head "<style>$($CSS)</style>" -Body "
        <p>
            Hello World,    
        </p>
    
        <p>
            If your recieved this message then this script works.</br>
            </br>
            <div class='alert alert-info' role='alert'>
                Powershell version
            </div>
            $($PSVersionTable_HTLM)
        </P>
    " | Out-String
    
    
    #Send MailMessage
    #This example uses the HashTable's with a technique called Splatting to match/bind the Key's in the HashTable with the Parameters of the command.
    #Use the @ Symbol instead of $ to invoke Splatting, Splatting improves readability and allows for better management and reuse of variables
    Send-MailMessage @SMTPConnection @MailMessageA