Invia Email Senza Sforzo con il Cmdlet PowerShell Send-MailMessage

Per questa cmdlet di PowerShell del giorno, stiamo coprendo la cmdlet di PowerShell Send-MailMessage. Questa cmdlet di PowerShell serve un solo scopo; inviare email in modi molteplici.

Poiché ci sono così tanti modi in cui la cmdlet Send-MailMessage può inviare messaggi di posta elettronica, immergiamoci e iniziamo a coprire tutti gli esempi comuni che potresti incontrare. In questo articolo, affronteremo molti esempi che vanno dal più semplice fino a alcuni scenari che non auguro a nessuno!

Questo post sarà una grande risorsa da segnalibro nel caso ti trovi in situazioni in cui hai bisogno di inviare email con PowerShell e dimentichi la sintassi.

Il server SMTP

Tutte le email devono passare attraverso un server SMTP in qualche luogo tramite un server e una porta. Per specificare il server SMTP da utilizzare, utilizzare un parametro chiamato SMTPServer che consente di specificare il server SMTP per stabilire una connessione e inoltrare la posta. Tuttavia, non è obbligatorio.

Se non si specifica un valore per il parametro SMTPServer, verrà utilizzato il valore memorizzato nella variabile di preferenza $PSEmailServer. È possibile assegnare un valore a questa variabile come si farebbe con qualsiasi altra variabile.

Assigning a value to the $PSEmailServer preference variable
PS51> $PSEmailServer = 'smtp.server.local'

Tuttavia, questa variabile non è valida tra le sessioni di PowerShell. Ciò significa che è necessario definirla ogni volta che si apre una nuova sessione di PowerShell. Per questo motivo, consiglio di utilizzarla definendola sopra il tuo riferimento a Send-MailMessage o di non definirla affatto. Invece, personalmente consiglio di fornire il valore del parametro SMTPServer. In questo modo non è necessario gestire una variabile esterna che potrebbe cambiare.

PS51> Send-MailMessage -SmtpServer 'smtp.server.local'

Porta

Per impostazione predefinita, il valore che il cmdlet cercherà di utilizzare per inviare un’email tramite il server SMTP è la porta 25. Questa è una connessione SMTP semplice e non crittografata. Tuttavia, oggigiorno è più comune inviare email crittografate utilizzando SSL/TLS (tratteremo questi scenari in seguito).

Se è necessario modificare la porta predefinita 25, è possibile utilizzare il parametro Port.

PS51> Send-MailMessage -SmtpServer 'smtp.server.local' -Port 587

Destinatari e mittenti

Per inviare un’email a diversi destinatari tramite campi come To, Cc e Bcc, il cmdlet dispone di vari parametri per adattarsi a questo.

I parametri To, Cc e Bcc nel cmdlet Send-Mailmessage

Il cmdlet ha tre parametri, ognuno dei quali supporta più destinatari separati da una virgola, chiamati To, Cc e Bcc.

È possibile specificare singoli indirizzi come di seguito.

Sending email to one recipient via To, Cc and Bcc
PS51> Send-MailMessage -To joe@gmail.com -Cc bob@gmail.com -Bcc susie@hotmail.com -Subject 'this is a subject'

O è possibile specificare più destinatari per ciascun valore del parametro.

Sending email to multiple recipients via To, Cc and Bcc
PS51> Send-MailMessage -To joe@gmail.com, tony@mycompany.local -Cc bob@gmail.com, rick@othercompany.com -Bcc susie@hotmail.com,secret@fooorg.org -Subject 'this is a subject'

Il parametro From

Quando si invia un’e-mail, è possibile specificare anche il parametro From che imposterà l’intestazione di risposta nell’e-mail. Questo parametro consente solo un indirizzo. Se un destinatario sceglie di rispondere all’e-mail, questo sarà l’indirizzo e-mail a cui verrà inviata la risposta.

Sending email from an address
PS51> Send-MailMessage -From me@company.org -To joe@gmail.com -Subject 'this is a subject'

Per impostazione predefinita, utilizzare un indirizzo e-mail mostrerà semplicemente l’indirizzo e-mail nel campo DA del destinatario. Tuttavia, se desideri specificare un nome o qualche tipo di etichetta come Casella postale dell’account di servizio, è possibile specificare anche un nome e un indirizzo e-mail come segue:

Adam Bertram <adbertram@gmail.com>

È possibile notare l’uso del parametro Oggetto. Questo parametro è sempre richiesto. Vedrai questo parametro utilizzato in tutti gli esempi.

Corpo

Il parametro Corpo consente di specificare cosa sarà nel corpo dell’e-mail. Nel modo più semplice, è possibile specificare qualsiasi testo desiderato e il cmdlet lo invierà come testo normale.

PS51> Send-MailMessage -From me@company.org -To joe@gmail.com -Subject 'this is a subject' -Body 'this is the body'

Invio di e-mail con corpo HTML

È anche possibile inviare un corpo dell’e-mail utilizzando HTML anziché testo normale. Per farlo, utilizzare lo stesso parametro Corpo come si farebbe con il testo normale, ma utilizzare HTML per la stringa e utilizzare il parametro di commutazione CorpoComeHtml.

Sending an HTML table in an email
$body = @' <table style="width:100%"> <tr> <th>Firstname</th> <th>Lastname</th> <th>Age</th> </tr> <tr> <td>Jill</td> <td>Smith</td> <td>50</td> </tr> <tr> <td>Eve</td> <td>Jackson</td> <td>94</td> </tr> </table> '@ PS51> Send-MailMessage -From me@company.org -To joe@gmail.com -Subject 'this is a subject' -Body $body -BodyAsHtml

Notate nell’esempio precedente, ho racchiuso la stringa del corpo tra @' e '@. Questo è chiamato un here string. Questo ti permette di definire lunghe stringhe tipicamente presenti nei corpi delle email che contengono ritorni a capo. Le here strings preservano la formattazione delle stringhe ed è un ottimo modo per definire il corpo dell’email, specialmente se è in HTML.

Codifica

Se hai caratteri speciali nel soggetto o nel corpo della tua email, puoi utilizzare il parametro Codifica. Questo parametro ti permette di codificare il soggetto e il corpo dell’email tramite il tipo di codifica specificato prima dell’invio.

Hai alcune opzioni qui:

  • ASCII (predefinito)
  • UTF8
  • UTF7
  • UTF32
  • Unicode
  • BigEndianUnicode
  • Predefinito
  • OEM
PS51> Send-MailMessage -From me@company.org -To joe@gmail.com -Subject 'this is a subject' -Body 'this is the body' -Encoding UTF8

Allegati

Il cmdlet può anche allegare uno o più file. Per farlo, puoi utilizzare il parametro Allegati e fornire il percorso del file(i) che desideri allegare.

Attaching the C:\file.doc to an email
PS51> Send-MailMessage -From me@company.org -To joe@gmail.com -Subject 'this is a subject' -Body 'this is the body' -Attachments 'C:\file.doc'

Puoi anche specificare più allegati tramite una collezione separandoli con una virgola.

Attaching the C:\file.doc and D:\report.xlsx file to an email
PS51> Send-MailMessage -From me@company.org -To joe@gmail.com -Subject 'this is a subject' -Body 'this is the body' -Attachments 'C:\file.doc','D:\report.xlsx'

Il parametro Allegati ti permette anche di passare file tramite cmdlet come Get-Item e Get-ChildItem al cmdlet Send-MailMessage.

PS51> Get-ChildItem -Path 'C:\MyFiles' | Send-MailMessage -From me@company.org -To joe@gmail.com -Subject 'this is a subject' -Body 'this is the body'

Email Sicure e Autenticate

Per impostazione predefinita, il cmdlet invia la posta elettronica tramite comunicazione SMTP non crittografata sulla porta 25. Tuttavia, supporta anche l’invio di posta elettronica crittografata tramite SSL/TLS con nome utente e password.

Se si tenta di inoltrare la posta elettronica attraverso un server SMTP che richiede l’autenticazione, il comando fallisce con un messaggio di errore come quello riportato di seguito.

Error message when attempting to send unencrypted email.
The SMTP server requires a secure connection or the client was not authenticated. The server response was: 5.7.0 Must issue a STARTTLS command first.

Per rimediare a ciò, è necessario specificare innanzitutto la porta (tipicamente 587 per TLS) e il parametro UseSsl. Questo indica al cmdlet di tentare di connettersi alla porta 587 del server SMTP e crittografare l’intero messaggio. In genere (sempre?), sarà anche necessario specificare il nome utente/password per autenticarsi al server SMTP utilizzando il parametro Credential.

PS51> $credential = Get-Credential
PS51> Send-MailMessage -From me@company.org -To joe@gmail.com -Subject 'this is a subject' -Body 'this is the body' -UseSsl -Port 587 -Credential $credential

Nel codice sopra, sto ottenendo un oggetto di credenziali (PSCredential) usando il cmdlet Get-Credential. Questo a volte può creare un problema perché è interattivo, il che significa che interrompe lo script per chiedere un nome utente e una password. Per evitarlo, potresti creare un oggetto PSCredential al volo.

A common email example is to use Gmail. Using the knowledge you’ve gained above, you can now easily send email through Gmail using the smtp.gmail.com SMTP server as shown below.

$gmailCred = Get-Credential

$sendMailParams = @{
    From = '[email protected]' ## Deve essere gmail.com
    To = '[email protected]'
    Subject = 'some subject'
    Body = 'some body'
    SMTPServer = 'smtp.gmail.com'
    SMTPPort = 587
    UseSsl = $true
    Credential = $gmailCred
}

Send-MailMessage @sendMailParams

Assegnazione della priorità della posta elettronica

Anche se personalmente ritengo che sia una funzionalità della posta elettronica che vorrei vedere sparire, è possibile assegnare livelli di priorità alle email che si inviano tramite il parametro Priority. Questa priorità viene poi interpretata in modi diversi dal client di posta elettronica.

High priority message in Outlook

Send-mailmessage consente di assegnare tre diverse priorità a una email.

  • Normale (predefinita)
  • Alta
  • Bassa
Assigning a high-priority email
PS51> Send-MailMessage -From me@company.org -To joe@gmail.com -Subject 'this is a subject' -Body 'this is the body' -Priority High

Ma per amor del cielo, non pensare che tutte le tue email siano di alta priorità!

Notifiche di consegna

Finalmente, puoi specificare notifiche di consegna per le email. Le notifiche di consegna sono ciò che comunemente viene chiamato ricevute di lettura in alcuni client di posta elettronica. Le notifiche di consegna ti consentono di essere avvisato se/quando l’email viene ricevuta dal destinatario. Tuttavia, il destinatario deve ancora consentirlo.

Hai quattro opzioni quando richiedi le notifiche di consegna.

  • Nessuna (predefinita)
  • Sucess (quando la consegna dell’email è riuscita)
  • Fallimento (notifica se la consegna non è riuscita)
  • Ritardo (quando l’email viene ritardata tramite un server SMTP)

Puoi specificare un’opzione di notifica di consegna utilizzando il parametro DeliveryNotificationOptions.

Requesting a notification on delivery
PS51> Send-MailMessage -From me@company.org -To joe@gmail.com -Subject 'this is a subject' -Body 'this is the body' -DeliveryNotificationsOptions 'OnSuccess'

Puoi anche richiedere più notifiche di consegna contemporaneamente separandole con una virgola.

Requesting a notification for all types
PS51> Send-MailMessage -From me@company.org -To joe@gmail.com -Subject 'this is a subject' -Body 'this is the body' -DeliveryNotificationsOptions 'OnSuccess','OnFailure','Delay'

Riepilogo

In questo post, hai imparato tutto sul cmdlet Send-mailmessage e su cosa può fare. Abbiamo coperto approfonditamente questo cmdlet utilizzando ogni parametro che ha insieme agli esempi. Spero che questo post possa servire come riferimento per te quando utilizzi il cmdlet Send-mailmessage.

Ulteriori letture

Assicurati di dare un’occhiata ad altri post correlati!

Source:
https://adamtheautomator.com/send-mailmessage/