$Env:ComputerName doesnt work with powershell Send-MailMessage in batch file - powershell

After a lot of errors and edits I got the Send-MailMessage to work through a command prompt. Below iteration sends out the emails perfect.
powershell Send-MailMessage -From " `<user#domain>`" -To " `<user#domain.com>`" -Subject 'Some subject goes here' -Body 'Some body with alert regarding Host: $env:computername. List of deleted files is attached.' -Attachments 'C:\somefile.txt' -Priority High -dno onSuccess, onFailure -SmtpServer 'smtp.domain.com'
However, this does not fetch the computername in the body. I have tried running this command in powershell directly and it works with the computername variable in body.
To get it to simply send out mails, I have already tried doing
powershell -command "command" or powershell -command "{command} or
powershell -command "& {command}" and so on and it doesnt even send
out emails.
As I am now successful sending out emails, I need to have the Computername inside the body text.

Use double quotes around the argument value to have variables contained expanded.
I.e.:
-Body "Some body with alert regarding Host: **$env:computername**. ..."
Relevant reading.

Your command line in the question and your own answer relies on the fact that powershell currently has the default (position 0) argument -Command,
but as this changes from PowerShell 6.0.0beta3 on to -File
you should explicitly use at least -C as the shortest
abbreviviation for -Command.
to speed up execution I'd use the additionl parameters -NoProfile or short -NoP and -NonInteractive or -NonI
to stop cmd from trying to interpret any parameters/arguments you should double quote them all - and escape any necessary inner double quotes with a backslash \" while also replacing double quotes with single ones if ever possible.
So I'd suggest:
powershell -NoP -NonI -C "Send-MailMessage -From \"SomeWeb-Prod#domain.com\" -To \"fromuser#domain.com\" -Subject 'Some notification for SomeWeb-Prod' -Body 'Some Alert for Host: %computername% with IP: %NetworkIP% at %time%. details in attached file.' -Attachments 'C:\somefile.txt' -Priority High -dno onFailure -SmtpServer 'smtp.domain.com'"
Or, (as you partly discovered yourself):
powershell -NoP -NonI -C "Send-MailMessage -From 'SomeWeb-Prod#domain.com' -To 'fromuser#domain.com' -Subject 'Some notification for SomeWeb-Prod' -Body 'Some Alert for Host: %computername% with IP: %NetworkIP% at %time%. details in attached file.' -Attachments 'C:\somefile.txt' -Priority High -dno onFailure -SmtpServer 'smtp.domain.com'"

"$env:computername" doesnot work for me. It simply prints it as $env:computername
%computername% worked.
Here's what's working for me right now.
powershell Send-MailMessage -From " `<user#domain.com>`" -To " `<user#domain.com>`" -Subject 'Some subject goes here' -Body 'Some body with alert regarding Host: %computername%. Some file is attached.' -Attachments 'C:\somefile.txt' -Priority High -dno onSuccess, onFailure -SmtpServer 'smtp.domain.com'
Update:
The above command worked on Win7 fine, but gave errors on server 2012. Finally this is what worked on win 2012
powershell "Send-MailMessage -From "SomeWeb-Prod#domain.com" -To "fromuser#domain.com" -Subject 'Some notification for SomeWeb-Prod' -Body 'Some Alert for Host: %computername% with IP: %NetworkIP% at %time%. details in attached file.' -Attachments 'C:\somefile.txt' -Priority High -dno onFailure -SmtpServer 'smtp.domain.com'"

It works for me, by using double quotes around variables.
I am using batch script to call powershell Send-MailMessage
Batch Script:send_email.bat
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -windowstyle hidden -command 'E:\path\send_email.ps1
Pwershell Script send_email.ps1
Send-MailMessage -From "noreply#$env:computername" -To '<target_email#example.com>' -Subject 'Blah Blah' -SmtpServer 'smtp.domain.com' -Attachments 'E:\path\file.log' -BODY "Blah Blah on Host: $env:computername "

Related

How to make attachment in Send-MailMessage optional?

I amd using Send-MailMessage in my script
Send-MailMessage -From 'User01 <user01#fabrikam.com>' -To 'User02 <user02#fabrikam.com>', 'User03 <user03#fabrikam.com>' -Subject 'Sending the Attachment' -Body 'Forgot to send the attachment. Sending now.' -Attachments .\data.csv -Priority High -DeliveryNotificationOption OnSuccess, OnFailure -SmtpServer 'smtp.fabrikam.com'
it works great, except sometimes when a log file fails to get created, thus no attachment, Send-MailMessage fails to send an email because attachment is not there.
how can i keep the -attachment switch as part of Send-MailMessage and still send email even if somehow the attachment fails?
something like this: -Attachments (mandatory=$false)$attachment
Although I agree with avic that using splatting is the way to go with cmdlets like Send-MailMessage that use a lot of parameters, there may also be another way, keeping your format sort-of intact.
The -Attachments parameter is of type string[] (an array of file names) and what's more, it can be piped to the Send-MailMessage cmdlet. As long as it is an array, the cmdlet seems fine with it, even if the array is empty.
You could use that to change the command you have to this:
# see if the file to attach is there and if not make $attachments an empty array
if (Test-Path -Path '.\data.csv' -PathType Leaf) { $attachments = #('.\data.csv') } else { $attachments = #() }
# pipe the attachments array to the cmdlet
$attachments | Send-MailMessage -From 'User01 <user01#fabrikam.com>' -To 'User02 <user02#fabrikam.com>', 'User03 <user03#fabrikam.com>' -Subject 'Sending the Attachment' -Body 'Forgot to send the attachment. Sending now.' -Priority High -DeliveryNotificationOption OnSuccess, OnFailure -SmtpServer 'smtp.fabrikam.com'
As said, personally I would prefer using splatting for this..

Saving powershell command output into a file

I want to save the following powershell command into a file.ps1 from cmd:
powershell send-mailmessage -to "alerts#address.com" -from "info#address.com" -subject "Virus alert" -body "Cryptolocker variant detected on $env:computername " -smtp "companyname-com.mail.protection.outlook.com"
How can I do that?
try this:
echo <your_command> > file.ps1
echo prints whatever you give it (in this case your command) to the standard output (usually the console) and > redirects the string (your command) from the standard output to the file file.ps1
This can be written to a file by redirecting stdout of the ECHO command.
ECHO>file.ps1 powershell send-mailmessage ^
-to "alerts#address.com" ^
-from "info#address.com" ^
-subject "Virus alert" ^
-body "Cryptolocker variant detected on $env:computername " ^
-smtp "companyname-com.mail.protection.outlook.com"
If you are writing to a .ps1 file, why do you need to start another instance of PowerShell? To run the PowerShell script, leave the powershell command out and just use:
powershell -NoLogo -NoProfile -File file.ps1

Send-MailMessage Access to path is denied

I am trying to send files by email using powershell. I am able to pop up a prompt for password for credential to run. But the send-mailmessage come back saying the path is denied. Also is there a way to include the password in the script to bypass entering the password so that I can run this through task scheduler on the server?
Send-MailMessage -From 'David Brierton <Davidb#test.com>' -To 'David Brierton <Davidb#test.com>' -Subject "Website deployment" -Body "See attached file" -Attachments #("\\server\d$\Mdrive\test\test\Book1.csv", "\\server\d$\Mdrive\test\test\ExampleBook1.csv") -SmtpServer test.test.test -Credential DomainName\User
Remove the # and the bracket in the -attachement and try with only your email
Send-MailMessage -From "Davidb#test.com" -To "Davidb#test.com" -Subject "Website deployment" -Body "See attached file" -Attachments "\\server\d$\Mdrive\test\test\Book1.csv", "\\server\d$\Mdrive\test\test\ExampleBook1.csv" -SmtpServer test.test.test -Credential DomainName\User

Execute batch script from powershell with feedback

I need your valuable comments/advice on how we could implement powershell script to send feedback to users during its execution based on its runtime.
Powershell script will be executing a batch script.
Clear-Host
cmd.exe "/c G:\BEKDocs\Batch\Batch1.cmd"
Write-Host "The Exit code from Batch1 is " $LastExitCode
Batch script will do some processing on its own, i want the power shell script to provide the feedback to few set of users on the below occasions through mail communication using SMTP (I have SMTP configured in the server).
When the script starts (Mail should be sent).
If the script completes within a minute.
If the script runs for more than a hour.
If the script fails.
Regards,
Naga
Use Send-MailMessage to send mail. Use Measure-Command to measure the execution time of a command. Use $LASTEXITCODE to determine whether an external command succeeded or failed.
$from = 'sender#example.com'
$to = 'recipient#example.com'
Send-MailMessage -From $from -To $to -Subject 'script started'
$time = Measure-Command { & cmd.exe /c "G:\BEKDocs\Batch\Batch1.cmd" }
if ( $time.TotalMinutes -le 1 ) {
Send-MailMessage -From $from -To $to -Subject 'script completed within 1 min'
} elseif ( $time.TotalMinutes -gt 60 ) {
Send-MailMessage -From $from -To $to -Subject 'script ran longer than 1 hour'
}
if ( $LASTEXITCODE -ne 0 ) {
Send-MailMessage -From $from -To $to -Subject 'script failed'
}

Email credentials when using send-mailmessage command

I have searched through many many forums and they do explain how to do this but the technical language is just too difficult to understand as I'm very new to powershell. I would like this explained to me step by step (baby steps). I would like to run this powershell command in a batch file (.bat). I have a batch file that does robocopy backups weekly and I want the batch file to send me a email when the backup is complete. The only issue I have is the credentials, I get a pop-up box asking for the user name and password. When I eneter this information the email will send successfully. Here is what I have;
Using: powershell V2.0 Windows 7 Ultimate
Powershell -command send-mailmessage -to emailadress#provider.com -from emailaddress#provider.com -smtp smtp.broadband.provider.com -usessl -subject 'backup complete'
$from = "example#mail.com"
$to = "example#mail.com"
$smtp = "smtpAddress.com"
$sub = "hi"
$body = "test mail"
$secpasswd = ConvertTo-SecureString "yourpassword" -AsPlainText -Force
$mycreds = New-Object System.Management.Automation.PSCredential($from, $secpasswd)
Send-MailMessage -To $to -From $from -Subject $sub -Body $body -Credential $mycreds -SmtpServer $smtp -DeliveryNotificationOption Never -BodyAsHtml
You could pass the credential object in your same command - which would avoid the popup:
Powershell -Command 'Send-MailMessage -to "emailadress#provider.com" -from "emailaddress#provider.com" -smtp "smtp.broadband.provider.com" -usessl -subject "backup complete" -credential (new-object System.Net.NetworkCredential("user","pass","domain"))'
I'd recommend storing the username/password in a somewhat more safer format, but this should do your trick.
I'm not sure you can do SMTP authentication using the send-mailmessage command. But, you can send a message through an SMTP server that requires authentication using the Net.Mail.SmtpClient object and the System.Net.Mail.MailMessage object. See How to pass credentials to the Send-MailMessage command for sending emails for a good example.
look at the last exemple of send-mailmessage helppage
you will see you can pass credential whith the parameter -credential domain01\admin01
look here Using PowerShell credentials without being prompted for a password if you dont want any prompt (save your cred in a text file)