การส่งเมลจากลินุกซ์เชลล์สคริปต์


120

ฉันต้องการส่งอีเมลจากสคริปต์ Linux Shell คำสั่งมาตรฐานสำหรับทำสิ่งนี้คืออะไรและฉันต้องตั้งค่าชื่อเซิร์ฟเวอร์พิเศษหรือไม่?


8
ลองถามใน Superuser [ superuser.com ] หรือ Unix และ Linux SE [ unix.stackexchange.com ] ยังดีกว่า
แดนปั้น

คำตอบ:


119

หากเซิร์ฟเวอร์ได้รับการกำหนดค่าอย่างดีเช่นมี MTA ที่ทำงานอยู่คุณสามารถใช้คำสั่งเมล

ตัวอย่างเช่นในการส่งเนื้อหาของไฟล์คุณสามารถทำได้:

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

man mail สำหรับรายละเอียดเพิ่มเติม


7
'mta' หมายถึงอะไรที่นี่มีชื่อเต็มหรือลิงค์หรือไม่? ในฐานะมือใหม่นั่นคือสิ่งที่ฉันอยากรู้ เนื่องจากฉันขาดประสบการณ์ในการทำเช่นนั้น
Zen

5
@ Zen MTA ย่อมาจาก Mail transport agent postfix, sendmail, qmail และอื่น ๆ
Francesco Laurita

@ Zen ส่วนใหญ่คุณสามารถพิจารณา MTA หมายถึงเซิร์ฟเวอร์ SMTP หรือ IMAP
user151841

1
หากคุณไม่แน่ใจว่าจะติดตั้ง / กำหนดค่าอย่างไรและคุณใช้ Ubuntu: sudo apt-get install mailutilsแล้วเลือกเว็บไซต์อินเทอร์เน็ต: เมลจะถูกส่งและรับโดยตรงโดยใช้ SMTP .
user1717828

86

หากคุณต้องการวิธีการทำความสะอาดและง่ายในการทุบตีและคุณไม่ต้องการที่จะใช้cat, echoฯลฯ วิธีที่ง่ายที่สุดจะเป็น:

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

<<<ใช้เพื่อเปลี่ยนทิศทางอินพุตมาตรฐาน เป็นส่วนหนึ่งของการทุบตีมานานแล้ว


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

นี่ใช้ได้ดีสำหรับฉันขอบคุณ! ฉันจะระบุที่อยู่หลายแห่งที่จะส่งไปได้อย่างไร?
E.Owen

1
@ E.Owen คุณสามารถใช้ตัวเลือก -t เพื่อส่งไปยังที่อยู่หลายรายการโดยคั่นด้วยช่องว่าง
จอน

25

หากทั้ง exim และ ssmtp กำลังทำงานอยู่คุณอาจประสบปัญหา ดังนั้นหากคุณต้องการเรียกใช้ MTA แบบง่ายๆเพียงแค่มีไคลเอนต์ smtp ที่เรียบง่ายเพื่อส่งการแจ้งเตือนทางอีเมลเพื่อขอความช่วยเหลือคุณจะต้องล้าง MTA ที่ติดตั้งไว้ล่วงหน้าในที่สุดเช่นeximหรือpostfixก่อนและติดตั้ง ssmtp ใหม่

จากนั้นมันค่อนข้างตรงไปตรงมากำหนดค่าไฟล์เพียง 2 ไฟล์ (revaliases และ ssmtp.conf) - ดู ssmtp doc - และการใช้งานใน bash หรือ bourne script ของคุณเป็นดังนี้:

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

แน่นอนอย่าลืมเปิดเอาต์พุตไฟร์วอลล์ของคุณไปที่พอร์ต smtp (25)


ฉันจะเปลี่ยนหมายเลขพอร์ตในสคริปต์นี้ได้ที่ไหน ในพอร์ต smtp เซิร์ฟเวอร์ของฉันทำงานได้มากกว่า 8181
manix

ฉันจะไม่ทำสิ่งนี้ในเปลือกนี้ไม่เช่นนั้นคุณจะจมปลักไม่ช้าก็เร็ว คุณสามารถทำได้ในไฟล์ config: ดูunix.stackexchange.com/a/132731
Hornetbzz

1
เหตุใดจึงมีการเพิ่มบรรทัดใหม่หากฉันสร้าง echo $ MAIL_TXT แบบง่ายๆ
KernelPanic

1
@Marko: โปรดดู man echo ด้วย -e option: เปิดใช้งานการตีความแบ็กสแลช
Escape

ขออภัยพารามิเตอร์ -e ผิดพลาด
KernelPanic

10

อีกทางเลือกหนึ่งสำหรับในสคริปต์ทุบตี:

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
  • ไฟล์/tmp/mailtestจะถูกเขียนทับทุกครั้งที่ใช้สคริปต์นี้
  • ตำแหน่งของ sendmail อาจแตกต่างกันไปในแต่ละระบบ
  • เมื่อใช้สิ่งนี้ในสคริปต์ cron คุณต้องใช้พา ธ สัมบูรณ์สำหรับคำสั่ง sendmail

1
ลดลงเนื่องจากมีกระบวนการมากกว่าหนึ่งกระบวนการที่สามารถเรียกใช้สคริปต์ได้ในเวลาเดียวกัน ซึ่งอาจทำให้ไฟล์ tmp เสียหาย / ไม่ถูกต้อง นอกจากนี้ไฟล์ / tmp จะไม่ถูกเขียนทับทุกครั้งที่มีการใช้งานซึ่งจะเติบโตขึ้นจริง ๆ เมื่อมีอีเมลแต่ละฉบับที่มีอีเมลก่อนหน้านี้ ไม่ดี.
Taterhead

1
การเขียนครั้งแรกถึง / tmp / mailtest คือการเขียนทับดังนั้นมันจะลบสิ่งที่อยู่ในนั้นก่อนหน้านี้ อย่างไรก็ตามวิธีนี้ไม่เหมาะสำหรับเหตุผลอื่น ๆ ที่คุณได้อธิบายไว้
Simon

8

โดยทั่วไปคุณต้องการใช้mailคำสั่งเพื่อส่งข้อความของคุณโดยใช้ MTA ในพื้นที่ (ซึ่งจะส่งโดยใช้ SMTP ไปยังปลายทางหรือเพียงแค่ส่งต่อไปยังเซิร์ฟเวอร์ SMTP ที่มีประสิทธิภาพมากขึ้นเช่นที่ ISP ของคุณ) หากคุณไม่ได้มี MTA ท้องถิ่น (แม้ว่ามันเป็นบิตผิดปกติสำหรับ UNIX เหมือนระบบที่จะละเว้นเดียว), คุณสามารถใช้บางส่วนเอ็มทีเรียบง่ายเช่นssmtp

ssmtpค่อนข้างง่ายในการกำหนดค่า โดยทั่วไปคุณจะต้องระบุว่าเซิร์ฟเวอร์ SMTP ของผู้ให้บริการของคุณอยู่ที่ใด:

# 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

อีกทางเลือกหนึ่งคือการใช้สคริปต์มากมายที่เชื่อมต่อกับเซิร์ฟเวอร์ SMTP โดยตรงและพยายามโพสต์ข้อความที่นั่นเช่นSmtp-Auth-Email-Script , smtp-cli , SendEmailเป็นต้น


มีการติดตั้ง "ssmtp" ในเครื่องดังนั้นฉันจึงไม่สามารถลองใช้งานได้ แต่ยังไง
ก็ตาม

5

ยอมรับว่าคุณต้องการใช้เซิร์ฟเวอร์ smtp คุณสามารถทำได้:

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

เปลี่ยนsomehost, someportและsomeaccount@somedomainเป็นค่าที่แท้จริงที่คุณจะใช้ ไม่มีการเข้ารหัสและไม่มีการพิสูจน์ตัวตนในตัวอย่างนี้


และจะทำอย่างไรถ้าmailxไม่ได้ติดตั้ง?
nalply

2

mailคำสั่งไม่ว่า (ใครจะเดาได้ ;-) เปิดเชลล์ของคุณและเข้าไปman mailเพื่อรับหน้าคู่มือสำหรับmailคำสั่งสำหรับตัวเลือกทั้งหมดที่มี


2
ฉันทำอย่างนั้น แต่ไม่มีตัวเลือกในการระบุเซิร์ฟเวอร์ที่จะใช้
appshare.co

1
นั่นเป็นส่วนหนึ่งของคอนฟิกูเรชันตัวแทนการโอนย้ายเมลในพื้นที่ของคุณเช่น Sendmail หรือ Postfix
DarkDust

2

คุณไม่จำเป็นต้องมี MTA โปรโตคอล SMTP นั้นง่ายพอที่จะเขียนโดยตรงไปยังเซิร์ฟเวอร์ SMTP ของคุณ คุณสามารถสื่อสารผ่าน SSL / TLS ได้หากคุณติดตั้งแพ็คเกจ OpenSSL ตรวจสอบโพสต์นี้: https://33hops.com/send-email-from-bash-shell.html

ข้างต้นเป็นตัวอย่างวิธีการส่งข้อความ / อีเมล html ที่จะทำงานนอกกรอบ หากคุณต้องการเพิ่มสิ่งที่แนบมาสิ่งที่ซับซ้อนขึ้นเล็กน้อยคุณจะต้องเข้ารหัส base64 ไฟล์ไบนารีและฝังไว้ระหว่างขอบเขต นี่เป็นจุดเริ่มต้นที่ดีในการตรวจสอบ: http://forums.codeguru.com/showthread.php?418377-Send-Email-w-attachments-using-SMTP


2

บน linux สามารถใช้โปรแกรมอรรถประโยชน์เมลเพื่อส่งไฟล์แนบพร้อมตัวเลือก "-a" ไปที่หน้าคนเพื่ออ่านเกี่ยวกับตัวเลือก เช่นรหัสต่อไปนี้จะส่งไฟล์แนบ:

mail -s "THIS IS SUBJECT" -a attachment.txt name@domain.com <<< "สวัสดีบัดดี้โปรดค้นหารายงานความล้มเหลว"


ยินดีต้อนรับสู่ SO ขอบคุณสำหรับการโพสต์คำตอบ โปรดอ่านข้อมูลเกี่ยวกับวิธีเขียนคำตอบที่ดีและแก้ไขตามนั้น Enjoy SO ;-)
ZF007

2

ส่งจดหมายจากลินุกซ์ไปที่ GMAIL

การใช้ POSTFIX

1: ติดตั้งซอฟต์แวร์

Debian และ 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

ในการกำหนดค่าเลือกการสนับสนุน SASL

make install clean

pkg install mailx

2. กำหนดค่า Gmail

/ etc / postfix สร้างหรือแก้ไขไฟล์รหัสผ่าน:

vim /etc/postfix/sasl_passwd

ฉันใช้ vim u สามารถใช้ file editer เช่น nano, cat .....

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

เพิ่มสิ่งนี้

โดยที่ผู้ใช้แทนที่ด้วยชื่อเมลและรหัสผ่านของคุณคือรหัสผ่าน Gmail ของคุณ

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

บันทึกและปิดไฟล์และทำให้เข้าถึงได้โดย root เท่านั้น: เนื่องจากเป็นเนื้อหาที่ละเอียดอ่อนซึ่งมีรหัสผ่านของ ur

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

> FreeBSD:

ไดเร็กทอรี / usr / local / etc / postfix

vim /usr/local/etc/postfix/sasl_passwd

เพิ่มบรรทัด:

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

บันทึกและทำให้เข้าถึงได้โดยรูทเท่านั้น:

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

3. การกำหนดค่า Postfix

ไฟล์คอนฟิกูเรชัน main.cf

6 พารามิเตอร์ที่เราต้องตั้งค่าใน Postfix

Ubuntu, Arch Linux, Debian:

แก้ไข

 vim /etc/postfix/main.cf

แก้ไขค่าต่อไปนี้:

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ซึ่งในการกำหนดค่าจะถูกตั้งค่าเป็นค่าว่างเพื่อให้แน่ใจว่าไม่มีตัวเลือกการรักษาความปลอดภัยที่เข้ากันได้กับ Gmailถูกนำมาใช้

บันทึกและปิด

เช่นเดียวกับ

OpenSUSE:

vim /etc/postfix/main.cf

ปรับเปลี่ยน

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

มันยังต้องการการกำหนดค่าของไฟล์master.cf

แก้ไข:

vim /etc/postfix/master.cf

เช่นเดียวกับการยกเลิกการระบุบรรทัดนี้ (ลบ #)

#tlsmgr unix - - n 1000? 1 tlsmg

บันทึกและปิด

Fedora, CentOS:

vim /etc/postfix/main.cf

ปรับเปลี่ยน

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

แก้ไข:

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

บันทึกและปิดสิ่งนี้

4. ประมวลผลไฟล์รหัสผ่าน:

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

postmap /etc/postfix/sasl_passwd

ฟรีBSD

postmap /usr/local/etc/postfix/sasl_passwd

4.1) รีสตาร์ท postfix

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

systemctl restart postfix.service

สำหรับFreeBSD:

service postfix onestart
nano /etc/rc.conf

เพิ่ม

postfix_enable=YES

บันทึกจากนั้นเรียกใช้เพื่อเริ่มต้น

service postfix start

5. เปิดใช้งาน "แอปที่มีความปลอดภัยน้อย" ใน Gmail โดยใช้ลิงก์ด้านล่าง

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

6. ส่งอีเมลทดสอบ

mail -s "subject" recever@domain.com

กดปุ่มตกลง

เพิ่มเนื้อหาของเมลตามที่คุณต้องการกด Enterจากนั้นกดctrl + dเพื่อยุติการใช้งานที่เหมาะสม

หากไม่ได้ผลให้ตรวจสอบขั้นตอนทั้งหมดอีกครั้งและตรวจสอบว่าคุณเปิดใช้งาน " แอปที่ปลอดภัยน้อยกว่า"ใน Gmail ของคุณหรือไม่

จากนั้นรีสตาร์ท postfix ถ้าคุณแก้ไขอะไรในนั้น

สำหรับเชลล์สคริปต์ให้สร้างไฟล์. sh และเพิ่มคำสั่ง 6 ขั้นตอนตามความต้องการของคุณ

เช่นเพียงตัวอย่าง

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

สคริปต์จะส่งอีเมลเมื่อการใช้งานดิสก์สูงกว่าเปอร์เซ็นต์ที่กำหนดโดยตัวแปร THRESHOLD (80% ที่นี่)


ชื่อของคำตอบนี้ไม่ควรเป็น "SEND MAIL FROM LINUX TO Recever@domain.com VIA GMAIL" ใช่หรือไม่
Cameron Hudson

1

คุณสามารถใช้คำสั่ง 'email' หรือ 'emailx'

(1) $ vim /etc/mail.rc # หรือ # 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

เนื่องจากหากไม่ได้ส่งจากบัญชีที่ได้รับอนุญาตอีเมลจะเข้าสู่รายการเมลขยะ

(2) $ echo "โปรดอย่าลืมลบหัวข้อที่ไม่ได้ใช้ออกไป!" | mail -s "หัวข้อเสีย" -a a.txt developer@xxx.com # ส่งไปยังกลุ่มผู้ใช้ 'developer@xxxx.com'

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.