Articles

Adam the Automator

Posted on

Per questo cmdlet PowerShell del giorno, stiamo coprendo il cmdlet PowerShell Send-MailMessage. Questo cmdlet PowerShell ha uno scopo e uno solo: inviare e-mail in molti modi diversi.

Siccome ci sono così tanti modi in cui il cmdlet Send-MailMessage può inviare messaggi e-mail, tuffiamoci subito e iniziamo a coprire tutti gli esempi comuni che si possono incontrare. In questo articolo, copriremo molti esempi che vanno dai più semplici fino ad alcuni scenari che non auguro a nessuno!

Questo post sarà una grande risorsa da mettere nei preferiti nel caso in cui vi imbattiate in casi in cui avete bisogno di inviare e-mail con PowerShell e dimenticate la sintassi.

Tabella dei contenuti

Il server SMTP

Tutte le email devono passare attraverso un server SMTP da qualche parte attraverso un server e una porta. Per specificare il server SMTP da usare, usa un parametro chiamato SMTPServer che ti permette 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. Puoi assegnare un valore a questa variabile proprio come faresti con qualsiasi altra variabile.

PS51> $PSEmailServer = 'smtp.server.local'

Tuttavia, questa variabile non vive attraverso le sessioni di PowerShell. Ciò significa che devi definirla ogni volta che si apre una nuova sessione di PowerShell. Per questo motivo, ti consiglio di usarla definendola sopra il tuo riferimento Send-MailMessage o di non definirla del tutto. Invece, personalmente fornirei il valore del parametro SMTPServer. In questo modo non dovrete gestire una variabile esterna che potrebbe cambiare.

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

Porta

Di default, il valore che il cmdlet tenterà di inviare un’email attraverso il server SMTP è la porta 25. Questo è un semplice SMTP non criptato. Tuttavia, al giorno d’oggi, è più comune inviare email criptate usando SSL/TLS (Tratteremo questi scenari più avanti).

Se hai bisogno di cambiare la porta dalla 25, puoi usare il parametro Port.

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

Destinatari e Originatori

Per inviare un’email a diversi destinatari attraverso metodi come i campi To, Cc e Bcc, il cmdlet ha vari parametri per soddisfare questa esigenza.

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

La cmdlet ha tre parametri che supportano ciascuno più destinatari separati da una virgola chiamati ToCc e Bcc.

È possibile specificare singoli indirizzi come qui sotto.

PS51> Send-MailMessage -To -Cc -Bcc -Subject 'this is a subject'

Oppure è possibile specificare più destinatari per ogni valore del parametro.

PS51> Send-MailMessage -To , -Cc , -Bcc , -Subject 'this is a subject'

Il parametro Da

Quando si inviano le email, è possibile specificare anche il parametro From che imposterà l’header di risposta nella email. Questo parametro permette solo un indirizzo. Se un destinatario sceglie di rispondere all’e-mail, questo sarà l’indirizzo e-mail a cui la risposta sarà indirizzata.

PS51> Send-MailMessage -From -To -Subject 'this is a subject'

Di default, l’utilizzo di un indirizzo e-mail mostrerà semplicemente l’indirizzo e-mail nel campo FROM del destinatario. Tuttavia, se vuoi specificare un nome o qualche tipo di etichetta come Service Account Mailbox, puoi anche specificare un nome e un’email come:

Adam Bertram <>

Nota che è stato usato il parametro Subject. Questo parametro è sempre richiesto. Vedrai questo parametro utilizzato in tutti gli esempi.

Body

Il parametro Body ti permette di specificare cosa ci sarà nel corpo della mail. Nel modo più semplice, puoi specificare qualsiasi testo che desideri e il cmdlet lo invierà via testo semplice.

PS51> Send-MailMessage -From -To -Subject 'this is a subject' -Body 'this is the body'

Invio di email con corpo HTML

Puoi anche inviare un corpo di email via HTML piuttosto che con testo semplice. Per farlo, usate lo stesso parametro Body come fareste con il testo semplice, ma usate HTML per la stringa e usate il parametro BodyAsHtml.

$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 -To -Subject 'this is a subject' -Body $body -BodyAsHtml

Nota nell’esempio precedente, ho racchiuso la stringa del corpo in @' e '@. Questo è chiamato una stringa qui. Questo permette di definire lunghe stringhe tipicamente viste nei corpi delle e-mail che contengono ritorni a capo. Le stringhe qui preservano la formattazione delle stringhe ed è un ottimo modo per definire il corpo dell’email specialmente se è in HTML.

Codifica

Se hai caratteri speciali nell’oggetto o nel corpo della tua email, puoi usare il parametro Encoding. Questo parametro ti permette di codificare l’oggetto e il corpo dell’email attraverso il tipo di codifica specificato prima dell’invio.

Hai alcune opzioni qui:

  • ASCII (predefinito)
  • UTF8
  • UTF7
  • UTF32
  • Unicode
  • BigEndianUnicode
  • Default
  • OEM
PS51> Send-MailMessage -From -To -Subject 'this is a subject' -Body 'this is the body' -Encoding UTF8

Allegati

La cmdlet può anche allegare uno o più file. Per farlo, puoi usare il parametro Attachments e fornire il percorso del o dei file che vorresti allegare.

PS51> Send-MailMessage -From -To -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.

PS51> Send-MailMessage -From -To -Subject 'this is a subject' -Body 'this is the body' -Attachments 'C:\file.doc','D:\report.xlsx'

Il parametro Attachments permette anche di fare il pipe dei file tramite cmdlets come Get-Item e Get-ChildItem al Send-MailMessage cmdlet pure.

PS51> Get-ChildItem -Path 'C:\MyFiles' | Send-MailMessage -From -To -Subject 'this is a subject' -Body 'this is the body'

Email sicure e autenticate

Per impostazione predefinita, il cmdlet invia le email tramite comunicazione SMTP non criptata sulla porta 25. Tuttavia, ha anche il supporto per l’invio di email criptate via SSL/TLS con un nome utente e una password.

Se si tenta di inoltrare le email attraverso un server SMTP che richiede l’autenticazione, il comando fallisce con un messaggio di errore come quello che segue.

The SMTP server requires a secure connection or the client was notauthenticated. The server response was: 5.7.0 Must issue a STARTTLS command first.

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

PS51> $credential = Get-CredentialPS51> Send-MailMessage -From -To -Subject 'this is a subject' -Body 'this is the body' -UseSsl -Port 587 -Credential $credential

Sopra sto afferrando un oggetto credenziale (PSCredential) usando la cmdlet Get-Credential. Questo a volte pone un problema perché è interattivo, il che significa che ferma lo script per chiedere un nome utente e una password. Per evitare questo, si potrebbe creare un oggetto PSCredential al volo.

Un esempio comune di e-mail è quello di utilizzare Gmail. Usando le conoscenze acquisite in precedenza, è ora possibile inviare facilmente e-mail attraverso Gmail utilizzando il server SMTP smtp.gmail.com come mostrato di seguito.

$gmailCred = Get-Credential$sendMailParams = @{ From = '' ## Must be gmail.com To = '' Subject = 'some subject' Body = 'some body' SMTPServer = 'smtp.gmail.com' SMTPPort = 587 UseSsl = $true Credential = $gmailCred}Send-MailMessage @sendMailParams

Assegnare la priorità alle e-mail

Anche se una caratteristica delle e-mail che personalmente vorrei morisse, è possibile assegnare livelli di priorità alle e-mail inviate tramite il parametro Priority. Questa priorità viene poi interpretata in vari modi dal client di posta elettronica.

Messaggio ad alta priorità in Outlook
Messaggio ad alta priorità in Outlook

Send-mailmessage ti permette di assegnare ad una email tre diverse priorità.

  • Normale (default)
  • Alta
  • Bassa
PS51> Send-MailMessage -From -To -Subject 'this is a subject' -Body 'this is the body' -Priority High

Ma per favore, per l’amor di Dio, non pensare che tutte le tue email siano ad alta priorità!

Notifiche di consegna

Infine, puoi specificare le notifiche di consegna delle email. Le notifiche di consegna sono ciò che è tipicamente noto come ricevute di lettura in alcuni client di posta elettronica. Le notifiche di consegna ti permettono di essere avvisato se/quando l’email viene ricevuta dal destinatario. Tuttavia, il destinatario deve ancora permetterlo.

Hai quattro opzioni quando richiedi le notifiche di consegna.

  • Nessuno (predefinito)
  • OnSuccess (quando la consegna dell’email ha successo)
  • OnFailure (notifica se la consegna non ha successo)
  • Delay (quando l’email è in ritardo tramite un server SMTP)

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

PS51> Send-MailMessage -From -To -Subject 'this is a subject' -Body 'this is the body' -DeliveryNotificationsOptions 'OnSuccess'

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

PS51> Send-MailMessage -From -To -Subject 'this is a subject' -Body 'this is the body' -DeliveryNotificationsOptions 'OnSuccess','OnFailure','Delay'

Riepilogo

In questo post, avete imparato tutto sul cmdlet Send-mailmessage e sulle sue potenzialità. Abbiamo coperto ampiamente questo cmdlet usando ogni parametro che ha insieme ad esempi. Spero che questo post possa servire come riferimento per te quando usi la cmdlet Send-mailmessage.

Altre letture

Assicurati di controllare altri post correlati!

  • Utilizzando il Get-ChildItem cmdlet PowerShell
  • Utilizzando il Set-Content cmdlet PowerShell
  • Utilizzando il Out-File cmdlet PowerShell

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *