Hoe een e-mail versturen met Windows PowerShell

Windows PowerShell is vooral bekend als een command-line shell die wordt gebruikt om een aantal beheertaken op te lossen in Windows en apps die op dit OS draaien. Tegelijkertijd is het een scripttaal waarmee je cmdlets – lichtgewicht commando’s om specifieke functies uit te voeren – op maat kunt maken. En vandaag gaan we het hebben over Send-MailMessage, een cmdlet om e-mails te versturen vanuit PowerShell, maar ook over andere manieren om dit te doen.

Het eenvoudigste script om met PowerShell een e-mail te versturen

Laten we met eenvoudige dingen beginnen. Hier is een éénregelig script gebaseerd op het Send-MailMessage cmdlet dat je nu al kunt gebruiken om vanuit PowerShell een e-mail te versturen met behulp van het SMTP protocol.

Send-MailMessage -To "<recipient’s email address>” -From "<sender’s email address>” -Subject "Your message subject” -Body "Some important plain text!” -Credential (Get-Credential) -SmtpServer "<smtp server>” -Port 587

Het enige dat je nodig hebt is om het e-mail adres van een afzender en een ontvanger in te voegen, alsmede de SMTP server die je gaat gebruiken op te geven. Kopieer en plak dit script vervolgens in uw PowerShell en druk op enter.

<

Mailtrap zal ons helpen om te controleren of het werkt. Meld u aan en ga naar uw Demo inbox. Zoek de SMTP-referenties en tweak het script als volgt:

Send-MailMessage -To "[email protected]” -From "[email protected]” -Subject "Hey, Jon” -Body "Some important plain text!” -Credential (Get-Credential) -SmtpServer "smtp.mailtrap.io” -Port 587

Hier hebben we alleen de SMTP-host gespecificeerd. De adressen van de ontvanger en de afzender zijn niet echt, zoals je misschien al geraden had. En dat is een van de voordelen van het gebruik van een nep SMTP server. Je hoeft je niet bezig te houden met echte e-mail om de e-mail workflow te testen. Je kunt ook een dummy e-mail gebruiken, maar dat kan een slechte testpraktijk zijn. Lees waarom in ons blogbericht Waarom dummy-e-mail gebruiken voor testen gewoon niet werkt.

Probeer Mailtrap gratis

Als je dit script kopieert en plakt in PowerShell en op enter drukt, verschijnt er een venster waarin om SMTP credentials (gebruikersnaam en wachtwoord) wordt gevraagd. Vul ze in met die van Mailtrap, en dat is het. Controleer je Demo inbox en vind je bericht.

Kan ik vanuit PowerShell een HTML-e-mail of een e-mail met bijlagen naar meerdere ontvangers verzenden?

Ja, dat kan! Met Send-MailMessage kunt u uw e-mail opwaarderen met de vele parameters, waaronder HTML-inhoud, prioriteit, enzovoort. Ook kun je e-mails naar meerdere ontvangers sturen door ze op te geven in de betreffende parameter. Hier is waar u gebruik van kunt maken:

Parameter Omschrijving
-To E-mailadres van een geadresseerde of geadresseerden
-Bcc E-mailadres van een BCC ontvanger of ontvangers
-Cc E-mailadres van een CC-ontvanger of ontvangers
-From E-mailadres van de afzender
-Subject Onderwerp van de e-mail
-Body Tekst e-mailbody
-BodyAsHtml Bepaalt dat e-mailbodytekst HTML bevat
-Attachments Bestandsnamen die moeten worden bijgevoegd en het pad ernaar
-Credential Authenticatie om de e-mail te verzenden van het account
-SmtpServer Naam van de SMTP-server
-Port Poort van de SMTP-server
-DeliveryNotificationOption De afzender(s) die in de parameter Form is/zijn opgegeven, wordt/worden op de hoogte gebracht van de aflevering van de e-mail. Dit zijn de opties:

  • None – meldingen staan uit (standaardparameter)
  • OnSuccess – melding van een geslaagde levering
  • OnFailure – melding van een niet-succesvolle levering
  • Delay – melding van een vertraagde levering
  • Never – nooit meldingen ontvangen
  • -Encoding De codering voor de body en het onderwerp
    -Priority Bepaalt het prioriteitsniveau van het bericht. Geldige opties zijn:

  • Normal (standaardparameter)
  • Low
  • High
  • -UseSsl De verbinding met de SMTP-server zal tot stand worden gebracht met behulp van het SSL-protocol (Secure Sockets Layer)

    Dus, laten we een script maken dat een e-mail verstuurt met HTML-tekst en een bijlage. Deze keer definiëren we de parameters van tevoren en verwijzen er vervolgens naar in het Send-MailMessage cmdlet:

    $From = "[email protected]"$To = "[email protected]", "[email protected]”$Cc = "[email protected]"$Attachment = "C:\Temp\Drogon.jpg"$Subject = "Photos of Drogon"$Body = "<h2>Guys, look at these pics of Drogon!</h2><br><br>"$Body += "He is so cute!” $SMTPServer = "smtp.mailtrap.io"$SMTPPort = "587"Send-MailMessage -From $From -to $To -Cc $Cc -Subject $Subject -Body $Body -BodyAsHtml -SmtpServer $SMTPServer -Port $SMTPPort -UseSsl -Credential (Get-Credential) -Attachments $Attachment

    Zoals je hebt gemerkt, hebben we $Body += gebruikt om een nieuwe regel toe te voegen aan de bodytekst van het bericht. En zo ziet de e-mail er in de Mailtrap-inbox uit.

    Start gratis met het testen van je PowerShell e-mails.

    Verstuur een e-mail vanuit PowerShell met behulp van de SMTP-server van Gmail

    Alles is cool als je een nep-SMTP-server gebruikt om te testen. Maar wat als we een bericht versturen via een echte zoals Gmail. In dit geval, voeg smtp.gmail.com toe als de SMTP host en gebruik echte email adressen voor een afzender (je Gmail adres) en een ontvanger.

    We deden een poging en vulden de inloggegevens in het pop-up venster in. Maar de server antwoordde met een fout – 551 Authentication Required. Om dit probleem op te lossen, moet u de minder veilige app-toegang inschakelen op het tabblad Beveiliging van uw Google-account. We hebben het gedaan, en PowerShell heeft ons bericht met succes afgeleverd op de bestemming. Ontdek meer over SMTP-antwoordcodes en -opdrachten in onze speciale blogpost.

    SMTP-instellingen voor populaire e-mailproviders

    Niet iedereen is een Gmail-gebruiker. Als u een andere SMTP-host gebruikt, kunnen de volgende gegevens dus nuttig zijn.

    Gmail

    Office 365

    Service SMTP-server Port Connectie
    smtp.gmail.com 587
    25
    465
    TLS
    TLS
    SSL
    smtp.office365.com 587
    25
    TLS
    Outlook.com smtp-mail.outlook.com 587
    25
    TLS
    Yahoo mail smtp.mail.yahoo.com 587
    25
    465
    TLS
    TLS
    SSL
    Windows Live Hotmail smtp.live.com 587
    25
    TLS
    Zoho smtp.zoho.com 587
    465
    TLS
    SSL

    E-mails versturen vanuit PowerShell met EASendMail

    EASendMail is een SMTP-component die protocollen ondersteunt als SMTP, ESMTP (extended SMTP), EWS (Exchange Web Service), en WebDAV (Web Distributed Authoring and Versioning) protocollen. Het component wordt meestal gebruikt om e-mails te verzenden in COM/.NET/.NET Core-omgevingstoepassingen en apps die zijn gebouwd met:

    • ASP
    • VB
    • VBA
    • VC++
    • C++/CLI
    • C#
    • VB.NET
    • JavaScript
    • ASP.NET
    • Delphi

    Ook kun je EASendMail gebruiken om e-mails te versturen vanuit PowerShell. God mag weten waarom je het nodig hebt, maar hier is een handleiding hiervoor:

    • Stap 1: Installeer EASendMail met behulp van de installer
    • Stap 2: Maak het volgende script
    ::LoadFile("C:\Program Files (x86)\EASendMail\Lib\net20\EASendMail.dll")#change the path to the EASendMail.dll file if you have another build of run-time assembly for .NET Framework, .NET Core, or .NET Compact Frameworkfunction SendMailTo($sender, $name, $address, $subject, $body, $htmlFormat) { $mail = New-Object EASendMail.SmtpMail("TryIt") # you can replace "TryIt” with your license code for EASendMail SMTP component $mail.From.Address = $sender $recipient = New-Object EASendMail.MailAddress($name, $address) $mail.To.Add($recipient) > $null $mail.Subject = $subject if($htmlFormat) { $mail.HtmlBody = $body } else { $mail.TextBody = $body } $server = New-Object EASendMail.SmtpServer("smtp.mailtrap.io") $server.User = "*********" $server.Password = "*********" $server.Port = 587 $server.ConnectType = ::ConnectTryTLS# specify your settings of the SMTP server, username, password, port, and connection type $smtp = New-Object EASendMail.SmtpClient $smtp.SendMail($server, $mail)}function SendMailFromPowerShell () { $sender = "[email protected]" $name = "Jon Snow" $address = "[email protected]" $subject = "Happy Samhain" $body = "Jonny, congrats on Samhain!"# specify your settings of sender’s email address and name, recipient’s email address, as well as subject and body text of the message try { "Start to send email to {0} ..." -f $address SendMailTo $sender $name $address $subject $body "" "Email to {0} has been submitted to server!" -f $address } catch { "Failed to send email: {0}" -f $_.Exception.Message }}SendMailFromPowerShell

    • Stap 3: Voer het script uit en controleer de Mailtrap Demo inbox. Hier is het bericht.

    Start met testen

    Massamailing vanuit PowerShell met behulp van EASendMail Service Queue

    EASendMail SMTP-component is handig voor het verzenden van massa-e-mails. Hiervoor hoeft u niet meerdere threadings te coderen. Alles wat je nodig hebt is EASendMail Service die berichten met meerdere threadings automatisch in een wachtrij op de achtergrond kan versturen. Kijk eens naar het volgende script voor massa mailing van een bericht met een HTML template:

    ::LoadFile("C:\Program Files (x86)\EASendMail\Lib\net20\EASendMail.dll")#change the path to the EASendMail.dll file if you have another build of run-time assembly for .NET Framework, .NET Core, or .NET Compact Frameworkfunction SendMailToQueue($sender, $name, $address, $subject, $body, $htmlFormat) { $mail = New-Object EASendMail.SmtpMail("TryIt") $mail.From.Address = $sender $recipient = New-Object EASendMail.MailAddress($name, $address) $mail.To.Add($recipient) > $null $mail.Subject = $subject if($htmlFormat) { $mail.HtmlBody = $body } else { $mail.TextBody = $body } $server = New-Object EASendMail.SmtpServer("smtp.mailtrap.io") $server.User = "*********" $server.Password = "*********" $server.Port = 587 $server.ConnectType = ::ConnectTryTLS# specify your settings of the SMTP server, username, password, port, and connection type $smtp = New-Object EASendMail.SmtpClient $smtp.SendMailToQueue($server, $mail)}function OpenConnection () { $connectionString = "Server=localhost\AdminSystem;Database=test;Integrated security=SSPI;MultipleActiveResultSets=True;" Write-Host(("Connecting database {0} ..." -f $connectionString)) $sqlConnection = New-Object System.Data.SqlClient.SqlConnection $sqlConnection.ConnectionString = $connectionString# You can change the connection string to yours by specifying user and password: $connectionString = "Server=localhost\AdminSystem;Database=dbname;User Id=user;Password=yourpassword;MultipleActiveResultSets=True;" $sqlConnection.Open() Write-Host 'Connected' return $sqlConnection}function BuildHtmlBody ($sqlConnection) { Write-Host "Building HTML body based on database ..." $sqlQuery = "SELECT ID, Name, Email, Age, Department FROM users" $sqlCommand = New-Object System.Data.SqlClient.SqlCommand($sqlQuery, $sqlConnection); $reader = $sqlCommand.ExecuteReader() $html = "<!DOCTYPE html><html><body>" $html += "<div style=""font-family:'Segoe UI', Calibri, Arial, Helvetica; font-size: 14px; max-width: 768px;"">" $html += "Dear {name}, <br /><br />This is a congrats email on Samhain. <br />" $html += "Here is full data in table:<br /><br />" $html +="<table style='border-spacing: 0px; border-style: solid; border-color: #ccc; border-width: 0 0 1px 1px;'>" while ($reader.Read()) { $name = $reader.GetString(1) $address = $reader.GetString(2) $age = $reader.GetInt32(3) $department = $reader.GetString(4) $html += "<tr>" $html += "<td style='padding: 10px; border-style: solid; border-color: #ccc; border-width: 1px 1px 0 0;'>{0}</td>" -f $name $html += "<td style='padding: 10px; border-style: solid; border-color: #ccc; border-width: 1px 1px 0 0;'>{0}</td>" -f $address $html += "</tr>" } $reader.Close > $null $reader.Dispose > $null $sqlCommand.Close > $null $sqlCommand.Dispose > $null return $html}function SendMailFromDBToQueue () { $sender = "[email protected]" $subject = "Happy Samhain" $sqlConnection = OpenConnection $bodyTemplate = BuildHtmlBody($sqlConnection)$sqlQuery = "SELECT ID, Name, Email, Age, Department FROM users" $sqlCommand = New-Object System.Data.SqlClient.SqlCommand($sqlQuery, $sqlConnection); $reader = $sqlCommand.ExecuteReader() while ($reader.Read()) { $name = $reader.GetString(1).Trim() $address = $reader.GetString(2).Trim() $body = $bodyTemplate.Replace("{name}", $name) Write-Host(("Start to send email to {0} ..." -f $address)) SendMailToQueue $sender $name $address $subject $body "html" Write-Host(("Email to {0} has been submitted to easendmail service!" -f $address)) } $reader.Close > $null $reader.Dispose > $null $sqlCommand.Close > $null $sqlCommand.Dispose > $null $sqlConnection.Close > $null $sqlConnection.Dispose > $null } catch { "Failed to send email: {0}" -f $_.Exception.Message }}SendMailFromDBToQueue

    E-mails versturen vanuit PowerShell met System.Net.Mail API

    Send-MailMessage cmdlet is de meest gebruikte optie voor het versturen van emails vanuit PowerShell. Maar dit was niet altijd het geval. Het kwam beschikbaar vanaf PowerShell 3.0 en was gebaseerd op System.Net.Mail API. Het is een namespace die klassen bevat om elektronische berichten naar de SMTP-server te verzenden. De aflevering wordt uitgevoerd met de methode SmtpClient.Send of .Send. Laten we eens kijken naar het volgende voorbeeld:

    $EmailFrom = "[email protected]”$EmailTo = "[email protected]”$Subject = "Happy Samhain”$Body = "Jonny, congrats on Samhain!”$SMTPServer = "smtp.mailtrap.io”$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 587)$SMTPClient.EnableSsl = $true$SMTPClient.Credentials = New-Object System.Net.NetworkCredential("<username>", "<password>");$SMTPClient.Send($EmailFrom, $EmailTo, $Subject, $Body)

    Kijk eens naar Mailtrap’s Demo inbox en voila – het is binnen. Je kunt ook de .Send methode gebruiken en een aangepaste syntax zoals deze:

    $smtpFrom = "[email protected]”$smtpTo = "[email protected]”$messageSubject = "Happy Samhain”$messageBody = "Jonny, congrats on Samhain!”$smtpServer = "smtp.mailtrap.io”$smtp = New-Object Net.Mail.SmtpClient($SmtpServer, 587)$smtp.EnableSsl = $true$smtp.Credentials = New-Object System.Net.NetworkCredential("94b784b5970edf", "01a5d515011f6e");$smtp.Send($smtpFrom , $smtpTo, $messageSubject, $messageBody)

    Lees hoe Mailtrap je precies kan helpen bij het stroomlijnen van e-mail testprocessen uit onze case study met The Software House.

    Om af te ronden

    De System.Net.Mail namespace wordt ook gebruikt om berichten te maken en te verzenden in ASP.NET C# waar we ook over hebben geblogd. En dat was het voor vandaag. We hopen dat deze blog post uw vaardigheden in het gebruik van PowerShell heeft verruimd. Volg onze blog en ontdek nuttige expertise voor uw projecten.

    Als u van dit artikel hebt genoten, deel het dan en vertel het verder. We zullen het zeer waarderen.

    Geef een reactie

    Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *