Il modo più semplice per inviare posta a una riga tramite riga di comando utilizzando Gmail?


32

L'uso di Raspbian e Ubunntu 16.04 LTS richiede una soluzione Linux generica.

Il requisito è semplice:

Ho bisogno di un modo per inviare messaggi di posta elettronica a una riga dalla riga di comando.

Ho creato un account Gmail proprio per questo particolare Rpi3, con l'indirizzo di rpi3abc@gmail.com - senza 2FA

Quindi ora devo essere in grado di inviare messaggi di posta a una riga da qualsiasi luogo (incluso cron) senza l'intervento dell'utente.


Vorrei anche che fosse in grado di inviare file di testo; in sostanza, qualsiasi cosa stdin.


vuoi che il tuo messaggio provenga da questo particolare indirizzo, rpi3abc@gmail.com o è giusto per te quel messaggio provenga dal tuo nome utente @ localhost?
John Smith,

Viene da rpi3abc@gmail.com, quindi so che il mio computer mi sta comunicando. Lo uso nei lavori cron, per lo più.
SDsolar,

Risposte:


33

La risposta più semplice all'invio di messaggi di una riga tramite Gmail è utilizzare ssmtp


Installalo con i seguenti comandi:

sudo apt-get update
sudo apt-get install ssmtp

Modifica /etc/ssmtp/ssmtp.confper assomigliare a questo:

root=rpi3abc@gmail.com
mailhub=smtp.gmail.com:465
FromLineOverride=YES
AuthUser=rpi3abc@gmail.com
AuthPass=testing123
UseTLS=YES

Invia un one-liner in questo modo:

echo "Testing...1...2...3" | ssmtp myusername@gmail.com

o

printf "Subject: Test\n\nTesting...1...2...3" | ssmtp myusername@gmail.com

Quindi, fedele a * nix, è possibile ottenere il prompt in pochi secondi.

Controlla il tuo account myusername@gmail.com e voilà, è lì!


Questo funziona bene anche quando si invia un file, in questo modo:

cat program.py | ssmtp myotherusername@yahoo.com

E il programma verrà visualizzato nella cassetta postale

Se il file è un file di testo, può avere una prima riga che dice Subject: xxxxxx

Questo può essere usato con vari lavori cron, può inviarmi dati con righe dell'oggetto che indicano il contenuto.


Questo funzionerà con tutto ciò che prepara un messaggio che viene reindirizzato in ssmtp tramite stdin.


Per maggiori dettagli come proteggere questi file contro altri utenti e simili, visita questo articolo:

Invia e-mail dalla riga di comando di Raspberry Pi


Assicurati di guardare anche in basso alla risposta postata Ruisul blocco FROM:dell'indirizzo che potrebbe essere modificato in file di messaggi formattati, se necessario.


Ora, se solo potessi capire come inviare SMS allo stesso modo.


1
Uso anche ssmtpnelle mie macchine virtuali, molto leggere. +1
Rui F Ribeiro,

1
Perché non usare l'API sendmail da Python e inviarla direttamente allora?
Rui F Ribeiro,

Per fare un ulteriore passo avanti, ecco delle istruzioni molto semplici per includere un file immagine come allegato: unix.stackexchange.com/questions/381131/…
SDsolar

Per rispondere alla domanda di Rui: sendmailda solo non ha MTA - Mail Transport Agent per comunicare all'esterno della macchina. Per impostazione predefinita, poiché Unixen è multiutente in base alla progettazione, sendmailinvierà messaggi ad altri utenti nella stessa casella ma non all'esterno. ssmtpè l'MTA che penso sia più semplice da configurare per Gmail.
SDsolar

1
trascorso per sempre cercando di installare postix questo ha funzionato! una nota per chiunque legga questo, la conf ha un refuso, il parametro root dovrebbe essere gmail.com non gmail.
qodeninja,

9

ssmtpè solo uno dei tanti wrapper Sendmail. Tutti questi accettano un messaggio sull'input standard e, facoltativamente, un elenco di indirizzi come argomenti della riga di comando e offrono tutti un nome binario sendmailche implementa (almeno le funzionalità di base) della tradizionale API della riga di comando di Sendmail. Ma parlando correttamente, quel messaggio deve essere un messaggio RFC822 ben formato. Come minimo, dovrebbe avere Subject:un'intestazione.

ssmtp address@example.com <<<$'Subject: testing 1...2...3'

(Con ssmtp, sendmailè solo un collegamento simbolico a ssmtp. Postfix, Exim e credo in ogni altro MTA che Provides: mail-transport-agentha una disposizione simile, tranne ovviamente sendmaildove il sendmailbinario è "la cosa reale".)

Più comunemente, puoi mettere insieme un semplice messaggio di posta elettronica con un documento qui.

/usr/lib/sendmail -oi -t <<____HERE
Subject: testing
To: recipient@example.net

Here we interpolate the shell variable $result
____HERE

(L' -topzione Sendmail dice di prendere l'elenco dei destinatari dalle intestazioni del messaggio che ricevi sull'input standard. Il percorso preciso di Sendmail differirà tra le piattaforme.)

Un'altra variante comune è quella di combinare l'output di alcuni comandi. Assicurati di avere una linea vuota (un "collo") tra le intestazioni e il corpo del messaggio.

( printf "Subject: random number\n\n"
  dd if=/dev/urandom bs=4 count=1 2>/dev/null | od -D -An ) |
sendmail elsewhere@example.org

Per qualsiasi cosa al di là dei messaggi di solo testo ASCII molto semplici, devi capire come comporre un messaggio MIME appropriato, a quel punto di solito ha più senso usare uno strumento come mutt. Alcune piattaforme hanno un mailo mailxche sa come inviare allegati e testo non ASCII, ma questo non è completamente portatile.

La sfida qui non è trovare un client che possa prendere un messaggio e-mail e tentare di inviarlo, è configurarlo per le specifiche di Gmail, che richiede all'MTA di conoscere il nome utente e la password da usare per il server remoto per per poterlo utilizzare come smarthost in uscita.

Dietro le quinte, la maggior parte dei client piace mutt, mailxecc. In genere corre sendmaildietro le quinte per togliere il messaggio dal sistema.


Non avrò molta fortuna con l'utilizzo diretto di sendmail; quindi rivolgendosi a ssmtp. Valuta la tua risposta. A proposito, al fine di inviare immagini come allegati ho trovato il modo più semplice possibile. Non devo nemmeno pensare al MIME. Uso solo mpack, come descritto qui: unix.stackexchange.com/questions/381131/…
SDsolar,

8

Aggiungendo alla propria risposta OP:

Durante la configurazione ssmtp, è inoltre possibile vietare o consentire agli utenti di definire il Da e inoltre ignorare il dominio; potresti volerlo fare per diversi motivi tra cui il messaggio che non rientra nella cartella Spam.

Puoi aggiungere a /etc/ssmtp/ssmtp.conf:

# Where will the mail seem to come from?
rewriteDomain=my_internet_domain.uk

# Are users allowed to set their own From: address?
# YES - Allow the user to specify their own From: address
# NO - Use the system generated From: address
FromLineOverride=YES

Si noti che mentre SI può essere utilizzato in un lampone domestico, potrebbe non essere consigliabile in un sistema multiutente dal punto di vista della sicurezza.


Upvote. Informazioni eccellenti
SDsolar

5

Cosa c'è che non va nella "posta"?

echo "Ciao a tutti" | mail -s "Posta importante" user@example.com

"mail" essendo / etc / collegamento alternativo a / usr / bin / bsd-mailx dal pacchetto bsd-mailx. Credo che sia lì per impostazione predefinita. Grande utilità per l'invio di posta da script cron, ad esempio.

Funziona anche su Ubuntu e FreeBSD.


3
mailxè solo un front-end. Richiede che alcuni MTA siano configurati per ottenere effettivamente il messaggio dal sistema locale. Esistono più versioni incompatibili di uso comune, sebbene se la tua piattaforma di destinazione è solo Debian, puoi fare affidamento su comportamenti BSD abbastanza recenti.
triplo

4

Sono davvero parziale all'utilizzo mailxper questo:

echo "Message body." | mailx -s "Subject line" -a /path/attachment.txt -r "Sender's Name<sender@email.com>" -c recipient2@email.com recipient1@email.com

1
Molte delle opzioni qui non saranno disponibili su molti sistemi non Debian / non BSD. L' -aopzione in particolare sarebbe meravigliosa se fosse universalmente supportata, ma basta sfogliare le mailxdomande qui per vedere che questo non è certamente il caso.
triplo

2

Uso sendEmail per inviare semplici e-mail automatizzate tramite il server SMTP di un provider esterno:

sendEmail -q -f "me@mail.com" -u "mySubject" -t "someone@mail.org" -s "my.smtp.com" -o tls=yes -xu "mySmtpUser" -xp "mySmtpPw" -m "myMessage"

Passo tutto su una riga, quindi farlo su una riga di comando probabilmente mostrerebbe tutti i parametri (inclusa la password smtp) a tutti gli utenti, se eseguono per un ps -efpo 'sto eseguendo il comando. Lo uso all'interno di uno script di shell.


1
Questa non è un'installazione standard e ci sono più client con questo nome. Immagino che ti riferisci a en.wikipedia.org/wiki/SendEmail . È disponibile come pacchetto Debian?
triplo

Buona riflessione sullo script della shell, come su un sistema multiutente. Mi piace che la mia password sia in un file nelle viscere della macchina. Vorrei solo poter memorizzare una password con hash anziché un testo in chiaro.
SDsolar,


1
Non vedo questa risposta che dimostra che funziona con Gmail come specificato nella domanda originale.
SDsolar

Questo funziona con Gmail, ad esempio: `-s smtp.gmail.com -o tls = yes -xp your_gmail_password -s smtp.gmail.com: 587`
rogerdpack

1

Il mio server è CEntOS 7 e ha sendmail ma non mailx ecc. Invece di installare un nuovo programma che ho testato usando sendmail direttamente, e ho scoperto che funziona:

echo -e "From: you@whatever\nTo: you@gmail.com\nSubject: this is the subject\n\nThis is the body,\nwith multiple lines." | sendmail -t

Per me questo sembra essere il modo più semplice per inviare una breve e-mail, in quanto non richiede l'esecuzione o la configurazione di un server o un demone e può essere fatto in una singola riga di comando.

L'idea è che un messaggio mi avviserà semplicemente che un determinato programma ha generato un errore, senza rivelare alcuna informazione potenzialmente riservata, e quindi invierò SSH al server per ispezionarne i registri. In questo modo non è necessario preoccuparsi di complicazioni come allegare file o crittografare il trasporto.

Gli appunti:

  • -e dice a echo di interpretare '\ n' e altre escape.
  • -t dice a sendmail di ottenere gli indirizzi dei destinatari da "A:" nell'intestazione del messaggio.
  • Se la posta non arriva, utilizzare tail /var/log/maillogper visualizzare i messaggi di errore.
  • Se invii al tuo indirizzo Gmail, crea un filtro su Gmail per tenerli fuori dalla cartella spazzatura.
  • Questo sendmail è in realtà "sendmail.postfix" (che potrebbe essere normale); c'è una pagina man qui

1
Il tuo sistema deve avere un MTA installato con cui funziona sendmail - ma non vedo questa risposta che dimostra che funziona con Gmail come specificato nella domanda originale ...
SDsolar

@SDsolar Hai ragione. Postfix è in esecuzione sul mio server e non lo sapevo. Sembra standard con l'installazione di Centos; forse DigitalOcean lo ha configurato. Non sta ascoltando su un porto pubblico. Per quanto riguarda l'invio tramite Gmail, il punto è che non è necessario, è possibile inviare direttamente dal proprio server, se si invia solo a te stesso. (Potrei fare la mia domanda e spostare questa risposta, se non si adatta qui.)
j77h
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.