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.
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.
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
.
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.
O è possibile specificare più destinatari per ciascun valore del parametro.
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.
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:
È 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.
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
.
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
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.
Puoi anche specificare più allegati tramite una collezione separandoli con una virgola.
Il parametro Allegati
ti permette anche di passare file tramite cmdlet come Get-Item
e Get-ChildItem
al cmdlet Send-MailMessage
.
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.
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
.
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.
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.

Send-mailmessage consente di assegnare tre diverse priorità a una email.
- Normale (predefinita)
- Alta
- Bassa
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
.
Puoi anche richiedere più notifiche di consegna contemporaneamente separandole con una virgola.
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!