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

Gửi email từ dòng lệnh là chuyện cũ rích, cũ đến nỗi lâu lắm rồi anh mới làm lại nên phải Google mãi mới nuột nà được. Cơ bản vẫn là dùng sendmail để gửi qua Gmail thôi. Các bước dưới đây thực hiện trên Ubuntu 18.04.

Đầu tiên là cài đặt sendmail

$ sudo apt-get install sendmail mailutils sendmail-bin

Cái này sẽ có vài bước phải nhập thông tin gì đó. Anh thì không gặp vấn đề gì.

Lưu thông tin tài khoản Gmail

Để gửi thư qua Gmail thì phải có tài khoản và mật khẩu. Mặc dù là thông tin này sẽ được mã hoá và hạn chế truy cập nhưng nói chung là chỉ nên dùng một mật khẩu ngẫu nhiên hoặc App Password cho tài khoản này.

$ sudo mkdir /etc/mail/authinfo/
$ cd /etc/mail/authinfo/
$ sudo vi gmail-auth

Nội dung sẽ là:

AuthInfo: "U:root" "I:địa-chỉ-Gmail" "P:mật-khẩu"

Lưu lại rồi mã hoá:

$ sudo makemap hash gmail-auth < gmail-auth

Thông tin mã hoá sẽ nằm trong gmail-auth.db mới được tạo ra. Bây giờ đã có thể xoá gmail-auth chứa thông tin chưa mã hoá đi, cũng như hạn chế truy cập vào thư mục authinfo:

$ sudo rm gmail-auth
$ cd ..
$ sudo chmod 700 ./authinfo

Cấu hình sendmail

sudo vi /etc/mail/sendmail.mc rồi chèn đoạn sau vào trước định nghĩa MAILER đầu tiên. Nhưng cũng đừng cho lên đầu tập tin sendmail.mc nhé!

define(`SMART_HOST',`[smtp.gmail.com]')dnl
define(`RELAY_MAILER_ARGS', `TCP $h 587')dnl
define(`ESMTP_MAILER_ARGS', `TCP $h 587')dnl
define(`confAUTH_OPTIONS', `A p')dnl
TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
FEATURE(`authinfo',`hash -o /etc/mail/authinfo/gmail-auth.db')dnl

Bước tiếp theo sẽ là xây dựng lại cấu hình sendmail cũng như tải lại dịch vụ sendmail là xong:

$ sudo make -C /etc/mail
$ sudo service sendmail restart

Chạy thử và gỡ lỗi

Xong rồi thì chạy thử xem như nào:

$ echo "Nội dung" | mail -s "Thử gửi email" long@timestudio.vn

Nếu dòng lệnh đơ một lúc mới xong thì có mấy khả năng:

Khả năng thường gặp là tài khoản Gmail chưa cho phép Less secure app access. Còn nếu bạn đã đặt chế độ xác thực hai lớp thì phải dùng App Password. Bạn sẽ thấy có thư ở mục Sent nhưng thực tế nó không được chuyển đến địa chỉ nhận.

Khả năng thứ hai là do máy chủ chưa cấu hình tên miền đầy đủ (FQDN) nên nó sẽ đợi một lúc rồi mới gửi đi. Tầm đôi ba phút thì mới nhận được email. Nếu xem /var/log/mail.err sẽ thấy thông báo kiểu như “My unqualified host name (vps) unknown; sleeping for retry”.

Cách xử lí là mở tập tin /etc/hostname rồi nhập tên miền của bạn vào. Ví dụ: luom.tv

Tiếp theo mở /etc/hosts rồi nhét hai dòng kiểu như này vào:

127.0.0.1       localhost.localdomain   localhost
45.77.243.37    vps.luom.tv       vps

Xong rồi chạy thử hostname -f xem nó có ra vps.luom.tv không là ổn. Bây giờ gõ mail một phát là có thể nhận được thư trong một nốt trắng :p

Khả năng xấu nhất là hoàn toàn không gửi được. Cái này phải xem /var/log/mail.err để chẩn bệnh.

Ứng dụng

Ơ thế nãy giờ làm cái này chỉ để gửi thư từ dòng lệnh cho sành điệu à? Đấy cũng là một khả năng. Thực tế thì còn nhiều ứng dụng khác. Ví dụ như khi tự động sao lưu xong thì thông báo cho ông chủ là ngày này, giờ này em đã làm xong việc được giao. Hoặc là làm một cái script định kì kiểm tra xem nếu mysqld bị sập thì khởi động lại và thông báo sự việc qua email.

Đại khái vậy.