Wysyłanie poczty ze skryptu powłoki Linux

120

Chcę wysłać wiadomość e-mail ze skryptu powłoki Linux. Jakie jest standardowe polecenie, aby to zrobić i czy muszę ustawić jakieś specjalne nazwy serwerów?

appshare.co
źródło
8
Spróbuj zapytać na Superuser [ superuser.com ] lub, jeszcze lepiej, Unix i Linux SE [ unix.stackexchange.com ].
Dan Molding
3
Możliwy duplikat skryptu Shell do wysłania e
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Odpowiedzi:

119

Jeśli serwer jest dobrze skonfigurowany, np. Ma uruchomione MTA, możesz po prostu użyć polecenia mail.

Na przykład, aby wysłać zawartość pliku, możesz to zrobić:

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

man mail po więcej szczegółów.

Francesco Laurita
źródło
7
Co tutaj oznacza „mta”, czy jest tam imię i nazwisko lub link? Jako początkujący chcę to wiedzieć. Ponieważ brakuje mi doświadczenia.
Zen
5
@Zen MTA to skrót od Mail transport agent. postfix, sendmail, qmail itp.
Francesco Laurita,
@Zen w przeważającej części można uznać, że MTA oznacza serwer SMTP lub IMAP.
user151841
1
Jeśli nie masz pewności, jak zainstalować / skonfigurować i korzystasz z systemu Ubuntu: sudo apt-get install mailutilsi wybierz witrynę internetową: Poczta jest wysyłana i odbierana bezpośrednio przy użyciu protokołu SMTP. .
user1717828
86

Jeśli chcesz czysty i proste podejście w bash, a ty nie chcesz używać cat, echoitp, najprostszym sposobem byłoby:

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

<<<służy do przekierowania standardowego wejścia. To była część bash przez długi czas.

Peter O.
źródło
6
echo -e "Some \ nMultiline and tab \ t msg" | mail -s "subject" [email protected]
Pipo
cat << END...END | mail -s "subject" [email protected]
ulidtko
Hej, to działało świetnie dla mnie, dzięki! Jak określić wiele adresów, na które mają być dostarczane przesyłki?
E. Owen
1
@ E.Owen Możesz użyć opcji -t, aby wysłać do wielu adresów oddzielonych spacjami
Jon
25

Jeśli działają zarówno exim, jak i ssmtp, możesz wpaść w kłopoty. Więc jeśli chcesz po prostu uruchomić proste MTA, aby mieć prostego klienta smtp do wysyłania powiadomień e-mail w celu wezwania pomocy, musisz najpierw wyczyścić wstępnie zainstalowane MTA, takie jak exim lub postfix, i ponownie zainstalować ssmtp.

Wtedy jest to całkiem proste, konfigurowanie tylko 2 plików (revaliases i ssmtp.conf) - patrz dokument ssmtp -, a użycie w skrypcie bash lub bourne jest takie:

#!/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 $?  

Oczywiście nie zapomnij otworzyć wyjścia firewalla na port smtp (25).

hornetbzz
źródło
Gdzie mogę zmienić numer portu w tym skrypcie? Na moim serwerze port smtp działa na 8181.
manix
Nie zrobiłbym tego w tej powłoce, inaczej utkniesz prędzej czy później. Możesz to zrobić w pliku konfiguracyjnym: Zobacz unix.stackexchange.com/a/132731
hornetbzz
1
Dlaczego nowe wiersze są zapisywane, jeśli wykonuję proste echo $ MAIL_TXT?
KernelPanic
1
@Marko: Pls zobacz man echo z opcją -e: włącz interpretację ucieczki z ukośnikiem odwrotnym
hornetbzz
Przepraszamy, błąd parametru -e
KernelPanic
10

Inna opcja w skrypcie bash:

mailbody="Testmail via bash script"
echo "From: [email protected]" > /tmp/mailtest
echo "To: [email protected]" >> /tmp/mailtest
echo "Subject: Mailtest subject" >> /tmp/mailtest
echo "" >> /tmp/mailtest
echo $mailbody >> /tmp/mailtest
cat /tmp/mailtest | /usr/sbin/sendmail -t
  • Plik /tmp/mailtestjest nadpisywany za każdym razem, gdy używany jest ten skrypt.
  • Lokalizacja sendmaila może się różnić w zależności od systemu.
  • Używając tego w skrypcie cron, musisz użyć bezwzględnej ścieżki do polecenia sendmail.
SPRBRN
źródło
1
odrzucony, ponieważ więcej niż jeden proces może wywołać skrypt w tym samym czasie. Może to spowodować uszkodzenie / niepoprawny plik tmp. Również plik / tmp nie jest nadpisywany za każdym razem, gdy jest używany - w rzeczywistości rośnie wraz z każdą wiadomością e-mail zawierającą wszystkie poprzednie wiadomości e-mail w środku. Niedobrze.
Taterhead
1
Pierwszy zapis do / tmp / mailtest to nadpisanie, więc usunie to, co było tam wcześniej. Jednak ta metoda nie jest idealna z innych powodów, które opisałeś.
Simon
8

Ogólnie rzecz biorąc, chciałbyś użyć mailpolecenia, aby wysłać wiadomość za pomocą lokalnego MTA (który dostarczy ją za pomocą SMTP do miejsca docelowego lub po prostu przekieruje ją na jakiś mocniejszy serwer SMTP, na przykład u twojego ISP). Jeśli nie masz lokalnego MTA (chociaż pomijanie go w systemie podobnym do UNIX jest trochę nietypowe), możesz użyć minimalistycznego MTA, takiego jak ssmtp .

ssmtpjest dość łatwy w konfiguracji. Zasadniczo wystarczy określić, gdzie znajduje się serwer SMTP Twojego dostawcy:

# 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

Inną opcją jest użycie jednego z niezliczonych skryptów, które po prostu łączą się bezpośrednio z serwerem SMTP i próbują wysłać tam wiadomość, na przykład Smtp-Auth-Email-Script , smtp-cli , SendEmail itp.

GreyCat
źródło
"ssmtp" został zainstalowany na komputerze, więc nie mogłem go wypróbować, ale i tak dziękuję
appshare.co
5

Przyznając, że chcesz używać jakiegoś serwera smtp, możesz zrobić:

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

Zmień somehost, someporti someaccount@somedomainna rzeczywiste wartości, których użyjesz. W tym przykładzie nie jest stosowane żadne szyfrowanie ani uwierzytelnianie.

Germano
źródło
A co zrobić, jeśli mailxnie jest zainstalowany?
nalply
2

mailKomenda robi (kto by pomyślał ;-). Otwórz powłokę i wprowadź, man mailaby uzyskać stronę podręcznika dla mailpolecenia ze wszystkimi dostępnymi opcjami.

DarkDust
źródło
2
Zrobiłem to, ale nie ma opcji, aby określić serwer do użycia
appshare.co
1
Jest to część konfiguracji lokalnego agenta przesyłania poczty, np. Sendmail lub Postfix.
DarkDust
2

Nie potrzebujesz nawet MTA. Protokół SMTP jest na tyle prosty, że można go bezpośrednio zapisać na serwerze SMTP. Możesz nawet komunikować się przez SSL / TLS, jeśli masz zainstalowany pakiet OpenSSL. Sprawdź ten post: https://33hops.com/send-email-from-bash-shell.html

Powyższe jest przykładem wysyłania wiadomości tekstowych / html, które będą działać po wyjęciu z pudełka. Jeśli chcesz dodać załączniki, sprawa może być nieco bardziej skomplikowana, będziesz musiał zakodować pliki binarne base64 i osadzić je między granicami. To dobre miejsce do rozpoczęcia badania: http://forums.codeguru.com/showthread.php?418377-Send-Email-w-attachments-using-SMTP

Daniel J.
źródło
2

W Linuksie do wysyłania załączników można użyć programu pocztowego z opcją „-a”. Przejrzyj strony podręcznika, aby przeczytać o tej opcji. Na przykład poniższy kod wyśle ​​załącznik:

mail -s "TO JEST TEMAT" -a załącznik.txt [email protected] <<< "Witaj kolego, znajdź raporty o błędach."

krish___na
źródło
Witamy w SO. Dziękuję za wysłanie odpowiedzi. Przeczytaj informacje o tym, jak napisać dobrą odpowiedź i odpowiednio zmodyfikuj. Ciesz się SO ;-)
ZF007
2

WYŚLIJ POCZTĘ Z LINUXA NA GMAIL

KORZYSTANIE Z POSTFIX

1: zainstaluj oprogramowanie

Debian i 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

w konfiguracji wybierz obsługę SASL

make install clean

pkg install mailx

2. Skonfiguruj Gmaila

/ etc / postfix. Utwórz lub edytuj plik haseł:

vim /etc/postfix/sasl_passwd

Używam vim, możesz używać dowolnego edytora plików, takiego jak nano, cat .....

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

Dodaj

gdzie użytkownik zastąpić swojej nazwie pocztowej i hasło to gmail hasło

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

Zapisz i zamknij plik i udostępnij go tylko rootowi : ponieważ jest to poufna zawartość, która zawiera twoje hasło

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

> FreeBSD:

katalog / usr / local / etc / postfix.

vim /usr/local/etc/postfix/sasl_passwd

Dodaj linię:

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

Zapisz i udostępnij tylko dla roota:

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

3. Konfiguracja Postfix

plik konfiguracyjny main.cf

6 parametrów, które musimy ustawić w Postfixie

Ubuntu, Arch Linux, Debian:

edytować

 vim /etc/postfix/main.cf

zmień następujące wartości:

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, które w konfiguracji zostaną ustawione jako puste , aby zapewnić, że nie są używane żadne opcje zabezpieczeń niezgodne z Gmailem .

Zapisz i zamknij

jak dla

OpenSUSE:

vim /etc/postfix/main.cf

modyfikować

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

wymaga również konfiguracji pliku master.cf

modyfikować:

vim /etc/postfix/master.cf

jak przez odkomentowanie tej linii (usuń #)

#tlsmgr unix - - n 1000? 1 tlsmg

Zapisz i zamknij

Fedora, CentOS:

vim /etc/postfix/main.cf

modyfikować

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

modyfikować:

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

zapisz i zamknij to

4. Przetwarzaj plik hasła:

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

postmap /etc/postfix/sasl_passwd

za freeBSD

postmap /usr/local/etc/postfix/sasl_passwd

4.1) Uruchom ponownie postfiks

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

systemctl restart postfix.service

dla FreeBSD:

service postfix onestart
nano /etc/rc.conf

Dodaj

postfix_enable=YES

zapisz, a następnie uruchom, aby rozpocząć

service postfix start

5. Włącz „Mniej bezpieczne aplikacje” w Gmailu, korzystając z pomocy poniższego linku

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

6. Wyślij testową wiadomość e-mail

mail -s "subject" recever@domain.com

naciśnij enter

dodaj treść wiadomości, jak chcesz, naciśnij Enter, a następnie naciśnij ctrl + d, aby zakończyć

jeśli nie działa, sprawdź ponownie wszystkie kroki i sprawdź, czy włączasz „ mniej bezpieczną aplikację” w swoim Gmailu

następnie zrestartuj Postfix, jeśli zmodyfikujesz cokolwiek w tym

dla skryptu powłoki utwórz plik .sh i dodaj polecenie 6-krokowe jako wymaganie

na przykład tylko dla próbki

#!/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

Skrypt wysyła wiadomość e-mail, gdy użycie dysku wzrośnie powyżej wartości procentowej określonej przez wartość THRESHOLD varialbe (tutaj 80%).

chandan A
źródło
Czy nazwa tej odpowiedzi nie powinna brzmieć „WYŚLIJ POCZTĘ Z LINUXA NA [email protected] VIA GMAIL”?
Cameron Hudson
1

możesz użyć polecenia „email” lub „emailx”.

(1) $ vim /etc/mail.rc # lub # 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

Ponieważ jeśli nie zostanie wysłany z autoryzowanego konta, e-mail trafi na listę wiadomości-śmieci.

(2) $ echo "Proszę, pamiętajcie o usunięciu nieużywanych tematów z ons!" | mail -s "marnotrawstwo tematów" -a a.txt [email protected] # wyślij do użytkownika grupy „[email protected]

TINGTING WANG
źródło