Invio di una mail da uno script della shell di Linux


120

Voglio inviare un'e-mail da uno script della shell Linux. Qual è il comando standard per eseguire questa operazione e devo impostare nomi di server speciali?


8
Prova a chiedere su Superuser [ superuser.com ] o, meglio ancora, Unix e Linux SE [ unix.stackexchange.com ].
Dan Molding

Risposte:


119

Se il server è ben configurato, ad esempio ha un MTA attivo e funzionante, puoi semplicemente usare il comando mail.

Ad esempio, per inviare il contenuto di un file, puoi fare questo:

$ cat /path/to/file | mail -s "your subject" your@email.com

man mail per ulteriori dettagli.


7
Cosa significa "mta" qui, c'è un nome completo o un collegamento? Come principiante, è quello che voglio sapere. Poiché mi manca l'esperienza per farlo.
Zen

5
@Zen MTA è l'acronimo di Mail transport agent. postfix, sendmail, qmail ecc
Francesco Laurita

@ Zen per la maggior parte, puoi considerare MTA come server SMTP o IMAP.
user151841

1
Se non sei sicuro di come installare / configurare e sei su Ubuntu: sudo apt-get install mailutilse seleziona Sito Internet: La posta viene inviata e ricevuta direttamente tramite SMTP. .
user1717828

86

Se si desidera un approccio semplice e pulito in bash, e non si desidera utilizzare cat, echoe così via, il modo più semplice potrebbe essere:

mail -s "subject here" email@address.com <<< "message"

<<<viene utilizzato per reindirizzare lo standard input. Fa parte di bash per molto tempo.


6
echo -e "Some \ nMultiline and tab \ t msg" | mail -s "subject" your@email.com
Pipo

cat << END...END | mail -s "subject" test@example.com
ulidtko

Ehi, questo ha funzionato benissimo per me, grazie! Come posso specificare più indirizzi a cui consegnare?
E.Owen

1
@ E.Owen Puoi usare l'opzione -t per inviare a più indirizzi separati da spazi
Jon

25

Se sia exim che ssmtp sono in esecuzione, potresti avere problemi. Quindi, se vuoi solo eseguire un semplice MTA, solo per avere un semplice client smtp per inviare notifiche e-mail per insistenza, devi prima eliminare l'MTA eventualmente preinstallato come exim o postfix e reinstallare ssmtp.

Quindi è abbastanza semplice, configurare solo 2 file (revaliases e ssmtp.conf) - Vedi ssmtp doc -, e l'utilizzo nel tuo script bash o bourne è come:

#!/bin/sh  
SUBJECT=$1  
RECEIVER=$2  
TEXT=$3  

SERVER_NAME=$HOSTNAME  
SENDER=$(whoami)  
USER="noreply"

[[ -z $1 ]] && SUBJECT="Notification from $SENDER on server $SERVER_NAME"  
[[ -z $2 ]] && RECEIVER="another_configured_email_address"   
[[ -z $3 ]] && TEXT="no text content"  

MAIL_TXT="Subject: $SUBJECT\nFrom: $SENDER\nTo: $RECEIVER\n\n$TEXT"  
echo -e $MAIL_TXT | sendmail -t  
exit $?  

Ovviamente non dimenticare di aprire l'output del tuo firewall sulla porta smtp (25).


Dove posso modificare il numero di porta in questo script? Nel mio server la porta smtp funziona su 8181.
manix

Non lo farei in questa shell altrimenti prima o poi rimarrai bloccato. Potresti farlo nel file di configurazione: vedi unix.stackexchange.com/a/132731
hornetbzz

1
Perché le nuove righe vengono importate se faccio semplice echo $ MAIL_TXT?
KernelPanic

1
@Marko: per favore vedi l'eco dell'uomo con l'opzione -e: abilita l'interpretazione delle fughe di backslash
hornetbzz

Spiacenti, ha sbagliato il parametro -e
KernelPanic

10

Un'altra opzione per in uno script bash:

mailbody="Testmail via bash script"
echo "From: info@myserver.test" > /tmp/mailtest
echo "To: john@mywebsite.test" >> /tmp/mailtest
echo "Subject: Mailtest subject" >> /tmp/mailtest
echo "" >> /tmp/mailtest
echo $mailbody >> /tmp/mailtest
cat /tmp/mailtest | /usr/sbin/sendmail -t
  • Il file /tmp/mailtestviene sovrascritto ogni volta che viene utilizzato questo script.
  • La posizione di sendmail può variare a seconda del sistema.
  • Quando si utilizza questo in uno script cron, è necessario utilizzare il percorso assoluto per il comando sendmail.

1
downvoted perché più di un processo può chiamare lo script allo stesso tempo. Ciò potrebbe causare file tmp corrotti / errati. Inoltre, il file / tmp non viene sovrascritto ogni volta che viene utilizzato: in realtà cresce con ogni e-mail contenente tutte le e-mail precedenti all'interno. Non bene.
Taterhead

1
La prima scrittura su / tmp / mailtest è una sovrascrittura, quindi rimuoverà tutto ciò che era lì in precedenza. Tuttavia, questo metodo non è l'ideale per gli altri motivi che hai descritto.
Simon

8

In genere, si desidera utilizzare il mailcomando per inviare il messaggio utilizzando l'MTA locale (che lo consegnerà utilizzando SMTP alla destinazione o lo inoltrerà semplicemente a un server SMTP più potente, ad esempio al proprio ISP). Se non si dispone di un MTA locale (anche se è un po 'insolito per un sistema simile a UNIX ometterne uno), è possibile utilizzare un MTA minimalista come ssmtp .

ssmtpè abbastanza facile da configurare. Fondamentalmente, dovrai solo specificare dove si trova il server SMTP del tuo provider:

# The place where the mail goes. The actual machine name is required
# no MX records are consulted. Commonly mailhosts are named mail.domain.com
# The example will fit if you are in domain.com and you mailhub is so named.
mailhub=mail

Un'altra opzione è usare uno dei miriadi di script che si connettono direttamente al server SMTP e provare a postare un messaggio lì, come Smtp-Auth-Email-Script , smtp-cli , SendEmail , ecc.


"ssmtp" era installato sulla macchina, quindi non sono stato in grado di provarlo, ma grazie comunque
appshare.co

5

Ammettendo di voler utilizzare qualche server smtp, puoi fare:

export SUBJECT=some_subject
export smtp=somehost:someport
export EMAIL=someaccount@somedomain
echo "some message" | mailx -s "$SUBJECT" "$EMAIL"

Modificare somehost, someporte someaccount@somedomainai valori effettivi che usereste. Nessuna crittografia e nessuna autenticazione viene eseguita in questo esempio.


E cosa fare se mailxnon è installato?
nalply

2

Il mailcomando lo fa (chi l'avrebbe mai detto ;-). Apri la shell e accedi man mailper ottenere la pagina di manuale del mailcomando per tutte le opzioni disponibili.


2
L'ho fatto ma non è possibile specificare un server da utilizzare
appshare.co

1
Questo fa parte della configurazione dell'agente di trasferimento della posta locale, ad esempio Sendmail o Postfix.
DarkDust

2

Non hai nemmeno bisogno di un MTA. Il protocollo SMTP è abbastanza semplice da poterlo scrivere direttamente sul tuo server SMTP. Puoi anche comunicare su SSL / TLS se hai installato il pacchetto OpenSSL. Controlla questo post: https://33hops.com/send-email-from-bash-shell.html

Quanto sopra è un esempio su come inviare e-mail in formato testo / html che funzioneranno immediatamente. Se vuoi aggiungere allegati la cosa può diventare un po 'più complicata, dovrai codificare in base64 i file binari e incorporarli tra i confini. Questo è un buon posto per iniziare a indagare: http://forums.codeguru.com/showthread.php?418377-Send-Email-w-attachments-using-SMTP


2

Su Linux, l' utilità di posta può essere utilizzata per inviare allegati con l'opzione "-a". Scorri le pagine man per leggere le opzioni. Ad esempio, il codice seguente invierà un allegato:

mail -s "QUESTO È OGGETTO" -un allegato.txt nome@dominio.com <<< "Ciao amico, trova i rapporti sugli errori."


Benvenuto in SO. Grazie per aver postato una risposta. Si prega di leggere le informazioni su come scrivere una buona risposta e modificare di conseguenza. Buon divertimento ;-)
ZF007

2

INVIA MAIL DA LINUX A GMAIL

UTILIZZO DI POSTFIX

1: installa il software

Debian e Ubuntu:

apt-get update && apt-get install postfix mailutils

OpenSUSE:

zypper update && zypper install postfix mailx cyrus-sasl

Fedora:

dnf update && dnf install postfix mailx

CentOS:

yum update && yum install postfix mailx cyrus-sasl cyrus-sasl-plain

Arch Linux:

pacman -Sy postfix mailutils

FreeBSD:

portsnap fetch extract update

cd /usr/ports/mail/postfix

make config

in configurazione selezionare il supporto SASL

make install clean

pkg install mailx

2. Configura Gmail

/ Etc / postfix. Crea o modifica il file della password:

vim /etc/postfix/sasl_passwd

sto usando vim puoi usare qualsiasi editor di file come nano, cat .....

> Ubuntu, Fedora, CentOS, Debian, OpenSUSE, Arch Linux:

Aggiungi questo

dove l'utente sostituire con la vostra mailname e la password è Gmail Password

[smtp.gmail.com]:587    user@gmail.com:password

Salva e chiudi il file e rendilo accessibile solo da root: perché è un contenuto sensibile che contiene la tua password

chmod 600 /usr/local/etc/postfix/sasl_passwd

> FreeBSD:

directory / usr / local / etc / postfix.

vim /usr/local/etc/postfix/sasl_passwd

Aggiungi la riga:

[smtp.gmail.com]:587    user@gmail.com:password

Salva e rendilo accessibile solo da root:

chmod 600 /usr/local/etc/postfix/sasl_passwd

3. Configurazione di Postfix

file di configurazione main.cf

6 parametri che dobbiamo impostare nel Postfix

Ubuntu, Arch Linux, Debian:

modificare

 vim /etc/postfix/main.cf

modificare i seguenti valori:

relayhost = [smtp.gmail.com]:587
smtp_use_tls = yes
smtp_sasl_auth_enable = yes
smtp_sasl_security_options =
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt

smtp_sasl_security_options che nella configurazione verrà impostato su vuoto , per garantire che non vengano utilizzate opzioni di sicurezza incompatibili con Gmail .

salva e chiudi

come per

OpenSUSE:

vim /etc/postfix/main.cf

modificare

relayhost = [smtp.gmail.com]:587
smtp_use_tls = yes
smtp_sasl_auth_enable = yes
smtp_sasl_security_options =
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_tls_CAfile = /etc/ssl/ca-bundle.pem

richiede anche la configurazione del file master.cf

modificare:

vim /etc/postfix/master.cf

come rimuovendo il commento da questa riga (rimuovi #)

#tlsmgr unix - - n 1000? 1 tlsmg

salva e chiudi

Fedora, CentOS:

vim /etc/postfix/main.cf

modificare

relayhost = [smtp.gmail.com]:587
smtp_use_tls = yes
smtp_sasl_auth_enable = yes
smtp_sasl_security_options =
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_tls_CAfile = /etc/ssl/certs/ca-bundle.crt

FreeBSD:

vim /usr/local/etc/postfix/main.cf

modificare:

relayhost = [smtp.gmail.com]:587
smtp_use_tls = yes
smtp_sasl_auth_enable = yes
smtp_sasl_security_options =
smtp_sasl_password_maps = hash:/usr/local/etc/postfix/sasl_passwd
smtp_tls_CAfile = /etc/mail/certs/cacert.pem

salva e chiudi questo

4. Elabora file password:

Ubuntu, Fedora, CentOS, OpenSUSE, Arch Linux, Debian:

postmap /etc/postfix/sasl_passwd

per freeBSD

postmap /usr/local/etc/postfix/sasl_passwd

4.1) Riavvia postfix

Ubuntu, Fedora, CentOS, OpenSUSE, Arch Linux, Debian:

systemctl restart postfix.service

per FreeBSD:

service postfix onestart
nano /etc/rc.conf

Inserisci

postfix_enable=YES

salva quindi esegui per iniziare

service postfix start

5. Abilita "App meno sicure" in Gmail utilizzando la guida del link sottostante

https://support.google.com/accounts/answer/6010255

6. Invia un'e-mail di prova

mail -s "subject" recever@domain.com

premere Invio

aggiungi il corpo del messaggio come desideri, premi invio, quindi premi ctrl + d per terminare correttamente

se non funziona controlla di nuovo tutti i passaggi e controlla se abiliti " app meno sicura" nel tuo Gmail

quindi riavvia postfix se modifichi qualcosa in questo

per lo script di shell creare il file .sh e aggiungere il comando in 6 passaggi come requisito

per esempio solo per un campione

#!/bin/bash
REALVALUE=$(df / | grep / | awk '{ print $5}' | sed 's/%//g')
THRESHOLD=80

if [ "$REALVALUE" -gt "$THRESHOLD" ] ; then
    mail -s 'Disk Space Alert' mailid@domainname.com << EOF
Your root partition remaining free space is critically low. Used: $REALVALUE%
EOF
fi

Lo script invia un'e-mail quando l'utilizzo del disco supera la percentuale specificata dalla variabile THRESHOLD (80% qui).


Il nome di questa risposta non dovrebbe essere "INVIA MAIL DA LINUX A recever@domain.com VIA GMAIL"?
Cameron Hudson

1

puoi usare il comando "email" o "emailx".

(1) $ vim /etc/mail.rc # o # vim /etc/nail.rc

set from = xxx@xxx.com #
set smtp = smtp.exmail.gmail.com #gmail's smtp server 
set smtp-auth-user = xxx@xxx.com #sender's email address
set smtp-auth-password = xxxxxxx #get from gmail, not your email account passwd
set smtp-auth=login

Perché se non viene inviato da un account autorizzato, l'email arriverà alla lista della posta indesiderata.

(2) $ echo "Ricordati di rimuovere gli argomenti inutilizzati!" | mail -s "argomenti di scarto" -a a.txt developer@xxx.com #invia all'utente del gruppo "developer@xxxx.com"

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.