Thứ tư, 22/04/2015 | 00:00 GMT+7

Cách gửi email qua dịch vụ SMTP bên ngoài với Sendmail trên FreeBSD 10.1

Một trong những nhu cầu phổ biến nhất khi cài đặt một web server mới là gửi email. Cách an toàn và dễ dàng nhất để làm điều này là kết nối server của bạn với một dịch vụ gửi thư như SendGrid hoặc Amazon SES. Sử dụng dịch vụ bên ngoài sẽ giúp bạn tránh được những cạm bẫy như IP server của bạn bị các dịch vụ chống thư rác đưa vào blacklist .

Trong hướng dẫn này, ta sẽ giới thiệu cho các bạn cách kết nối dịch vụ Sendmail tích hợp của FreeBSD với SendGrid để gửi email từ server của bạn. Bạn cũng có thể điều chỉnh cài đặt cho một dịch vụ thư bên ngoài khác mà không gặp nhiều khó khăn.

Nếu bạn là người mới sử dụng FreeBSD, một số công việc ta làm có thể trông hơi đáng sợ, nhưng bạn sẽ sớm cảm thấy thoải mái khi xắn tay áo vào biên dịch lại một chút các công cụ hệ thống như FreeBSD chuyên nghiệp.

Bàn thắng

Trong hướng dẫn này, ta sẽ:

  • Biên dịch lại Sendmail với hỗ trợ SASL để server có thể xác thực với dịch vụ bên ngoài
  • Cấu hình server thư Sendmail với các cài đặt thích hợp
  • Kiểm tra email gửi đi đảm bảo rằng thư được gửi đi từ server của bạn

Yêu cầu

Trước khi bắt đầu hướng dẫn này, bạn cần những thứ sau:

  • A FreeBSD 10.1 server
  • Truy cập vào account gốc của bạn hoặc account có quyền sudo theo hướng dẫn này
  • Kiến thức làm việc về cách chỉnh sửa file văn bản từ dòng lệnh
  • Bạn nên cài đặt editor yêu thích của bạn , chẳng hạn như nano hoặc vim
  • Một account SendGrid miễn phí cho mục đích thử nghiệm hoặc một nhà cung cấp thư khác cung cấp cho bạn chi tiết SMTP cho dịch vụ. Bạn cần những chi tiết này cho nhà cung cấp thư bên ngoài của bạn :
    • Tên server SMTP
    • tên account
    • password
  • Tên server của server của bạn mà bạn có thể tìm thấy bằng cách chạy hostname

Hướng dẫn này dễ làm theo nhất là root :

sudo su 

Bước 1 - Cài đặt quản lý gói

Đầu tiên, ta cần biên dịch lại Sendmail để nó có thể xác thực với dịch vụ mail bên ngoài - trong trường hợp này là SendGrid.

Tất cả các bước được bao gồm ở đây, nhưng nếu muốn, bạn có thể làm theo hướng dẫn chính thức của FreeBSD .

Một số phần mềm sẽ được biên dịch từ Bộ sưu tập cổng của FreeBSD, vì vậy ta cần đảm bảo phần mềm đó được cập nhật trước.

portsnap fetch && portsnap update 

Tiện ích Portmaster sẽ cho phép ta dễ dàng biên dịch phần mềm từ cây Cổng, vì vậy hãy cài đặt nó.

pkg install portmaster 

Chạy lệnh sau đảm bảo hệ thống biết cài đặt các gói mới được biên dịch ở định dạng gói mới nhất cho FreeBSD.

echo 'WITH_PKGNG=yes' >> /etc/make.conf 

Bước 2 - Cài đặt và cấu hình gói SASL

Sử dụng trình Portmaster mới được cài đặt của ta , biên dịch và cài đặt gói cyrus-sasl2 bằng lệnh sau. Điều này được sử dụng để xác thực với dịch vụ thư bên ngoài.

portmaster security/cyrus-sasl2 

Khi được yêu cầu , hãy đảm bảo LOGIN được chọn, theo mặc định. Chọn OK và nhấn ENTER hai lần để chọn tất cả các giá trị mặc định. Khi được yêu cầu , hãy trả lời y để nâng cấp và cài đặt các gói của bạn. Bạn sẽ mong đợi một lượng lớn sản lượng, kết thúc bằng:

Output
===>>> Done displaying pkg-message files ===>>> The following actions were performed: Upgrade of pkg-1.4.12 to pkg-1.5.0 Upgrade of perl5-5.18.4_11 to perl5-5.18.4_13 Installation of security/cyrus-sasl2 (cyrus-sasl-2.1.26_9)

Chỉnh sửa file (tạo file nếu nó chưa tồn tại) /usr/local/lib/sasl2/Sendmail.conf và thêm thông tin sau vào file :

vim /usr/local/lib/sasl2/Sendmail.conf 
/usr/local/lib/sasl2/Sendmail.conf
pwcheck_method: saslauthd 

Tiếp theo, cài đặt dịch vụ saslauthd để xác thực SASL. Khi được yêu cầu , hãy chấp nhận các giá trị mặc định và chọn OK .

portmaster security/cyrus-sasl2-saslauthd 

Chỉnh sửa file cấu hình hệ thống /etc/rc.conf và thêm các thông số cấu hình sau vào cuối file . Thay thế your_hostname bằng tên server của server của bạn.

vim /etc/rc.conf 
/etc/rc.conf
hostname = "your_hostname" sendmail_enable="YES" saslauthd_enable="YES" 

Bây giờ bắt đầu dịch vụ saslauthd .

service saslauthd start 

Bạn sẽ thấy kết quả này:

Output
usage: hostname [-fs] [name-of-host] usage: hostname [-fs] [name-of-host] Starting saslauthd.

Chỉnh sửa file /etc/make.conf , thêm các tham số sau để hệ thống biết tùy chọn SASL Sendmail nào cần sử dụng.

vim /etc/make.conf 
/etc/make.conf
SENDMAIL_CFLAGS=-I/usr/local/include/sasl -DSASL SENDMAIL_LDFLAGS=-L/usr/local/lib SENDMAIL_LDADD=-lsasl2 

Bước 3 - Biên dịch lại Sendmail với Hỗ trợ SASL

Trong phần này, ta sẽ biên dịch lại Sendmail để sử dụng xác thực SASL.

Bây giờ ta cần đồng bộ mã nguồn mới nhất cho FreeBSD 10.1.

Đầu tiên, ta sẽ cài đặt Subversion để ta có thể dễ dàng lấy mã nguồn mà ta cần.

pkg install subversion 

Bây giờ ta có thể kiểm tra mã mới nhất để biên dịch lại, trực tiếp từ trang web của dự án FreeBSD, để cập nhật các nguồn của ta trong /usr/src .

svn co http://svn.freebsd.org/base/releng/10.1/ /usr/src 

Các lệnh tiếp theo bạn cần chạy liên tiếp, từng group một. Những gì ta đang làm ở đây là yêu cầu hệ thống biên dịch lại (hoặc xây dựng lại) các gói Sendmail được tích hợp sẵn với các yêu cầu đăng nhập và bảo mật mới của ta , sau đó cài đặt lại Sendmail.

cd /usr/src/lib/libsmutil make cleandir && make obj && make 
cd /usr/src/lib/libsm make cleandir && make obj && make 
cd /usr/src/usr.sbin/sendmail/ make cleandir && make obj && make && make install 

Bước 4 - Cấu hình Sendmail

Bạn đã tiến xa đến mức này và ta đã hoàn tất việc biên dịch lại mọi thứ. Cứ đi đi!

Đối với bước tiếp theo này, ta sẽ xem xét cấu hình Sendmail cơ bản sẽ yêu cầu Sendmail định tuyến tất cả thư đi thông qua dịch vụ lưu trữ thông minh bên ngoài đã chọn của ta .

Trước tiên, ta sẽ an toàn và tạo một bản backup của folder /etc/mail .

cp -a /etc/mail /etc/mail.bak 

Nhập folder cấu hình thư.

cd /etc/mail 

Chạy lệnh sau để tạo cấu hình thư cơ bản.

make 

Tạo và chỉnh sửa file relay-domains , thêm các tham số sau. Thay your_server.example.com bằng FQDN của bạn và example.com bằng domain của bạn.

vim /etc/mail/relay-domains 
/ etc / mail / relay-domains
your_server.example.com example.com 

Tạo và chỉnh sửa file local-host-names , thêm các thông số sau. Thay thế các biến bằng tên server local của bạn.

vim /etc/mail/local-host-names 
/ etc / mail / local-host-names
your_server your_server.example.com 

Tạo và chỉnh sửa file access , thêm các thông số sau. ( Lưu ý bạn cần thay đổi địa chỉ smtp.sendgrid.net nếu bạn đang sử dụng nhà cung cấp không phải SendGrid.)

vim /etc/mail/access 
/ etc / mail / access
smtp.sendgrid.net      OK GreetPause:localhost    0 

Tạo và chỉnh sửa file authinfo , thêm các thông số sau. Thay smtp_usernamesmtp_password bằng tên và password account SendGrid của bạn. Nếu bạn đã chọn sử dụng một nhà cung cấp thư bên ngoài khác, bạn cũng cần phải thay đổi giá trị smtp.sendgrid.net trên cả hai dòng thành địa chỉ server cho nhà cung cấp của bạn.

vim /etc/mail/authinfo 
/ etc / mail / authinfo
AuthInfo:smtp.sendgrid.net "U:root" "I:smtp_username" "P:smtp_password" "M:LOGIN" AuthInfo:smtp.sendgrid.net:587 "U:root" "I:smtp_username" "P:smtp_password" "M:LOGIN" 

Các file accessauthinfo thực sự sẽ là database đơn giản mà từ đó Sendmail đọc các thông số cấu hình. Điều này nghe có vẻ khó hiểu, đặc biệt nếu bạn mới sử dụng FreeBSD và Sendmail, nhưng bạn chỉ cần chạy hai lệnh đơn giản này từ /etc/mail/ để tạo database .

makemap hash access < access makemap hash authinfo < authinfo 

Bây giờ ta sẽ chỉnh sửa cấu hình cơ sở mà ta đã tạo ra một vài lệnh. Chỉnh sửa your_server .mc file . (Bạn có thể ls các /etc/mail/ folder nếu bạn không chắc chắn của tên file .)

vim /etc/mail/your_server.example.com.mc 

Chèn các dòng cấu hình sau vào giữa khối dnl define( SMART_HOST ', your.isp.mail.server')dnl Uncomment the first line to change the location of the default khối dnl Uncomment the first line to change the location of the default như hình dưới đây.

Bạn cần thay đổi địa chỉ smtp.sendgrid.net địa chỉ server của nhà cung cấp nếu bạn không sử dụng account SendGrid như trong ví dụ. Bạn cũng cần phải cập nhật hai trường hợp của example.com domain bạn muốn thư là từ. ( Lưu ý bạn có thể cần cài đặt các bản ghi TXT, DKIM, PTR, v.v. thích hợp để tránh báo cáo giả mạo.)

your_server.example.com.mc '> / etc / mail / your_server.example.com .mc
dnl define(`SMART_HOST', `your.isp.mail.server')  dnl SET OUTBOUND DOMAIN MASQUERADE_AS(`example.com') MASQUERADE_DOMAIN(example.com) FEATURE(masquerade_envelope) FEATURE(masquerade_entire_domain)  dnl SMART HOST CONFIG define(`SMART_HOST', `smtp.sendgrid.net')dnl define(`RELAY_MAILER_ARGS', `TCP $h 587')dnl define(`confAUTH_MECHANISMS', `GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl FEATURE(`authinfo',`hash /etc/mail/authinfo.db')dnl TRUST_AUTH_MECH(`GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl  dnl Uncomment the first line to change the location of the default 

Trước khi ta áp dụng các thay đổi, hãy xem qua một chút về cấu hình ở trên. Khối đầu tiên nói với Sendmail rằng ta muốn đảm bảo có vẻ như thư đi của ta đến từ domain example.com của ta .

Khối thứ hai là xác định nơi ta muốn lưu trữ thông minh thư của bạn , bao gồm cổng, phương pháp xác thực và thông tin xác thực mà ta đã cài đặt ở bước trước. Lưu ý ta đang tham chiếu đến file /etc/mail/authinfo.db .

Bây giờ, hãy áp dụng những thay đổi mà ta đã thực hiện. Đảm bảo rằng bạn vẫn ở trong folder /etc/mail/ . Đảm bảo rằng Sendmail được khởi động:

service sendmail start 

Cập nhật cấu hình của ta :

make make install restart 

Khởi động lại Sendmail:

service sendmail restart 

Cấu hình Sendmail của ta đã xong. Bước tiếp theo là gửi một email thử nghiệm.

Bước 5 - Gửi Email Kiểm tra

Bây giờ ta đã trải qua tất cả các bước để cài đặt đúng cách, hãy đảm bảo mọi thứ đang hoạt động.

Sử dụng lệnh mailx để gửi thư thử nghiệm đến account email thực mà bạn sử dụng hàng ngày.

mailx your_real_email_address@example.com 

Khi được yêu cầu , hãy nhập test hoặc bất kỳ điều gì bạn muốn cho một chủ đề, rồi nhấn ENTER .

Subject: test 

Sau đó, bạn sẽ được giới thiệu chỉ với một con trỏ và khả năng viết phần nội dung email thử nghiệm của bạn. Chỉ cần viết lại test từ đơn và nhấn ENTER lần nữa.

test 

Bạn cần nói với mailx rằng bạn đã viết xong tin nhắn của bạn ; để làm điều đó, ta phải kết thúc tin nhắn bằng một tin nhắn . và nhấn ENTER lần cuối. Bạn sẽ ngay lập tức thấy EOT xác nhận điều đó.

. EOT 

Tiếp theo, chạy lệnh sau để kiểm tra xem hàng đợi thư có trống không và thư của ta đã được gửi chưa.

mailq 

Đầu ra sẽ như thế này nếu thư thử nghiệm của ta đã được gửi thành công và bạn sẽ sớm thấy nó trong hộp thư đến của bạn .

/var/spool/mqueue is empty                 Total requests: 0 

Hãy kiểm tra email của bạn ngay bây giờ đảm bảo rằng tin nhắn đã đến. Nó phải là từ freebsd @ example.com .

Tin tưởng một cách mù quáng vào thực tế là hàng đợi thư trống không phải là một thử nghiệm hợp lệ về thành công. Ngay cả khi bạn đã nhận được thư, bạn cần biết những điều cơ bản trong việc xem log thư của bạn . Chạy lệnh sau.

tail -f /var/log/maillog 

Hai phím bạn đang tìm kiếm trong kết quả log là

  • Sent (<message id> Message accepted for delivery)
  • relay=smtp.sendgrid.net. [208.43.76.147], dsn=2.0.0, stat=Sent (Delivery in progress)

Đảm bảo rằng bạn có thể phát hiện ra những thông báo này trong kết quả log bên dưới.

Mail Log
Feb 11 04:09:13 your_server sm-mta[49080]: t1B49CW0049080: from=<freebsd@your_server>, size=331, class=0, nrcpts=1, msgid=<201502110409.t1B49CZ4049079@your_server>, proto=ESMTP, daemon=Daemon0, relay=localhost [127.0.0.1] Feb 11 04:09:13 your_server sendmail[49079]: t1B49CZ4049079: to=your_real_email_address@example.com, ctladdr=freebsd (1001/1001), delay=00:00:01, xdelay=00:00:01, mailer=relay, pri=30040, relay=[127.0.0.1] [127.0.0.1], dsn=2.0.0, stat=Sent (t1B49CW0049080 Message accepted for delivery) Feb 11 04:09:13 your_server sm-mta[49082]: STARTTLS=client, relay=smtp.sendgrid.net., version=TLSv1/SSLv3, verify=FAIL, cipher=AES128-GCM-SHA256, bits=128/128 Feb 11 04:09:13 your_server sm-mta[49082]: t1B49CW0049080: to=<your_real_email_address@example.com>, ctladdr=<freebsd@your_server> (1001/1001), delay=00:00:00, xdelay=00:00:00, mailer=relay, pri=30331, relay=smtp.sendgrid.net. [208.43.76.147], dsn=2.0.0, stat=Sent (Delivery in progress)

Điều này cho thấy rằng thư của bạn đã được chấp nhận và đang được gửi đến hộp thư đến của bạn, điều này có thể hơi phản cảm nếu bạn đã nhận được nó.

Để thực hiện kiểm tra trực tiếp và khắc phục sự cố, bạn có thể mở hai phiên terminal và để lệnh tail -f /var/log/maillog chạy trong một phiên, trong khi bạn gửi thông báo kiểm tra trong phiên còn lại.

Kết luận

Bây giờ, bạn đã sẵn sàng để bắt đầu gửi email đi từ FreeBSD Server của bạn qua SendGrid hoặc bất kỳ dịch vụ thư nào khác bạn muốn . Bất kỳ trang web hoặc ứng dụng web nào bạn triển khai bây giờ sẽ có thể tận dụng lợi thế này với cấu hình tối thiểu hoặc không.

Nếu bạn có câu hỏi hoặc ý kiến, xin vui lòng để lại bên dưới.


Tags:

Các tin liên quan