Cách đơn giản nhất để gửi thư một dòng qua dòng lệnh bằng gmail?


32

Sử dụng Raspbian và Ubunntu 16.04 LTS vì vậy cần một giải pháp Linux chung.

Yêu cầu rất đơn giản:

Tôi cần một cách để gửi tin nhắn email một dòng từ dòng lệnh.

Tôi đã thiết lập một tài khoản gmail chỉ dành cho Rpi3 cụ thể này, với địa chỉ là rpi3abc@gmail.com - không có 2FA

Vì vậy, bây giờ tôi cần có thể gửi tin nhắn thư một dòng từ bất cứ đâu (bao gồm cả cron) mà không cần sự can thiệp của người dùng.


Tôi cũng muốn nó có thể gửi các tập tin văn bản; về cơ bản, bất cứ điều gì từ stdin.


Bạn có muốn tin nhắn của mình đến từ địa chỉ cụ thể này, rpi3abc@gmail.com hay bạn có tin nhắn đó đến từ your_username @ localhost không?
John Smith

Nó xuất phát từ rpi3abc @ gmail nên tôi biết máy tính của tôi đang liên lạc với tôi. Tôi sử dụng nó trong công việc cron, chủ yếu.
SDsolar

Câu trả lời:


33

Câu trả lời đơn giản nhất để gửi tin nhắn một dòng qua gmail là sử dụng ssmtp


Cài đặt nó với các lệnh sau:

sudo apt-get update
sudo apt-get install ssmtp

Chỉnh sửa /etc/ssmtp/ssmtp.confđể trông như thế này:

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

Gửi một lớp lót như vậy:

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

hoặc là

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

Sau đó, đúng với * nix, bạn chỉ cần nhận lại lời nhắc sau vài giây.

Kiểm tra tài khoản myusername@gmail.com của bạn và voila, nó ở đó!


Điều này cũng hoạt động tốt khi gửi một tập tin, như vậy:

cat program.py | ssmtp myotherusername@yahoo.com

Và chương trình sẽ hiển thị trong hộp thư

Nếu tệp là tệp văn bản, nó có thể có dòng đầu tiên ghi Subject: xxxxxx

Điều này có thể được sử dụng với các công việc định kỳ khác nhau có thể gửi cho tôi dữ liệu với các dòng chủ đề cho biết nội dung.


Điều này sẽ làm việc với bất cứ điều gì chuẩn bị một thông điệp được truyền vào ssmtp thông qua stdin.


Để biết thêm chi tiết như bảo vệ các tệp này trước những người dùng khác và như vậy, hãy truy cập bài viết này:

Gửi email từ dòng lệnh Raspberry Pi


Hãy chắc chắn cũng nhìn xuống bên dưới câu trả lời được đăng bằng Ruicách khóa FROM:địa chỉ có thể bị thay đổi trong các tệp tin được định dạng, nếu cần.


Bây giờ nếu chỉ tôi có thể tìm ra cách gửi SMS theo cùng một cách.


1
Tôi cũng sử dụng ssmtptrong máy ảo của mình, rất nhẹ. +1
Rui F Ribeiro

1
Tại sao không sử dụng API sendmail từ Python và gửi trực tiếp sau đó?
Rui F Ribeiro

Để tiến thêm một bước này, đây là những hướng dẫn rất đơn giản để bao gồm tệp hình ảnh dưới dạng tệp đính kèm: unix.stackexchange.com/questions/381131/ Lỗi
SDsolar

Để trả lời câu hỏi của Rui: sendmailmột mình không có MTA - Đại lý vận chuyển thư để liên lạc bên ngoài máy. Theo mặc định, vì Unixen là đa người dùng theo thiết kế, sendmailsẽ gửi tin nhắn cho những người dùng khác trong cùng một hộp chứ không phải bên ngoài. ssmtplà MTA mà tôi nghĩ là đơn giản nhất để cấu hình cho gmail.
SDsolar

1
đã dành mãi mãi để cố gắng thiết lập postix này làm việc! Một lưu ý cho bất cứ ai đọc cái này, conf có lỗi đánh máy, tham số gốc phải là gmail chứ không phải gmail.
qodeninja

9

ssmtpchỉ là một trong nhiều trình bao bọc Sendmail. Tất cả đều chấp nhận một thông báo trên đầu vào tiêu chuẩn và tùy chọn một danh sách các địa chỉ làm đối số dòng lệnh và tất cả chúng đều cung cấp một nhị phân có tên sendmailthực hiện (ít nhất là các tính năng cơ bản của) API dòng lệnh Sendmail truyền thống. Nhưng nói một cách chính xác, thông điệp đó cần phải là thông điệp RFC822 được định dạng tốt. Tối thiểu, nó nên có một Subject:tiêu đề.

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

(Với ssmtp, sendmailchỉ là một liên kết tượng trưng đến ssmtp. Postfix, Exim và tôi tin rằng mọi MTA khác Provides: mail-transport-agentcó cách sắp xếp tương tự, ngoại trừ trường sendmailhợp sendmailnhị phân là "thực tế".)

Thông thường hơn, bạn có thể ghép một thông điệp email đơn giản với một tài liệu ở đây.

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

Here we interpolate the shell variable $result
____HERE

( -tTùy chọn Sendmail cho biết lấy danh sách người nhận từ các tiêu đề của thư bạn nhận được trên đầu vào tiêu chuẩn. Đường dẫn chính xác đến Sendmail sẽ khác nhau giữa các nền tảng.)

Một biến thể phổ biến khác là kết hợp đầu ra của một vài lệnh. Cẩn thận để có một dòng trống ("cổ") giữa các tiêu đề và nội dung thư.

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

Đối với bất cứ điều gì ngoài các tin nhắn văn bản ASCII rất đơn giản, bạn cần hiểu cách soạn một tin nhắn MIME phù hợp, tại thời điểm đó, việc sử dụng một công cụ như thế nào sẽ có ý nghĩa hơn mutt. Một số nền tảng có mailhoặc mailxbiết cách gửi tệp đính kèm và văn bản không phải ASCII, nhưng điều này không hoàn toàn di động.

Thách thức ở đây là không tìm được ứng dụng khách nào có thể nhận thông báo email và cố gắng gửi nó, đó là định cấu hình nó cho các chi tiết cụ thể của Gmail, yêu cầu MTA phải biết tên người dùng và mật khẩu để sử dụng cho máy chủ từ xa theo thứ tự để có thể sử dụng nó làm smarthost đi.

Đằng sau hậu trường, hầu hết các khách hàng thích mutt, mailxv.v ... thường chỉ chạy sendmailphía sau hậu trường để đưa tin nhắn ra khỏi hệ thống.


Tôi sẽ không gặp nhiều may mắn khi sử dụng sendmail trực tiếp; do đó chuyển sang ssmtp. Upvote cho câu trả lời của bạn. Nhân tiện, để gửi hình ảnh dưới dạng tệp đính kèm, tôi đã tìm thấy cách đơn giản nhất có thể sở hữu. Tôi thậm chí không phải nghĩ về MIME. Tôi chỉ sử dụng mpack, như được mô tả ở đây: unix.stackexchange.com/questions/381131/iêu
SDsolar

8

Thêm vào câu trả lời của OP:

Khi định cấu hình ssmtp, bạn cũng có thể cấm hoặc cho phép người dùng xác định Từ và đồng thời ghi đè tên miền; bạn có thể muốn làm điều đó vì một số lý do bao gồm thư không rơi vào thư mục Spam.

Bạn có thể thêm vào /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

Xin lưu ý rằng mặc dù CÓ thể được sử dụng trong quả mâm xôi tại nhà, nhưng nó có thể không được khuyến khích trong một hệ thống nhiều người dùng theo quan điểm bảo mật.


Upvote. Thông tin tuyệt vời.
SDsolar

5

Có gì sai với "thư"?

tiếng vang "Chào bạn" | thư -s "Thư quan trọng" user@example.com

"mail" là / etc / liên kết thay thế đến / usr / bin / bsd-mailx từ gói bsd-mailx. Tôi tin rằng nó ở đó theo mặc định. Tiện ích tuyệt vời để gửi thư từ các tập lệnh cron, ví dụ.

Hoạt động trên Ubuntu và FreeBSD là tốt.


3
mailxchỉ là một kết thúc trước. Nó đòi hỏi một số MTA được cấu hình để thực sự đưa thông báo ra khỏi hệ thống cục bộ. Có nhiều phiên bản không tương thích được sử dụng phổ biến, mặc dù nếu nền tảng đích của bạn chỉ là Debian, bạn có thể dựa vào hành vi BSD hợp lý gần đây.
tripleee

4

Tôi thực sự một phần để sử dụng mailxcho việc này:

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
Một số tùy chọn ở đây sẽ không khả dụng trên nhiều hệ thống không phải Debian / không phải BSD. Các -atùy chọn đặc biệt sẽ là tuyệt vời nếu nó được hỗ trợ phổ biến, nhưng chỉ cần duyệt qua mailxcâu hỏi ở đây để thấy rằng đây là khá chắc chắn không phải là trường hợp.
tripleee

2

Tôi sử dụng sendEmail để gửi e-mail tự động đơn giản thông qua máy chủ SMTP của nhà cung cấp bên ngoài:

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"

Tôi truyền tất cả mọi thứ trên một dòng, vì vậy thực hiện điều này trên một dòng lệnh có thể sẽ hiển thị tất cả các tham số (bao gồm cả mật khẩu smtp) cho tất cả người dùng, nếu họ chạy một ps -eflúc tôi đang chạy lệnh. Tôi sử dụng nó trong một kịch bản shell.


1
Đây không phải là một cài đặt tiêu chuẩn, và có nhiều khách hàng với tên này. Tôi đoán bạn đang đề cập đến en.wikipedia.org/wiki/SendEmail . Nó có sẵn dưới dạng gói Debian không?
tripleee

Suy nghĩ tốt về kịch bản shell, giống như trên một hệ thống nhiều người dùng. Tôi thích rằng mật khẩu của tôi nằm trong một tập tin sâu trong ruột của máy. Tôi chỉ muốn tôi có thể lưu trữ một mật khẩu băm thay vì văn bản rõ ràng.
SDsolar

Tôi đã đề cập đến gói này: packages.debian.org/search?keywords=sendemail
user684790

1
Tôi không thấy câu trả lời này chứng tỏ rằng nó hoạt động với gmail như được chỉ định trong câu hỏi ban đầu.
SDsolar

Điều này không hoạt động với gmail, ví dụ: `-s smtp.gmail.com -o tls = yes -xp your_gmail_password -s smtp.gmail.com: 587`
rogerdpack

1

Máy chủ của tôi là CEntOS 7 và có sendmail nhưng không phải mailx, v.v. Thay vì cài đặt một chương trình mới tôi đã thử nghiệm bằng cách sử dụng sendmail trực tiếp và thấy rằng nó hoạt động:

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

Đối với tôi đây dường như là cách đơn giản nhất để gửi một email ngắn, vì nó không yêu cầu chạy hoặc cấu hình máy chủ hoặc trình nền, và có thể được thực hiện trong một dòng lệnh.

Ý tưởng là một thông báo sẽ đơn giản cảnh báo tôi rằng một chương trình nào đó đã gây ra lỗi, mà không tiết lộ bất kỳ thông tin bí mật nào, và sau đó tôi sẽ SSH đến máy chủ để kiểm tra nhật ký của nó. Bằng cách này, không cần phải bận tâm đến các biến chứng như đính kèm tệp hoặc mã hóa vận chuyển.

Ghi chú:

  • -e nói tiếng vang để giải thích '\ n' và các lối thoát khác.
  • -t nói với sendmail để nhận địa chỉ người nhận từ 'To:' trong tiêu đề thư.
  • Nếu thư không đến, sử dụng tail /var/log/maillogđể xem thông báo lỗi.
  • Nếu gửi đến địa chỉ gmail của bạn, hãy tạo bộ lọc tại gmail để tránh chúng khỏi thư mục rác.
  • Sendmail này thực sự là 'sendmail.postfix' (có thể là bình thường); có một trang người đàn ông ở đây

1
Hệ thống của bạn phải được cài đặt MTA đang hoạt động với sendmail - nhưng tôi không thấy câu trả lời này chứng minh rằng nó hoạt động với gmail như được chỉ định trong câu hỏi ban đầu ...
SDsolar 21/03/18

@SDsolar Bạn nói đúng. Postfix đang chạy trên máy chủ của tôi và tôi không biết. Có vẻ như đó là tiêu chuẩn với cài đặt Centos; có lẽ DigitalOcean đã cấu hình nó. Nó không nghe trên một cổng công cộng. Đối với việc gửi qua gmail, quan điểm của tôi là bạn không cần, bạn có thể gửi trực tiếp từ máy chủ của mình, nếu bạn chỉ gửi cho chính mình. (Tôi có thể hỏi câu hỏi của riêng mình và chuyển câu trả lời này qua, nếu nó không phù hợp ở đây.)
j77h
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.