วิธีการส่งอีเมลจากบรรทัดคำสั่ง?


28

จะส่งอีเมล์จาก command line หรือ script ได้อย่างไร? ฉันต้องการที่จะสามารถเรียกใช้สคริปต์โดยทางโปรแกรมผ่านผู้รับและข้อความ


หากคุณกำลังเขียนโปรแกรมหลายภาษามีห้องสมุดที่จัดการกับอีเมล
user151019

คำตอบ:


21

mail -s subject someone@example.com พิมพ์ข้อความของคุณกดCtrl+Dเพื่อเสร็จสิ้น


11
หากคุณไม่ได้กำหนดค่าระบบของคุณให้บอกตำแหน่งที่จะส่งอีเมลซึ่งอาจจะไม่ส่งอีเมลจริง ๆ แล้วมันจะส่งผลให้เครื่อง Mac ของฉันสับสน
TJ Luoma

15
-1: คำตอบนี้ไม่สมบูรณ์ ยกเว้นว่ามีการกำหนดค่าระบบก่อนดำเนินการคำสั่งนี้ตามที่ @TJLuoma ตั้งข้อสังเกตคำสั่งนี้จะไม่ทำงาน
melvynkim

1
TJ Luoma และ melvkim ไม่ถูกต้อง: ระบบ OS X มาตรฐานออกจากกล่องจะส่งอีเมลได้ดีโดยไม่ต้องมีการกำหนดค่า เครื่อง OS X จะทำหน้าที่เป็นเซิร์ฟเวอร์ SMTP ของตัวเองค้นหา DNS MX สำหรับโดเมนปลายทางและส่งอีเมลที่นั่น
JohnEDee

2
@patrix ถูกต้องใช้ชื่อผู้ใช้งานที่ลงชื่อเข้าใช้นานและที่อยู่ ".local" ที่สร้างขึ้นเองของ Mac เพื่อสร้าง "จาก" ฉันใช้มันตลอดเวลาสำหรับอีเมลแจ้งเตือนถึงฉันและพนักงานของฉันจากกระบวนการเชลล์สคริปต์ TJ Luoma และ melvkim บอกว่า "จะไม่ทำงาน" และ "ไม่ได้ส่งอีเมลจริง" อย่างไรก็ตามทั้งสองอย่างนี้ไม่ถูกต้อง
JohnEDee

1
@RamarajT ใช่คุณสามารถไพพ์เอาต์พุตของคำสั่ง echo ไปยังเมลและจากนั้นจะไม่ต้องการ Cmd-D ตัวอย่างเช่น: echo This will be the body of the email | mail -s "This is the Subject" destination@example.com
JohnEDee

26

มีสองโปรแกรมที่ฉันรู้ซึ่งจะช่วยให้คุณกำหนดค่า Mac ของคุณเพื่อส่งอีเมลจากบรรทัดคำสั่งได้อย่างง่ายดาย

ฉันได้เขียน HOWTOs สำหรับทั้งคู่:

msmtpของทั้งสองผมขอแนะนำให้

การกำหนดค่ามีความซับซ้อนพอที่ฉันไม่แน่ใจว่าฉันควรทำซ้ำขั้นตอนทั้งหมดที่นี่หรือไม่ แต่ฉันจะพูดถึงว่าถ้าคุณใช้ Homebrew คุณสามารถติดตั้ง msmtp โดยใช้

brew install msmtp --with-macosx-keyring

ส่วนที่เหลือเป็นเพียงเรื่องของการตั้งค่าไฟล์การกำหนดค่าที่เกี่ยวข้อง

ที่แรกก็คือ /usr/local/etc/msmtprc

# Begin msmtprc
# Set default values for all following accounts.
defaults
tls on
logfile ~/.msmtp.log

# A first gmail address
account example@gmail.com
host smtp.gmail.com
port 587
protocol smtp
auth on
from example@gmail.com
user example@gmail.com
tls on
tls_starttls on

# this next line is crucial: you have to point to the correct security certificate for GMail.
# If this doesn't work, check the mstmp documentation
# at http://msmtp.sourceforge.net/documentation.html for help
#
# This next line should all be on one long line:
tls_trust_file /path/to/Thawte Roots/Thawte SSLWeb Server Roots/thawte Premium Server CA/Thawte Premium Server CA.pem

# Set a default account
# You need to set a default account for Mail
account default : example@gmail.com

# end msmtprc

โปรดทราบว่าtls_trust_fileบรรทัดควรชี้ไปที่ใดก็ตามที่คุณได้ดาวน์โหลดและติดตั้งใบรับรองจากhttps://www.thawte.com/roots/index.html

ฉันใส่ของฉัน~/Dropbox/Thawte Rootsเพื่อที่ฉันจะได้ใช้กับเครื่อง Mac ทั้งหมดของฉัน

จากนั้นคุณต้องใช้~/.mailrcไฟล์เพื่อบอกตำแหน่งที่อยู่ msmtp binary หากคุณใช้brewมันจะเป็น/usr/local/bin/msmtpเช่นนั้นไฟล์จะเป็นดังนี้:

set sendmail="/usr/local/bin/msmtp"

ขั้นตอนสุดท้าย แต่ที่สำคัญคือการทำให้แน่ใจว่า Keychain ของคุณมีข้อมูลในรูปแบบที่ msmtp คาดหวัง:

ฉันคิดว่าครอบคลุมรายละเอียดส่วนใหญ่ ดูhttp://www.tuaw.com/2010/05/04/msmtp-a-free-tool-to-send-email-from-terminal/หากคุณต้องการรายละเอียดเพิ่มเติม


เห็นได้ชัดว่าตัวอย่างของฉันในสคริปต์ด้านบนถือว่าคุณใช้ Gmail แต่สามารถใช้กับเซิร์ฟเวอร์อื่นได้เช่นกัน เปลี่ยนexample@gmail.comเป็นที่อยู่อีเมล Gmail หรือ Google Apps
TJ Luoma

ผมจนสามารถที่จะได้รับการทำงานโดยใช้รากของ Google อยู่ที่นี่: pki.google.com/roots.pem หากคุณติดอยู่ในปัญหาเกี่ยวกับไฟล์ความน่าเชื่อถือและ Gmail สิ่งนี้อาจปลดล็อคคุณ
codewise

หากคุณมีปัญหาเกี่ยวกับตำแหน่งของไฟล์ config (msmtprc) หลังจากติดตั้งด้วย Homebrew บน macOS 10.13.3, msmtp จะค้นหามันในโฮมได~/.msmtprc
เร็กตอรี่

15

วิธีพื้นฐานที่สุดในการส่งเมลคือเซสชัน telnet ที่มีเซิร์ฟเวอร์ smtp ของผู้ให้บริการ / เครือข่ายของคุณ หลังจากที่คุณติดต่อเซิร์ฟเวอร์และหลังจากทุกคำสั่งเซิร์ฟเวอร์จะตอบถ้ามันยอมรับคำสั่งด้วยบางสิ่งเช่น "250 OK" หรือหากไม่มีข้อความแสดงข้อผิดพลาด

รายละเอียดทั้งหมดสามารถพบได้ใน RFC2821 - Simple Mail Transfer Protocol, Google สำหรับมัน วิธีพื้นฐานนี้ดีมากสำหรับการทดสอบว่าทำไมมีอะไรผิดพลาดในการส่งเมล แต่ฉันคิดว่ามันค่อนข้างซับซ้อนในการเขียนสคริปต์เพื่อพิสูจน์แบบสมบูรณ์

ก่อนอื่นรับอินเทอร์เฟซบรรทัดคำสั่งบนคอมพิวเตอร์ของคุณโดยเริ่มต้น Terminal จากนั้นให้ทำตามคำสั่งต่อไปนี้ทีละคำสั่ง

เปิดเซสชัน telnet ไปยังพอร์ต 25 ของเซิร์ฟเวอร์ smtp ของผู้ให้บริการ / เครือข่ายของคุณ

telnet name_or_ip_of_smtp_server 25

กล่าวทักทายพร้อมกับชื่ออินเทอร์เน็ตของผู้ให้บริการ / เครือข่ายของคุณเช่น abc.com

EHLO name_of_your_network

จำเป็นต้องใช้ที่อยู่ from = return <และ> เป็นส่วนหนึ่งของคำสั่ง

MAIL FROM:<your_email_adress>

ระบุปลายทางอย่างน้อยหนึ่งรายการ <และ> เป็นส่วนหนึ่งของคำสั่ง

RCPT TO:<destination_email_address>
RCPT TO:<second_destination_email_address>
RCPT TO:<etc_destination_email_address>

แจ้งเซิร์ฟเวอร์ที่คุณต้องการเริ่มส่งข้อมูล

DATA

ตอนนี้เซิร์ฟเวอร์ควรตอบคุณสามารถเริ่มส่งจดหมายและเข้าสู่โหมดข้อมูล

your data
more data
etc

ตอนนี้เสร็จสิ้นข้อมูลที่มีจุดเป็นอักขระเฉพาะในบรรทัด

.

เซิร์ฟเวอร์กลับไปที่โหมดคำสั่งเพื่อให้คุณสามารถออกจาก

QUIT

13

สิ่งนี้ได้ผลสำหรับฉันมันเขียนโดยคำนึงถึง Lion แต่ใช้ได้กับ Mountain Lion Btw นี่คือการใช้ Gmail ดังนั้นหากคุณไม่ได้ ...

คุณไม่จำเป็นต้องดาวน์โหลดอะไรเลย! (เพียงตั้งค่าบัญชี gmail)

http://www.anujgakhar.com/2011/12/09/using-macosx-lion-command-line-mail-with-gmail-as-smtp/

กำหนดค่า Postfix สำหรับ Gmail SMTP แก้ไขไฟล์ /etc/postfix/main.cf

sudo vim /etc/postfix/main.cf

และเพิ่มดังต่อไปนี้ด้านล่าง relayhosts ความเห็น: -

relayhost = [smtp.gmail.com]:587
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_use_tls = yes
smtp_sasl_mechanism_filter = plain

สร้าง sasl_password หากยังไม่มีอยู่

sudo vim /etc/postfix/sasl_passwd

และป้อนข้อมูลต่อไปนี้: -

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

รันคำสั่งต่อไปนี้

sudo chmod 600 /etc/postfix/sasl_passwd
sudo postmap /etc/postfix/sasl_passwd
sudo launchctl stop org.postfix.master
sudo launchctl start org.postfix.master

และคุณทำเสร็จแล้ว….
ตอนนี้คุณควรจะสามารถส่งอีเมลจากภายในบรรทัดคำสั่งเช่นส่งเนื้อหาของไดเรกทอรีเป็นต้นไม้ไปยังที่อยู่อีเมล

tree /var/www/somefolder | mail -s "contents" your@yourdomain.com

PS: ฉันได้รับสิ่งนี้ทำงานได้ดีเมื่อทำงานด้วยตนเองจาก Terminal หรือสคริปต์ อย่างไรก็ตาม ณ จุดนี้ฉันติดอยู่กับปัญหาที่เมลไม่เคยถูกส่งเมื่อ launchd เรียกใช้สคริปต์ ฉันเดาว่าเป็นปัญหากับการตั้งค่างาน launchd
จอนนี่

ฉันทำให้มันทำงานได้ ดูapple.stackexchange.com/questions/92406/…
Jonny

+1 ขอบคุณที่เพิ่มสิ่งนี้ ช่วยฉันออกไปจริงๆ สิ่งที่ฉันต้องการจริงๆคือรายการ relayhost ใน main.conf (เป็นเซิร์ฟเวอร์ SMTP ของฉันเองบน LAN ของฉัน)
boot13

3
ข้างต้นอาจล้าสมัย ฉันต้องเพิ่ม "smtp_sasl_mechanism_filter = plain" ตามstackoverflow.com/a/26451135/197789เพื่อให้มันทำงานได้ มิฉะนั้นฉันได้รับข้อผิดพลาด "ล้มเหลวทั่วไป"
Von

0

mtcmail เป็นตัวเลือกอื่น: http://www.macupdate.com/app/mac/33505/mtcmail-cli

[ละเว้นข้อความเพิ่มเติมนี้ เพิ่มเนื่องจาก: เนื้อหาต้องมีอักขระอย่างน้อย 30 ตัว คุณป้อน 27]


0

คุณอาจต้องการตรวจสอบpostfixconfที่เปิดใช้งานและกำหนดค่า OS X เพื่อส่งอีเมลจากบรรทัดคำสั่ง (โดยใช้อินพุตของคุณ)

มันขึ้นอยู่กับการกำหนดค่า postfix ที่มีเอกสารดีบนเว็บที่นี่ , ที่นี่และที่นี่


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