วิธีที่ง่ายที่สุดในการส่งอีเมลแบบบรรทัดเดียวผ่านบรรทัดคำสั่งโดยใช้ gmail?


32

การใช้ Raspbian และ Ubunntu 16.04 LTS ต้องใช้โซลูชัน Linux ทั่วไป

ความต้องการนั้นง่าย:

ฉันต้องการวิธีส่งข้อความอีเมลแบบบรรทัดเดียวจากบรรทัดคำสั่ง

ฉันได้ตั้งค่าบัญชี gmail สำหรับ Rpi3 เฉพาะนี้โดยมีที่อยู่ของ rpi3abc@gmail.com - โดยไม่มี 2FA

ดังนั้นตอนนี้ฉันต้องสามารถส่งข้อความเมลแบบบรรทัดเดียวได้จากทุกที่ (รวมถึง cron) โดยที่ผู้ใช้ไม่ต้องดำเนินการใด ๆ


ฉันต้องการให้สามารถส่งไฟล์ข้อความได้ stdinโดยทั่วไปอะไรจาก


คุณต้องการให้ข้อความของคุณมาจากที่อยู่นี้หรือไม่, rpi3abc@gmail.com หรือไม่และมันก็โอเคสำหรับคุณที่ข้อความนั้นมาจาก your_username @ localhost?
John Smith

มันมาจาก rpi3abc@gmail.com ดังนั้นฉันจึงรู้ว่าคอมพิวเตอร์กำลังสื่อสารกับฉัน ฉันใช้มันในงาน cron ส่วนใหญ่
SDsolar

คำตอบ:


33

คำตอบที่ง่ายที่สุดในการส่งข้อความแบบบรรทัดเดียวผ่าน gmail คือการใช้ ssmtp


ติดตั้งด้วยคำสั่งต่อไปนี้:

sudo apt-get update
sudo apt-get install ssmtp

แก้ไข/etc/ssmtp/ssmtp.confให้มีลักษณะดังนี้:

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

ส่งหนึ่งซับให้เช่น:

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

หรือ

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

จากนั้นตามจริง * nix คุณจะได้รับพรอมต์ในไม่กี่วินาที

ตรวจสอบบัญชี myusername@gmail.com ของคุณและ voila อยู่ที่นั่น!


สิ่งนี้ยังทำงานได้ดีเมื่อส่งไฟล์ด้วยเช่นกัน:

cat program.py | ssmtp myotherusername@yahoo.com

และโปรแกรมจะปรากฏขึ้นในกล่องจดหมาย

หากไฟล์นั้นเป็นไฟล์ข้อความอาจมีบรรทัดแรกที่ระบุ Subject: xxxxxx

สามารถใช้กับงาน cron ต่าง ๆ ได้ฉันสามารถส่งข้อมูลด้วยหัวเรื่องที่ระบุเนื้อหา


สิ่งนี้จะทำงานกับทุกอย่างที่เตรียมข้อความที่ส่งไปยัง ssmtp ผ่าน stdin


สำหรับรายละเอียดเพิ่มเติมเช่นการรักษาความปลอดภัยไฟล์เหล่านี้กับผู้ใช้รายอื่น ๆ และโปรดไปที่บทความนี้:

ส่งอีเมลจากบรรทัดคำสั่ง Raspberry Pi


อย่าลืมดูคำตอบที่โพสต์ด้านล่างด้วยRuiเกี่ยวกับการล็อคที่FROM:อยู่ที่อาจมีการเปลี่ยนแปลงในไฟล์ข้อความที่จัดรูปแบบหากจำเป็น


ตอนนี้ถ้าเพียงฉันสามารถคิดวิธีการส่ง SMS ในลักษณะเดียวกัน


1
ฉันยังใช้ssmtpใน VMs ของฉันซึ่งมีน้ำหนักเบามาก +1
Rui F Ribeiro

1
ทำไมไม่ใช้ sendmail API จาก Python และส่งโดยตรง
Rui F Ribeiro

หากต้องการทำขั้นตอนต่อไปนี้เป็นคำแนะนำง่ายๆสำหรับการรวมไฟล์รูปภาพเป็นไฟล์แนบ: unix.stackexchange.com/questions/381131/…
SDsolar

หากต้องการตอบคำถามของ Rui: sendmailเพียงอย่างเดียวไม่มี MTA - Mail Transport Agent เพื่อสื่อสารภายนอกเครื่อง ตามค่าเริ่มต้นเนื่องจาก Unixen เป็นผู้ใช้หลายคนโดยการออกแบบsendmailจะส่งข้อความไปยังผู้ใช้รายอื่นในกล่องเดียวกัน แต่ไม่อยู่นอก ssmtpเป็น MTA ที่ฉันคิดว่าง่ายที่สุดในการกำหนดค่าสำหรับ gmail
SDsolar

1
ใช้ตลอดไปพยายามติดตั้ง postix นี้ทำงาน! หมายเหตุหนึ่งสำหรับทุกคนที่อ่านข้อความนี้ conf มีการพิมพ์ผิดพารามิเตอร์รูทควรเป็น gmail.com ไม่ใช่ gmail
qodeninja

9

ssmtpเป็นเพียงหนึ่งในโปรแกรมเสริมของ Sendmail สิ่งเหล่านี้ทั้งหมดยอมรับข้อความในอินพุตมาตรฐานและรายการที่อยู่เป็นอาร์กิวเมนต์บรรทัดรับคำสั่งและเป็นทางเลือกและพวกเขาทั้งหมดเสนอไบนารีชื่อsendmailซึ่งใช้ (อย่างน้อยคุณสมบัติพื้นฐานของ) บรรทัดคำสั่ง Sendmail API แบบดั้งเดิม แต่การพูดอย่างถูกต้องข้อความนั้นจะต้องเป็นข้อความ RFC822 ที่มีรูปแบบที่ดี อย่างน้อยก็ควรมีSubject:ส่วนหัว

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

(ด้วยssmtp, sendmailเป็นเพียง symlink ไปssmtp. Postfix, Exim และผมเชื่อว่าทุก MTA อื่น ๆ ที่Provides: mail-transport-agentมีการจัดเรียงที่คล้ายกันยกเว้นของหลักสูตรsendmailที่sendmailไบนารีคือ "ของจริง".)

โดยทั่วไปคุณสามารถรวมข้อความอีเมลอย่างง่ายพร้อมเอกสารที่นี่

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

Here we interpolate the shell variable $result
____HERE

( -tตัวเลือกSendmail บอกว่าจะรับรายชื่อผู้รับจากส่วนหัวของข้อความที่คุณได้รับจากอินพุตมาตรฐานเส้นทางที่แม่นยำไปยัง Sendmail จะแตกต่างกันไปตามแพลตฟอร์มต่าง ๆ )

อีกรูปแบบทั่วไปคือการรวมเอาท์พุทของคำสั่งไม่กี่ ระวังให้มีบรรทัดว่าง ("คอ") ระหว่างส่วนหัวและเนื้อหาของข้อความ

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

สำหรับสิ่งที่เกินข้อความเท่านั้น ASCII ง่ายมากที่คุณจะต้องเข้าใจวิธีการเขียนข้อความ MIME muttที่เหมาะสมจุดที่มันมักจะทำให้รู้สึกมากขึ้นในการใช้เครื่องมือเช่น บางแพลตฟอร์มมีmailหรือmailxที่รู้วิธีส่งไฟล์แนบและข้อความที่ไม่ใช่ ASCII แต่นี่ไม่สามารถพกพาได้อย่างสมบูรณ์

ความท้าทายที่นี่ไม่พบลูกค้าที่สามารถรับข้อความอีเมลและพยายามที่จะส่งมันคือการกำหนดค่าสำหรับ Gmail ที่เฉพาะเจาะจงซึ่งต้องการให้ MTA รู้ชื่อผู้ใช้และรหัสผ่านเพื่อใช้เซิร์ฟเวอร์ระยะไกลตามลำดับ เพื่อให้สามารถใช้เป็น smarthost ขาออกได้

เบื้องหลังลูกค้าส่วนใหญ่ชอบmutt, mailxฯลฯ มักจะทำงานเพียงแค่sendmailอยู่เบื้องหลังจะได้รับข้อความออกจากระบบ


ฉันไม่ได้มีโชคมากกับการใช้ sendmail โดยตรง จึงเปลี่ยนเป็น ssmtp โหวตขึ้นสำหรับคำตอบของคุณ โดยวิธีการในการส่งภาพเป็นสิ่งที่แนบมาฉันพบวิธีที่ง่ายที่สุดที่เป็นไปได้ ฉันไม่ต้องคิดแม้แต่เรื่อง MIME ฉันใช้ mpack ตามที่อธิบายไว้ที่นี่: unix.stackexchange.com/questions/381131/ …
SDsolar

8

การเพิ่มคำตอบ OP ของตัวเอง:

เมื่อกำหนดค่าssmtpคุณอาจห้ามหรืออนุญาตให้ผู้ใช้กำหนดจากและยังแทนที่โดเมน คุณอาจต้องการทำเช่นนั้นด้วยเหตุผลหลายประการรวมถึงข้อความที่ไม่อยู่ในโฟลเดอร์จดหมายขยะ

คุณสามารถเพิ่มไปที่/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

โปรดทราบว่าในขณะที่สามารถใช้ YES ในราสเบอร์รี่ที่บ้านได้อาจไม่แนะนำให้ใช้ในระบบที่มีผู้ใช้หลายคนจากมุมมองความปลอดภัย


upvote ข้อมูลที่ยอดเยี่ยม
SDsolar

5

เกิดอะไรขึ้นกับ "จดหมาย"

echo "สวัสดีนั่น" | mail -s "จดหมายสำคัญ" user@example.com

"mail" เป็นลิงก์ / etc / สำรองไปยัง / usr / bin / bsd-mailx จากแพ็คเกจ bsd-mailx ฉันเชื่อว่าเป็นค่าเริ่มต้น ยูทิลิตี้ที่ยอดเยี่ยมสำหรับการส่งจดหมายจากสคริปต์ cron

ทำงานบน Ubuntu และ FreeBSD เช่นกัน


3
mailxเป็นเพียงส่วนหน้า มันต้องมีการกำหนดค่า MTA บางอย่างเพื่อรับข้อความจากระบบโลคัล มีหลายรุ่นที่ใช้ร่วมกันไม่ได้ในการใช้งานทั่วไปแม้ว่าหากแพลตฟอร์มเป้าหมายของคุณคือ Debian เท่านั้นคุณสามารถพึ่งพาพฤติกรรม BSD ล่าสุดที่สมเหตุสมผล
tripleee

4

ฉันเป็นบางส่วนที่จะใช้mailxสำหรับสิ่งนี้:

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
ตัวเลือกมากมายที่นี่จะไม่สามารถใช้ได้กับระบบที่ไม่ใช่ Debian / non-BSD จำนวนมาก -aตัวเลือกโดยเฉพาะอย่างยิ่งจะวิเศษถ้ามันได้รับการสนับสนุนในระดับสากล แต่เพียงเรียกดูmailxคำถามที่นี่เพื่อดูว่านี้ค่อนข้างไม่แน่นอนกรณี
tripleee

2

ฉันใช้ sendEmail เพื่อส่งอีเมลอัตโนมัติแบบง่ายผ่านเซิร์ฟเวอร์ SMTP ของผู้ให้บริการภายนอก:

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"

ฉันส่งทุกอย่างในบรรทัดเดียวดังนั้นการทำสิ่งนี้ในบรรทัดคำสั่งน่าจะแสดงพารามิเตอร์ทั้งหมด (รวมถึงรหัสผ่าน smtp) ให้กับผู้ใช้ทั้งหมดหากพวกเขาทำงานps -efในขณะที่ฉันกำลังเรียกใช้คำสั่ง ฉันใช้ภายในเชลล์สคริปต์


1
นี่ไม่ใช่การติดตั้งแบบมาตรฐานและมีหลายไคลเอ็นต์ที่ใช้ชื่อนี้ ผมคิดว่าคุณจะหมายถึงen.wikipedia.org/wiki/SendEmail สามารถใช้เป็นแพ็คเกจ Debian ได้หรือไม่?
tripleee

คิดอย่างดีเกี่ยวกับเชลล์สคริปต์เช่นในระบบที่มีผู้ใช้หลายคน ฉันชอบที่รหัสผ่านของฉันอยู่ในไฟล์ลึกลงไปในความกล้าของเครื่อง ฉันแค่หวังว่าจะสามารถเก็บรหัสผ่านที่แฮชแทนข้อความที่ชัดเจนได้
SDsolar

ฉันกำลังอ้างถึงแพคเกจนี้: packages.debian.org/search?keywords=sendemail
user684790

1
ฉันไม่เห็นคำตอบนี้แสดงว่าทำงานได้กับ gmail ตามที่ระบุในคำถามเดิม
SDsolar

สิ่งนี้ใช้ได้กับ gmail เช่น: `-s smtp.gmail.com -o tls = ใช่ -xp your_gmail_password -s smtp.gmail.com: 587`
rogerdpack

1

เซิร์ฟเวอร์ของฉันคือ CEntOS 7 และมี sendmail แต่ไม่ใช่ mailx เป็นต้นแทนที่จะติดตั้งโปรแกรมใหม่ที่ฉันทดสอบโดยใช้ sendmail โดยตรงและพบว่าใช้งานได้:

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

สำหรับฉันนี่ดูเหมือนจะเป็นวิธีที่ง่ายที่สุดในการส่งอีเมลสั้น ๆ เพราะไม่จำเป็นต้องมีการเรียกใช้หรือกำหนดค่าเซิร์ฟเวอร์หรือภูตและสามารถทำได้ในบรรทัดคำสั่งเดียว

แนวคิดก็คือข้อความจะแจ้งเตือนฉันว่ามีบางโปรแกรมเกิดข้อผิดพลาดโดยไม่เปิดเผยข้อมูลที่อาจเป็นความลับจากนั้นฉันจะ SSH ไปยังเซิร์ฟเวอร์เพื่อตรวจสอบบันทึก วิธีนี้ไม่จำเป็นต้องกังวลกับภาวะแทรกซ้อนเช่นการแนบไฟล์หรือเข้ารหัสการขนส่ง

หมายเหตุ:

  • -e บอกให้ echo ตีความ '\ n' และทางหนีอื่น ๆ
  • -t แจ้งให้ sendmail รับที่อยู่ผู้รับจาก 'ถึง:' ในส่วนหัวของข้อความ
  • หากเมลไม่มาถึงให้ใช้tail /var/log/maillogเพื่อดูข้อความแสดงข้อผิดพลาด
  • หากส่งไปยังที่อยู่ gmail ของคุณให้สร้างตัวกรองที่ gmail เพื่อป้องกันไม่ให้ออกจากโฟลเดอร์ขยะ
  • sendmail นี้เป็นจริง 'sendmail.postfix' (ซึ่งอาจเป็นเรื่องปกติ); มีหน้าคนที่นี่

1
ระบบของคุณต้องติดตั้ง MTA ที่ใช้งานได้sendmail - แต่ฉันไม่เห็นคำตอบนี้แสดงให้เห็นว่ามันทำงานได้กับ gmail ตามที่ระบุไว้ในคำถามเดิม ...
SDsolar

@SDsolar คุณพูดถูก Postfix กำลังทำงานบนเซิร์ฟเวอร์ของฉันและฉันไม่รู้ ดูเหมือนว่ามันเป็นมาตรฐานที่มีการติดตั้ง Centos DigitalOcean อาจกำหนดค่าไว้ มันไม่ได้ฟังบนพอร์ตสาธารณะ สำหรับการส่งผ่าน gmail จุดของฉันคือคุณไม่ต้องการคุณสามารถส่งโดยตรงจากเซิร์ฟเวอร์ของคุณเองถ้าคุณส่งให้ตัวเองเท่านั้น (ฉันอาจถามคำถามของตัวเองและย้ายคำตอบนี้ไปถ้ามันไม่พอดีที่นี่)
j77h
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.