Mengirim email dari skrip shell linux


120

Saya ingin mengirim email dari skrip Linux Shell. Apa perintah standar untuk melakukan ini dan apakah saya perlu menyiapkan nama server khusus?


8
Coba tanyakan di Superuser [ superuser.com ] atau, lebih baik lagi, Unix dan Linux SE [ unix.stackexchange.com ].
Dan Moulding

Jawaban:


119

Jika server dikonfigurasi dengan baik, misalnya memiliki MTA yang aktif dan berjalan, Anda dapat menggunakan perintah mail.

Misalnya, untuk mengirim konten file, Anda dapat melakukan ini:

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

man mail untuk lebih jelasnya.


7
Apa maksud 'mta' disini, apakah ada nama lengkap atau linknya? Sebagai pemula, itulah yang ingin saya ketahui. Karena saya kurang pengalaman untuk melakukan itu.
Zen

5
@Zen MTA adalah singkatan dari Mail transport agent. postfix, sendmail, qmail dll
Francesco Laurita

@Zen untuk sebagian besar, Anda dapat menganggap MTA sebagai server SMTP atau IMAP.
pengguna151841

1
Jika Anda tidak yakin tentang cara menginstal / mengkonfigurasi dan Anda menggunakan Ubuntu: sudo apt-get install mailutilsdan pilih situs Internet: Email dikirim dan diterima langsung menggunakan SMTP. .
pengguna1717828

86

Jika Anda ingin pendekatan yang bersih dan sederhana di bash, dan Anda tidak ingin menggunakan cat, echo, dll, cara paling sederhana akan menjadi:

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

<<<digunakan untuk mengarahkan input standar. Ini sudah menjadi bagian dari pesta sejak lama.


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

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

Hei, ini berhasil dengan baik untukku, terima kasih! Bagaimana saya menentukan beberapa alamat tujuan pengiriman?
E. Owen

1
@ E.Owen Anda dapat menggunakan opsi -t untuk mengirim ke beberapa alamat yang dipisahkan oleh spasi
Jon

25

Jika exim dan ssmtp berjalan, Anda mungkin mengalami masalah. Jadi jika Anda hanya ingin menjalankan MTA sederhana, hanya untuk memiliki klien smtp sederhana untuk mengirim pemberitahuan email untuk desakan, Anda harus membersihkan MTA yang sudah terinstal seperti exim atau postfix terlebih dahulu dan menginstal ulang ssmtp.

Maka cukup mudah, mengkonfigurasi hanya 2 file (revaliases dan ssmtp.conf) - Lihat ssmtp doc -, dan penggunaan di skrip bash atau bourne Anda seperti:

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

Tentunya jangan lupa untuk membuka keluaran firewall anda ke port smtp (25).


Di mana saya dapat mengubah nomor port dalam skrip ini? Di server saya port smtp bekerja lebih dari 8181.
manix

Saya tidak akan melakukan ini di shell ini jika tidak, Anda akan terjebak cepat atau lambat. Anda dapat melakukannya di file konfigurasi: Lihat unix.stackexchange.com/a/132731
hornetbzz

1
Mengapa baris baru dicerna jika saya membuat echo $ MAIL_TXT sederhana?
KernelPanic

1
@ Marko: Tolong lihat man echo dengan opsi -e: aktifkan interpretasi pelarian garis miring terbalik
hornetbzz

Maaf, apakah parameter -e salah
KernelPanic

10

Opsi lain untuk di skrip 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
  • File /tmp/mailtestdiganti setiap kali skrip ini digunakan.
  • Lokasi sendmail mungkin berbeda untuk tiap sistem.
  • Saat menggunakan ini dalam skrip cron, Anda harus menggunakan path absolut untuk perintah sendmail.

1
tidak dipilih karena lebih dari satu proses dapat memanggil skrip pada saat yang bersamaan. Ini dapat menyebabkan file tmp rusak / salah. Juga file / tmp tidak ditimpa setiap kali ini digunakan - itu sebenarnya tumbuh dengan setiap email yang berisi semua email sebelumnya di dalamnya. Tidak baik.
Taterhead

1
Tulisan pertama ke / tmp / mailtest adalah penimpaan sehingga akan menghapus apa pun yang sebelumnya ada di sana. Namun, metode ini tidak ideal untuk alasan lain yang telah Anda jelaskan.
Simon

8

Umumnya, Anda ingin menggunakan mailperintah untuk mengirim pesan Anda menggunakan MTA lokal (yang akan mengirimkannya menggunakan SMTP ke tujuan atau hanya meneruskannya ke beberapa server SMTP yang lebih kuat, misalnya, di ISP Anda). Jika Anda tidak memiliki MTA lokal (meskipun agak tidak biasa bagi sistem mirip UNIX untuk menghilangkannya), Anda dapat menggunakan beberapa MTA minimalis seperti ssmtp .

ssmtpcukup mudah untuk dikonfigurasi. Pada dasarnya, Anda hanya perlu menentukan di mana server SMTP penyedia Anda berada:

# 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

Pilihan lain adalah menggunakan salah satu skrip myriads yang langsung terhubung ke server SMTP dan mencoba mengirim pesan di sana, seperti Smtp-Auth-Email-Script , smtp-cli , SendEmail , dll.


"ssmtp" diinstal pada mesin jadi saya tidak dapat mencobanya tetapi terima kasih
appshare.co

5

Mengakui Anda ingin menggunakan beberapa server smtp, Anda dapat melakukan:

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

Ubah somehost,, someportdan someaccount@somedomainke nilai aktual yang akan Anda gunakan. Tidak ada enkripsi dan otentikasi yang dilakukan dalam contoh ini.


Dan apa yang harus dilakukan jika mailxtidak dipasang?
nalply

2

The mailperintah melakukan itu (yang akan menduga ;-). Buka shell Anda dan enter man mailuntuk mendapatkan halaman manual untuk mailperintah untuk semua opsi yang tersedia.


2
Saya melakukan itu tetapi tidak ada opsi untuk menentukan server yang akan digunakan
appshare.co

1
Itu adalah bagian dari konfigurasi agen transfer surat lokal Anda, misalnya Sendmail atau Postfix.
DarkDust

2

Anda bahkan tidak membutuhkan MTA. Protokol SMTP cukup sederhana untuk langsung menulisnya ke server SMTP Anda. Anda bahkan dapat berkomunikasi melalui SSL / TLS jika Anda telah menginstal paket OpenSSL. Periksa posting ini: https://33hops.com/send-email-from-bash-shell.html

Di atas adalah contoh tentang cara mengirim email teks / html yang akan berfungsi di luar kotak. Jika Anda ingin menambahkan lampiran, masalahnya bisa menjadi sedikit lebih rumit, Anda perlu menyandikan file biner base64 dan menyematkannya di antara batas-batas. Ini adalah tempat yang baik untuk mulai menyelidiki: http://forums.codeguru.com/showthread.php?418377-Send-Email-w-attachments-using-SMTP


2

Di linux, utilitas email dapat digunakan untuk mengirim lampiran dengan opsi "-a". Buka halaman manual untuk membaca tentang opsi. Misalnya kode berikut akan mengirimkan lampiran:

mail -s "THIS IS SUBJECT" -a attachment.txt name@domain.com <<< "Hai Sobat, Temukan laporan kegagalan."


Selamat datang di SO. Terima kasih telah memposting jawaban. Silakan baca info tentang bagaimana menulis jawaban yang baik dan memodifikasinya. Nikmati SO ;-)
ZF007

2

KIRIM MAIL DARI LINUX KE GMAIL

MENGGUNAKAN POSTFIX

1: instal perangkat lunak

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

di configaration pilih dukungan SASL

make install clean

pkg install mailx

2. Konfigurasi Gmail

/ etc / postfix. Buat atau edit file kata sandi:

vim /etc/postfix/sasl_passwd

im menggunakan vim kamu dapat menggunakan file editer seperti nano, cat .....

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

Tambahkan ini

di mana pengguna mengganti dengan nama surat dan kata sandi Anda adalah kata sandi gmail Anda

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

Simpan dan tutup file dan Jadikan hanya dapat diakses oleh root: karena ini adalah konten sensitif yang berisi kata sandi Anda

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

> FreeBSD:

direktori / usr / local / etc / postfix.

vim /usr/local/etc/postfix/sasl_passwd

Tambahkan baris:

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

Simpan dan Jadikan dapat diakses hanya dengan root:

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

3. Konfigurasi Postfix

file konfigurasi main.cf

6 parameter yang harus kita atur di Postfix

Ubuntu, Arch Linux, Debian:

edit

 vim /etc/postfix/main.cf

ubah nilai-nilai berikut:

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 yang dalam konfigurasi akan disetel kosong , untuk memastikan bahwa tidak ada opsi keamanan yang tidak kompatibel dengan Gmail yang digunakan.

Simpan dan tutup

seperti untuk

OpenSUSE:

vim /etc/postfix/main.cf

memodifikasi

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

itu juga membutuhkan konfigurasi file master.cf

memodifikasi:

vim /etc/postfix/master.cf

seperti dengan menghapus komentar baris ini (hapus #)

#tlsmgr unix - - n 1000? 1 tlsmg

Simpan dan tutup

Fedora, CentOS:

vim /etc/postfix/main.cf

memodifikasi

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

memodifikasi:

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

simpan dan tutup ini

4. Proses File Kata Sandi:

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

postmap /etc/postfix/sasl_passwd

untuk freeBSD

postmap /usr/local/etc/postfix/sasl_passwd

4.1) Mulai ulang postfix

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

systemctl restart postfix.service

untuk FreeBSD:

service postfix onestart
nano /etc/rc.conf

Menambahkan

postfix_enable=YES

simpan lalu jalankan untuk memulai

service postfix start

5. Aktifkan "Aplikasi yang Kurang Aman" Di Gmail menggunakan bantuan tautan di bawah ini

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

6. Kirim Email Tes

mail -s "subject" recever@domain.com

tekan enter

tambahkan badan surat sesuai keinginan Anda tekan enter lalu tekan ctrl + d untuk penghentian yang tepat

jika tidak berhasil, periksa semua langkah lagi dan periksa apakah Anda mengaktifkan " aplikasi kurang aman" di gmail Anda

kemudian restart postfix jika Anda memodifikasi sesuatu di dalamnya

untuk skrip shell buat file .sh dan tambahkan perintah 6 langkah sebagai kebutuhan Anda

Misalnya hanya untuk sampel

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

Skrip mengirim email ketika penggunaan disk naik di atas persentase yang ditentukan oleh variabel THRESHOLD (80% di sini).


Bukankah seharusnya nama jawaban ini harus "KIRIM MAIL FROM LINUX KE recever@domain.com VIA GMAIL"?
Cameron Hudson

1

Anda dapat menggunakan perintah 'email' atau 'emailx'.

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

Karena jika tidak dikirim dari akun resmi, email akan masuk ke junk mail list.

(2) $ echo "Tolong ingat untuk menghapus topik ons ​​yang tidak digunakan!" | mail -s "topik limbah" -a a.txt developer@xxx.com #kirim ke pengguna grup 'developer@xxxx.com'

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.