Issue in sending email with attachment in powershell

chetan Vishwakarma 146 Reputation points
2021-01-22T08:33:49.867+00:00
function Send-EmailToDBA
{
    param(
        [Parameter(Mandatory = $true)][string]$emailBody,
        [Parameter(Mandatory = $true)][string]$emailSubject
    )

    $EmailFrom = "NoReplyFromDBA@test.com" 
    #$EmailTo = "myemailid@test.com" 
    $EmailTo = "myemailid@test.com" 
    $file = "F:\db_dump\DEFAULT\!DBA\healthchecksscripts\Output\Errors.csv"
    $SMTPServer = "smtp1.test.com" 
    $mailer = new-object Net.Mail.SMTPclient($smtpserver)
    $msg = new-object Net.Mail.MailMessage($EmailFrom, $EmailTo, $EmailSubject, $Emailbody)
    $attachment = new-object System.Net.Mail.Attachment $file
    $message.Attachments.Add($attachment)

    $msg.IsBodyHTML = $true
    $mailer.send($msg)
    ####Attachment#######

####################################################################

} # end of function

$DiskReport = (Get-Content "F:\db_dump\DEFAULT\!DBA\DailyChecks\Reports\DiskSpace.htm" ) | out-string
$FullBackup = (Get-Content "F:\db_dump\DEFAULT\!DBA\DailyChecks\Reports\ADA_FullBackup_Output.htm" ) | out-string
#$LogBackup = (Get-Content "F:\db_dump\DEFAULT\!DBA\DailyChecks\Reports\ADA_LogBackup_Output.htm" ) | out-string
$DBStatus = (Get-Content "F:\db_dump\DEFAULT\!DBA\DailyChecks\Reports\ADA_DBStatus_Output.htm" ) | out-string
$JobFailure = (Get-Content "F:\db_dump\DEFAULT\!DBA\DailyChecks\Reports\FailedJob24hrs.htm" ) | out-string
$Blocking = (Get-Content "F:\db_dump\DEFAULT\!DBA\DailyChecks\Reports\BlockingReport.htm" ) | out-string
$AgentStatus = (Get-Content "F:\db_dump\DEFAULT\!DBA\DailyChecks\Reports\AgentStatusReport.htm" ) | out-string
#$SQLErrors = (Get-Content "F:\db_dump\DEFAULT\!DBA\DailyChecks\Reports\BlockingReport.htm" ) | out-string

$EmialBodyFinal =  'Disk Space Report    '+ $DiskReport + 'Full Backup Report    '+ $FullBackup + 'Database Status Report    '+ $DBStatus + 'Job Failure Status    ' + $JobFailure + 'Blocking Report     '+$Blocking + 'SQL Agent Status '+$AgentStatus
#$EmialBodyFinal =  'Full Backup Report    '+ $FullBackup +'Log Backup Report     ' + $LogBackup + 'Database Status Report    '+ $DBStatus + 'Job Failure Status    ' + $JobFailure 


$datetime = Get-Date -Format "MM-dd-yyyy" 
$EmailSubject = "DBA Health Checks Report " + $datetime

Send-EmailToDBA -EmailBody $EmialBodyFinal -EmailSubject $EmailSubject 

Hello Team ,

I am facing below error while sending email with attachment in above code , can you please correct the code if possible?

Attachment is located at : F:\db_dump\DEFAULT!DBA\healthchecksscripts\Output\Errors.csv

Error :
You cannot call a method on a null-valued expression. At F:\db_dump\DEFAULT!DBA\healthchecksscripts\Combined Output.ps1:16 char:5 + $message.Attachments.Add($attachment) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (:) [], RuntimeException + FullyQualifiedErrorId : InvokeMethodOnNull. Process Exit Code 0.

SQL Server
SQL Server
A family of Microsoft relational database management and analysis systems for e-commerce, line-of-business, and data warehousing solutions.
12,708 questions
Windows Server PowerShell
Windows Server PowerShell
Windows Server: A family of Microsoft server operating systems that support enterprise-level management, data storage, applications, and communications.PowerShell: A family of Microsoft task automation and configuration management frameworks consisting of a command-line shell and associated scripting language.
5,363 questions
Transact-SQL
Transact-SQL
A Microsoft extension to the ANSI SQL language that includes procedural programming, local variables, and various support functions.
4,552 questions
0 comments No comments
{count} votes

1 additional answer

Sort by: Most helpful
  1. Rich Matheisen 44,776 Reputation points
    2021-01-22T16:03:37.5+00:00

    Is there a reason why you're using SMTPClient instead of the PowerShell Send-MailMessage? Your function could be written like this:

    function Send-EmailToDBA {
        param(
            [Parameter(Mandatory = $true)][string]$emailBody,
            [Parameter(Mandatory = $true)][string]$emailSubject
        )
        $param =    [PSCustomObject]@{
                        From = "NoReplyFromDBA@test.com"
                        To = "NoReplyFromDBA@test.com"
                        Subject = $emailSubject
                        Body = $emailBody
                        SMTPServer = "smtp1.test.com"
                        Attachments = ,"F:\db_dump\DEFAULT\!DBA\healthchecksscripts\Output\Errors.csv"
                        BodyAsHTML = $true
                    }
        SendMailMessage @param
    } # end of function
    
    0 comments No comments