Cách gửi mail qua đường ống dòng lệnh


9

Tôi có một lệnh cron chạy một tệp và tôi đang cố gắng thiết lập đầu ra để nó gửi email cho tôi. Tôi sử dụng điều này với các tập lệnh của bên thứ 3 mà tôi không muốn sửa đổi các tệp trực tiếp, vì vậy tôi cần phải điều chỉnh đầu ra thay vì sửa đổi PHP.

Tôi đang di chuyển từ một máy chủ sử dụng mailđến một máy chủ sử dụng sendmail. Tôi đang vật lộn để tìm hiểu làm thế nào để gửi một chủ đề chính xác đến sendmail thông qua một dòng lệnh.

/usr/local/bin/php -f /path/to/file.php 2>&1 | /usr/sbin/sendmail -s "My Test Email Subject" test@email.com

sendmaillà hệ nhị phân được sử dụng bởi hệ thống của bạn để định tuyến thư được gửi tới nó mail. Nó là một phần của bộ chương trình như sendmail , postfix , exim , v.v. Vì vậy, bạn cần phải cài đặt gói thích hợp cho thư . Vì vậy, hãy cho chúng tôi phân phối linux mà bạn đang sử dụng.
adamo

Tất cả các dạng UNIX / Linux tuân thủ POSIX phải cung cấp một số tên thực thi có tên "sendmail" và lấy một bộ tùy chọn cụ thể tương thích với một tập hợp con của chức năng sendmail (bao gồm tùy chọn -t, được mô tả trong câu trả lời của timday, bên dưới). Exim, Postfix và qmail đều cung cấp những thứ này --- đôi khi chúng sẽ được cài đặt trong / usr / libexec / sendmail chứ không phải / usr / bin hoặc / usr / sbin, chẳng hạn.
Jim Dennis

Câu trả lời:


3

/ usr / sbin / sendmail

Sai rồi.

Bạn nên có một mailsố lệnh ở đâu đó. Nó có thể được gọi mailx. Nên có trong /bin/thư mục. Theo thông lệ tiêu chuẩn, các tập lệnh php không bao giờ được gọi bất cứ thứ gì trong /sbinhoặc /usr/sbin. Các chương trình sbin thường dành cho root.

Ngoài ra, php có chức năng mail tích hợp .


Nếu nó không mailhoặc mailxnó có thể Mail. Nhưng ngay cả khi những thứ đó không tồn tại, bạn có thể cài đặt mutt và chạy mutt -xmô phỏng mailx.
adamo

Đây là sự thật ... để xác định con đường của tôi, tôi đã chạy which mailvà nó trở lại /bin/mail.
Webnet

2
sendmail là cách tiếp cận tốt hơn (đó là tiêu chuẩn Posix) ... nhưng tốt hơn là sử dụng sendmail -t (lấy các tiêu đề từ luồng đầu vào). Điều này tránh được nhiều lỗ hổng nội suy biến đổi vỏ có thể bằng cách cho phép chương trình gửi thư chỉ tương tác với tiện ích sendmail mà không gọi bất kỳ shell nào cả). Xem câu trả lời "timday's" để biết thêm chi tiết.
Jim Dennis

13

Trên các hệ thống Debian của tôi (có Exim chứ không phải là sendmail "thực", nhưng vẫn có nhị phân sendmail để tương thích), khi tôi muốn gửi thư từ một tập lệnh, tôi làm một cái gì đó tương đương:

cat <<EOF | sendmail -t
To: recipient@example.com
Subject: Testing
From: sender@example.com

This is a test message
EOF

Lưu ý rằng dòng trống là quan trọng.


1
Dòng trống được sử dụng để tách phần tiêu đề của tin nhắn khỏi phần thân tin nhắn. Tại sao không sendmail -t <<EOF?
adamo

@adamo: Bởi vì nó gần với mẫu hơn trong câu hỏi ban đầu để chuyển thành sendmail với '|' (và trên thực tế, những nơi tôi tự làm việc này thường là một cái gì đó giống như Gener_test_message.sh | sendmail -t).
timday

2
Đây là cách tiếp cận chính tắc để gửi thư theo chương trình an toàn trong UNIX.
Jim Dennis

cuối cùng cũng có một ví dụ hoạt động cho sendmail! Cảm ơn bạn!
cuộc

nếu sendmailthất bại và ghi vào STDERR, làm thế nào tôi có thể nắm bắt điều này như một biến để sử dụng sau này trong tập lệnh?
streetster

1
echo -e "This is my body\nSecond line" 2>&1 | sed '1!b;s/^/To: test@email.com\nSubject: My Test Email Subject\n\n/' | sendmail -t

echo = Phần thân của email.
sed Stuff = Áp dụng các tiêu đề email và hai dòng quan trọng giữa cơ thể và các tiêu đề.
sendmail -t = Đường ống trực tiếp thông qua sendmail.


-1
php -f file.php 2>&1 | sed 's/^/To: test@email.com\nSubject: My Test Email Subject\n\n/' | sendmail -t

1
Xin chào và chào mừng đến với Server Fault. Có lẽ bạn có thể xây dựng câu trả lời của bạn một chút?
slm
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.