Gửi mail tự động dùng bash shell và mailx

bash.png

Ở 2 bài trước tôi đã giới thiệu một chút về cronbash shell, cũng đã đưa ra một ví dụ nhỏ kết hợp xử lý dùng cả 2 cái đó. Trong bài này, tôi sẽ tiếp tục sử dụng những kiến thức đã biết để demo 1 ứng dụng trong thực tế, đó là gửi mail tự động. Case tôi đưa ra là tôi có 1 website, người sử dụng có 2 loại là mất phí và miễn phí có thời hạn. Hàng ngày vào một thời điểm nhất định, tôi cho cron chạy để qúet cơ sở dữ liệu kiểm tra xem có những ai sắp hết hạn trial để gửi mail thông báo upgrade tài khoản để có thể tiếp tục sử dụng dịch vụ.

Chuẩn bị

Ở demo này tôi sẽ dử dụng Gmail SMTP để gủi mail nên cần chuẩn bị như sau :

 Note : máy local tôi đang dùng là Ubuntu 14.04

Cài đặt SMTP

Việc này rất đơn gỉan, chỉ cần chạy lệnh sau

sudo apt-get install ssmtp

Thiết lập các thông số SMTP

Khi đã cài đặt xong SMTP trên máy của bạn, hãy mở file thiết lập của nó lên bằng lệnh

sudo vi /etc/ssmtp/ssmtp.conf

Ở trong file này, bạn cần khai báo các thông tin cần thiết và lưu lại !

Root=[email protected].com
Mailhub=smtp.gmail.com:465
RewriteDomain=gmail.com
AuthUser=[email protected].com
AuthPass=pass
FromLineOverride=Yes
UseTLS=Yes

Hãy thay [email protected] bằng địa chỉ Gmail của bạn và pass là mật khẩu đăng nhập tài khoản.

Cài email client

Tôi sẽ dùng heirloom mailx. Bằng lệnh sau thì email client này sẽ được cài đặt

sudo apt-get install heirloom-mailx

Kiểm tra thử

Để chắc chắn rằng việc thiết lập của bạn không có vấn đề trước khi tiếp tục hãy thử bằng command sau

echo I am testing now | mail -s 'Hi baby' [email protected].com

Hãy thay [email protected] bằng địa chỉ mail bạn sẽ gửi đến

Trong trường hợp gửi được thì bạn có thể thấy 1 email ở địa chỉ trên nhưng nếu gặp lỗi authorize như sau :

send-mail: Authorization failed (534 5.7.14  https://support.google.com/mail/answer/78754 d1sm4315254pas.48 - gsmtp)

Thì Google đang không cho phép đăng nhập bằng những ứng dụng không có độ an toàn cao và bạn sẽ nhận được 1 email warning trong inbox. Hãy truy cập vào Gmail của bạn để mở link dẫn đến trang của Google rồi setting cho phép điều này.

less_secure_login.png

Sau đó hãy làm lại và kết qủa chạy thử command sẽ có trong giây lát 😃

test_mail.png

Đến đây, bạn đã hoàn tất việc chuẩn bị, giờ bắt đầu vào viết shell script !

Demo shell script

Ok, hãy tạo 1 file bash.sh ở đâu đó trên máy của bạn. Việc đầu tiên là cần khai báo thông tin để kết nối đến cơ sở dữ liệu.

#!/bin/bash
# set db connection information
host="127.0.0.1"
port="3306"
dbname="demo"
user="root"
pass="123456"

Việc tiếp theo là cần có câu SQL để lấy thông tin xem những user nào chuẩn bị hết hạn trial, ví dụ tôi sẽ gửi mail warning này trước ngày đó 7 ngày :

SELECT email FROM users WHERE end_trial_date = CURDATE() + INTERVAL 7 day;

Đã có lệnh thì ta cần lưu trữ những thông tin email lấy được vào mảng để xử lý ở bước tiếp theo

# store all email that be get from sql execution to an array
email_arr=( $(mysql -h$host -P$port -u$user -p$pass -D$dbname -se "SELECT email FROM users where end_trial_date = curdate() + interval 7 day;") )

Khi đã chạy hết đoạn trên thì ta đã có kết qủa các email được lưu trong 1 mảng, giờ sẽ làm 1 cái check nhỏ trước khi thực hiện gửi mail. Đó là kiểm tra xem mảng có phần tử nào không, nếu có thì mới thực hiện mail cho người dùng, ngược lại sẽ không làm gì cả. Sau đó ta dùng 1 vòng lặp for để duyệt tất cả các email rồi gửi mail theo nội dung định sẵn :

# check to see array lenght is greater than 0 or not
# if we have >= 1 email then we send an email to user
if [ ${#email_arr[@]} -gt 0 ]
then
    for ((i=0; i<${#email_arr[@]}; i++));
    do
        echo "Dear customer,

Your account under ${email_arr[$i]} will be closed automatically unless you take an upgrade to Premium Account within the next 7 days.

Best regards." | mail -s 'Your account is closing unless you take an upgrade to Premium Account' ${email_arr[$i]}
    done
fi

Nội dung đầy đủ sẽ như ảnh dưới đây.

bash.png

Xong ! Bạn đã hoàn thiện demo shell script gửi email tự động và có thể kiểm tra kết qủa thực thi :

bash_result.png

Cuối cùng, bạn hãy đặt lịch chạy theo ý của mình sử dụng cron job, nếu bạn chưa biết thì có thể tham khảo tại đây.

Thanks.