Gửi thư từ tập lệnh shell linux


120

Tôi muốn gửi email từ tập lệnh Linux Shell. Lệnh tiêu chuẩn để thực hiện việc này là gì và tôi có cần thiết lập bất kỳ tên máy chủ đặc biệt nào không?


8
Hãy thử hỏi trên Superuser [ superuser.com ] hoặc tốt hơn là Unix và Linux SE [ unix.stackexchange.com ].
Dan Molding

Câu trả lời:


119

Nếu máy chủ được cấu hình tốt, chẳng hạn như nó có MTA đang hoạt động, bạn chỉ có thể sử dụng lệnh mail.

Ví dụ: để gửi nội dung của một tệp, bạn có thể làm như sau:

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

man mail để biết thêm chi tiết.


7
'Mta' ở đây có nghĩa là gì, có tên đầy đủ hay liên kết không? Là một người mới bắt đầu, đó là những gì tôi muốn biết. Vì tôi thiếu kinh nghiệm để làm điều đó.
Zen

5
@Zen MTA là viết tắt của Mail transport agent. postfix, sendmail, qmail vv
Francesco Laurita

@Zen đối với hầu hết các phần, bạn có thể coi MTA có nghĩa là máy chủ SMTP hoặc IMAP.
user151841 30/09/15

1
Nếu bạn không chắc chắn về cách cài đặt / cấu hình và bạn đang sử dụng Ubuntu: sudo apt-get install mailutilsvà chọn Internet site: Thư được gửi và nhận trực tiếp bằng SMTP. .
user1717828

86

Nếu bạn muốn có một phương pháp sạch và đơn giản trong bash, và bạn không muốn sử dụng cat, echovv, cách đơn giản nhất sẽ là:

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

<<<được sử dụng để chuyển hướng đầu vào tiêu chuẩn. Nó đã là một phần của bash trong một thời gian dài.


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

Này, điều này làm việc tuyệt vời cho tôi, cảm ơn! Làm cách nào để tôi chỉ định nhiều địa chỉ để giao hàng?
E.Owen

1
@ E.Owen Bạn có thể sử dụng tùy chọn -t để gửi đến nhiều địa chỉ được phân tách bằng dấu cách
Jon

25

Nếu cả exim và ssmtp đều đang chạy, bạn có thể gặp rắc rối. Vì vậy, nếu bạn chỉ muốn chạy một MTA đơn giản, chỉ để có một ứng dụng khách smtp đơn giản để gửi thông báo qua email về sự đòi hỏi, bạn phải xóa MTA được cài đặt sẵn cuối cùng như exim hoặc postfix trước và cài đặt lại ssmtp.

Sau đó, nó khá đơn giản, chỉ định cấu hình 2 tệp (revaliases và ssmtp.conf) - Xem ssmtp doc - và cách sử dụng trong tập lệnh bash hoặc bourne của bạn như sau:

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

Rõ ràng là đừng quên mở đầu ra tường lửa của bạn vào cổng smtp (25).


Tôi có thể thay đổi số cổng trong tập lệnh này ở đâu? Trong máy chủ của tôi, cổng smtp hoạt động trên 8181.
manix

Tôi sẽ không làm điều này trong shell này nếu không sớm muộn gì bạn cũng sẽ gặp khó khăn. Bạn có thể làm điều đó trong tệp cấu hình: Xem unix.stackexchange.com/a/132731
hornetbzz

1
Tại sao các dòng mới được nhập vào nếu tôi tạo tiếng vọng đơn giản $ MAIL_TXT?
KernelPanic

1
@Marko: Xin vui lòng xem người đàn ông echo với tùy chọn -e: cho phép giải thích thoát khỏi dấu gạch chéo ngược
hornetbzz

Xin lỗi, đã nhập sai tham số -e
KernelPanic

10

Một tùy chọn khác cho tập lệnh 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
  • Tập tin /tmp/mailtest được ghi đè mỗi khi tập lệnh này được sử dụng.
  • Vị trí của sendmail có thể khác nhau tùy theo hệ thống.
  • Khi sử dụng điều này trong tập lệnh cron, bạn phải sử dụng đường dẫn tuyệt đối cho lệnh sendmail.

1
không tán thành vì nhiều quá trình có thể gọi tập lệnh cùng một lúc. Điều này có thể gây ra tệp tmp bị hỏng / không chính xác. Ngoài ra, tệp / tmp không bị ghi đè mỗi khi tệp này được sử dụng - nó thực sự phát triển với mỗi email chứa tất cả các email trước đó bên trong. Không tốt.
Taterhead

1
Lần ghi đầu tiên vào / tmp / mailtest là một lần ghi đè nên nó sẽ xóa bất cứ thứ gì đã có trong đó trước đó. Tuy nhiên, phương pháp này không lý tưởng vì những lý do khác mà bạn đã mô tả.
Simon

8

Nói chung, bạn muốn sử dụng maillệnh để gửi tin nhắn của mình bằng MTA cục bộ (sẽ gửi tin nhắn bằng SMTP đến đích hoặc chỉ chuyển tiếp nó đến một số máy chủ SMTP mạnh hơn, chẳng hạn như tại ISP của bạn). Nếu bạn không có MTA cục bộ (mặc dù hơi bất thường khi hệ thống giống UNIX bỏ qua một MTA), bạn có thể sử dụng một số MTA tối giản như ssmtp .

ssmtpkhá dễ dàng để cấu hình. Về cơ bản, bạn sẽ chỉ cần chỉ định máy chủ SMTP của nhà cung cấp của bạn ở đâu:

# 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

Một tùy chọn khác là sử dụng một trong vô số tập lệnh chỉ kết nối trực tiếp với máy chủ SMTP và cố gắng đăng thư ở đó, chẳng hạn như Smtp-Auth-Email-Script , smtp-cli , SendEmail , v.v.


"ssmtp" đã được cài đặt trên máy nên tôi không thể thử nhưng dù sao cũng cảm ơn
appshare.co

5

Thừa nhận rằng bạn muốn sử dụng một số máy chủ smtp, bạn có thể làm:

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

Thay đổi somehost, someportsomeaccount@somedomainnhững giá trị thực tế mà bạn sẽ sử dụng. Không có mã hóa và không có xác thực nào được thực hiện trong ví dụ này.


Và phải làm gì nếu mailxkhông được cài đặt?
nalply

2

Các maillệnh nào đó (ai mà có thể đoán ;-). Mở trình bao của bạn và nhập man mailđể lấy trang hướng dẫn sử dụng maillệnh cho tất cả các tùy chọn có sẵn.


2
Tôi đã làm điều đó nhưng không có tùy chọn để chỉ định một máy chủ để sử dụng
appshare.co

1
Đó là một phần của cấu hình tác nhân chuyển thư cục bộ của bạn, ví dụ: Sendmail hoặc Postfix.
DarkDust

2

Bạn thậm chí không cần MTA. Giao thức SMTP đủ đơn giản để ghi trực tiếp nó vào máy chủ SMTP của bạn. Bạn thậm chí có thể giao tiếp qua SSL / TLS nếu bạn đã cài đặt gói OpenSSL. Kiểm tra bài đăng này: https://33hops.com/send-email-from-bash-shell.html

Trên đây là một ví dụ về cách gửi e-mail văn bản / html sẽ hoạt động hiệu quả. Nếu bạn muốn thêm tệp đính kèm, mọi thứ có thể phức tạp hơn một chút, bạn sẽ cần mã hóa base64 các tệp nhị phân và nhúng chúng vào giữa các ranh giới. Đây là một nơi tốt để bắt đầu điều tra: http://forums.codeguru.com/showthread.php?418377-Send-Email-w-attachments-using-SMTP


2

Trên linux, tiện ích mail có thể được sử dụng để gửi tệp đính kèm với tùy chọn "-a". Đi qua các trang nam để đọc về tùy chọn. Ví dụ: mã sau sẽ gửi một tệp đính kèm:

mail -s "ĐÂY LÀ CHỦ ĐỀ" -a file đính kèm.txt name@domain.com <<< "Chào bạn, Vui lòng tìm báo cáo lỗi."


Chào mừng đến với SO. Cảm ơn đã đăng câu trả lời. Vui lòng đọc thông tin về cách viết một câu trả lời hay và sửa đổi cho phù hợp. Thưởng thức SO ;-)
ZF007

2

GỬI MAIL TỪ LINUX ĐẾN GMAIL

SỬ DỤNG POSTFIX

1: cài đặt phần mềm

Debian và 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

BSD miễn phí:

portsnap fetch extract update

cd /usr/ports/mail/postfix

make config

trong phần cấu hình, hãy chọn hỗ trợ SASL

make install clean

pkg install mailx

2. Định cấu hình Gmail

/ etc / postfix. Tạo hoặc chỉnh sửa tệp mật khẩu:

vim /etc/postfix/sasl_passwd

Tôi đang sử dụng vim bạn có thể sử dụng bất kỳ trình chỉnh sửa tệp nào như nano, cat .....

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

thêm điều này

trong đó người dùng thay thế bằng tên thư và mật khẩu của bạn là mật khẩu gmail của bạn

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

Lưu và đóng tệp và Chỉ làm cho tệp có thể truy cập được bằng root: vì nội dung nhạy cảm có chứa mật khẩu của bạn

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

> FreeBSD:

thư mục / usr / local / etc / postfix.

vim /usr/local/etc/postfix/sasl_passwd

Thêm dòng:

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

Lưu và Làm cho nó chỉ có thể truy cập bằng root:

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

3. Cấu hình Postfix

tệp cấu hình main.cf

6 tham số chúng ta phải đặt trong Postfix

Ubuntu, Arch Linux, Debian:

biên tập

 vim /etc/postfix/main.cf

sửa đổi các giá trị sau:

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 mà trong cấu hình sẽ được đặt thành trống , để đảm bảo rằng không có tùy chọn bảo mật không tương thích với Gmail nào được sử dụng.

lưu và đóng

như cho

OpenSUSE:

vim /etc/postfix/main.cf

sửa đổi

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

nó cũng yêu cầu cấu hình của tệp master.cf

sửa đổi:

vim /etc/postfix/master.cf

bằng cách bỏ ghi chú dòng này (loại bỏ #)

#tlsmgr unix - - n 1000? 1 tlsmg

lưu và đóng

Fedora, CentOS:

vim /etc/postfix/main.cf

sửa đổi

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

BSD miễn phí:

vim /usr/local/etc/postfix/main.cf

sửa đổi:

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

lưu và đóng cái này

4. Xử lý tệp mật khẩu:

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

postmap /etc/postfix/sasl_passwd

cho FreeBSD

postmap /usr/local/etc/postfix/sasl_passwd

4.1) Khởi động lại postfix

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

systemctl restart postfix.service

cho FreeBSD:

service postfix onestart
nano /etc/rc.conf

thêm vào

postfix_enable=YES

lưu rồi chạy để bắt đầu

service postfix start

5. Bật "Ứng dụng kém an toàn" trong Gmail bằng cách sử dụng trợ giúp của liên kết bên dưới

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

6. Gửi Email Kiểm tra

mail -s "subject" recever@domain.com

nhấn nút Enter

thêm nội dung thư theo ý muốn của bạn nhấn enter rồi nhấn ctrl + d để kết thúc thích hợp

nếu nó không hoạt động, hãy kiểm tra lại tất cả các bướckiểm tra xem bạn có bật " ứng dụng kém an toàn" trong gmail của mình không

sau đó khởi động lại postfix nếu bạn sửa đổi bất cứ điều gì trong đó

cho shell script tạo tệp .sh và thêm lệnh 6 bước theo yêu cầu của bạn

ví dụ chỉ cho một mẫu

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

Tập lệnh sẽ gửi email khi mức sử dụng đĩa vượt quá tỷ lệ phần trăm được chỉ định bởi biến thể THRESHOLD (ở đây là 80%).


Tên của câu trả lời này không nên là "GỬI MAIL TỪ LINUX ĐẾN LINUX ĐẾN LINver@domain.com QUA GMAIL"?
Cameron Hudson

1

bạn có thể sử dụng lệnh 'email' hoặc 'emailx'.

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

Bởi vì nếu nó không được gửi từ một tài khoản được ủy quyền, email sẽ vào danh sách thư rác.

(2) $ echo "Vui lòng nhớ xóa các chủ đề không sử dụng trên!" | mail -s "chủ đề lãng phí" -a a.txt developer@xxx.com # gửi tới người dùng nhóm 'developer@xxxx.com'

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.