Trang chủWordPressKhắc phục lỗi Contact Form 7 không gửi được mail trên VPS...

Khắc phục lỗi Contact Form 7 không gửi được mail trên VPS AlmaLinux + DirectAdmin + Exim

Website WordPress dùng Contact Form 7 đang chạy ổn định bỗng nhiên hiển thị thông báo đỏ: “Có lỗi xảy ra trong quá trình gửi. Xin vui lòng thử lại hoặc liên hệ người quản trị website.” Người dùng điền form và bấm gửi nhưng không thành công, mặc dù trước đó form vẫn hoạt động bình thường.

Nhiều người vội nghĩ lỗi nằm ở plugin Contact Form 7, tiến hành cài lại hoặc gỡ bỏ nhưng vẫn không khắc phục được. Thực tế trên môi trường VPS AlmaLinux dùng DirectAdmin và Exim Mail Server, nguyên nhân thường nằm sâu hơn ở tầng mail server và cấu hình hệ thống, không phải ở plugin.

Môi trường gặp lỗi Contact Form 7 trên VPS

Tình huống lỗi này xuất hiện phổ biến trên cấu hình máy chủ ảo dùng các thành phần sau:

  • WordPress chạy plugin Contact Form 7
  • VPS hệ điều hành AlmaLinux
  • Control panel DirectAdmin quản trị
  • Exim làm Mail Server gửi nhận thư
  • Web server LiteSpeed hoặc OpenLiteSpeed

Triệu chứng ban đầu khá rõ ràng: Contact Form 7 báo lỗi đỏ khi gửi form, website không có plugin SMTP nào đang hoạt động, form trước đó vẫn chạy tốt, và dịch vụ Exim trên server bị lỗi. Đây là dấu hiệu cho thấy vấn đề nằm ở mail server chứ không phải mã nguồn website. Nếu bạn đang sử dụng dịch vụ hosting chất lượng cao được tối ưu sẵn, các lỗi cấu hình mail như thế này thường được quản trị viên hệ thống xử lý trước khi ảnh hưởng tới website.

Nguyên nhân thứ nhất: Exim lỗi cấu hình SRS

Bước đầu tiên là kiểm tra trạng thái dịch vụ Exim trên server để xác định mail server có đang hoạt động hay không:

systemctl status exim

Kết quả trả về cho thấy Exim không khởi động được do lỗi cấu hình:

Exim configuration error
main option "srs_config" unknown

Thông báo này cho biết tùy chọn SRS (Sender Rewriting Scheme) trong file cấu hình không tương thích với phiên bản Exim hiện tại. SRS là cơ chế viết lại địa chỉ người gửi khi forward mail, và một số bản cập nhật Exim đã thay đổi cú pháp khai báo tùy chọn này.

Kiểm tra và xử lý block SRS lỗi trong file cấu hình

Tiến hành tìm các dòng liên quan tới SRS trong file cấu hình chính của Exim:

grep -n "srs" /etc/exim.conf

Khi phát hiện block SRS không tương thích, hãy comment các dòng này lại trong cả hai file cấu hình:

/etc/exim.conf
/etc/exim.srs.conf

Sau khi đã vô hiệu hóa block SRS lỗi, khởi động lại dịch vụ Exim:

systemctl restart exim

Lúc này Exim hoạt động trở lại bình thường, trạng thái dịch vụ chuyển sang active:

Active: active (running)

Nguyên nhân thứ hai: sendmail symlink trỏ sai đích

Dù Exim đã chạy trở lại, Contact Form 7 vẫn tiếp tục báo lỗi khi gửi form. Điều này cho thấy còn một lớp nguyên nhân nữa nằm ở liên kết giữa PHP và chương trình gửi mail. Thử gửi một email kiểm tra trực tiếp từ dòng lệnh:

echo "test mail" | mail -s "test exim" your@gmail.com

Lệnh trả về lỗi không tìm thấy file sendmail:

/usr/sbin/sendmail: No such file or directory

Hàm mail() trong PHP mà Contact Form 7 sử dụng phụ thuộc vào đường dẫn /usr/sbin/sendmail. Nếu symlink này trỏ sai, mọi yêu cầu gửi mail từ website đều thất bại.

Kiểm tra symlink sendmail hiện tại

Xem chi tiết liên kết của file sendmail:

ls -lah /usr/sbin/sendmail

Kết quả cho thấy symlink đang trỏ tới một đích không hợp lệ:

/usr/sbin/sendmail -> /etc/exim

Đường dẫn /etc/exim là một thư mục chứ không phải chương trình thực thi exim, nên hàm mail() không thể chạy được.

Sửa symlink sendmail trỏ về exim đúng cách

Xóa symlink sai và tạo lại liên kết trỏ tới đúng file thực thi của Exim:

rm -f /usr/sbin/sendmail
ln -s /usr/sbin/exim /usr/sbin/sendmail

Kiểm tra lại để xác nhận symlink đã đúng:

ls -lah /usr/sbin/sendmail

Kết quả mong muốn:

/usr/sbin/sendmail -> /usr/sbin/exim

Kết quả sau khi sửa Exim và sendmail

Gửi lại email kiểm tra để xác minh mọi thứ đã hoạt động:

echo "test mail" | mail -s "test exim" your@gmail.com

Lệnh chạy không còn báo lỗi. Trên website, khi gửi form Contact Form 7 sẽ hiển thị thông báo thành công:

Xin cảm ơn, form đã được gửi thành công.

Đến đây phần lỗi cốt lõi khiến Contact Form 7 không gửi được mail đã được khắc phục hoàn toàn.

Vấn đề tiếp theo: Gmail từ chối nhận mail từ VPS

Sau khi mail server gửi được, một số email gửi tới Gmail có thể vẫn bị từ chối. Kiểm tra log Exim để xem chi tiết:

tail -50 /var/log/exim/mainlog

Trong log xuất hiện thông báo từ chối từ phía Gmail:

550-5.7.25 The IP address sending this message does not have a PTR record setup

Nguyên nhân là VPS thiếu bản ghi PTR (Reverse DNS), khiến Gmail từ chối nhận mail gửi trực tiếp từ địa chỉ IP server. Đây là cơ chế chống spam phổ biến của các nhà cung cấp email lớn, yêu cầu IP gửi mail phải có Reverse DNS hợp lệ và các bản ghi xác thực đầy đủ.

Cách 1: Dùng plugin SMTP kết nối dịch vụ email chuyên nghiệp

Đây là giải pháp được khuyên dùng vì đơn giản và độ tin cậy cao. Cài một trong các plugin SMTP cho WordPress:

  • FluentSMTP
  • WP Mail SMTP

Sau đó kết nối tới Gmail SMTP hoặc dịch vụ SMTP của nhà cung cấp email. Cách này giúp email được gửi qua hệ thống đã được xác thực sẵn, tránh hoàn toàn vấn đề thiếu PTR trên VPS.

Cách 2: Cấu hình đầy đủ bản ghi xác thực cho IP VPS

Nếu muốn gửi mail trực tiếp từ server, cần cấu hình đầy đủ các bản ghi sau cho IP của VPS:

  • PTR (Reverse DNS) trỏ về tên miền của server
  • SPF khai báo IP được phép gửi mail
  • DKIM ký xác thực nội dung email
  • DMARC chính sách xử lý mail không hợp lệ

Bản ghi PTR thường phải yêu cầu nhà cung cấp VPS thiết lập, còn SPF, DKIM và DMARC được khai báo trong vùng DNS của tên miền.

Kết luận về lỗi Contact Form 7 trên Exim

Lỗi Contact Form 7 báo “Có lỗi xảy ra trong quá trình gửi” trên môi trường VPS AlmaLinux dùng DirectAdmin và Exim thực chất không phải do plugin. Nguyên nhân thực tế gồm hai lớp chồng lên nhau.

Lớp thứ nhất là Exim bị lỗi cấu hình SRS khiến mail server không khởi động được. Lớp thứ hai là symlink /usr/sbin/sendmail trỏ sai đích nên hàm mail() trong PHP không thể gửi mail dù Exim đã chạy. Sau khi comment block SRS lỗi và sửa lại symlink sendmail, Contact Form 7 hoạt động trở lại bình thường. Nếu Gmail vẫn từ chối mail, cần bổ sung PTR cùng SPF, DKIM, DMARC hoặc chuyển sang gửi qua SMTP để đảm bảo email tới đích.

Câu hỏi thường gặp về lỗi Contact Form 7 và Exim

Tại sao Contact Form 7 báo lỗi gửi dù không đổi gì trên website?

Phần lớn trường hợp là do mail server phía sau gặp sự cố sau một bản cập nhật hệ thống. Trên VPS AlmaLinux dùng Exim, lỗi cấu hình SRS hoặc symlink sendmail sai có thể khiến hàm mail() ngừng hoạt động, dẫn tới Contact Form 7 báo lỗi dù mã nguồn website không thay đổi.

Lỗi “main option srs_config unknown” trên Exim khắc phục thế nào?

Lỗi này do tùy chọn SRS không tương thích với phiên bản Exim hiện tại. Dùng lệnh grep để tìm các dòng srs trong /etc/exim.conf, comment các block SRS lỗi trong /etc/exim.conf và /etc/exim.srs.conf, sau đó khởi động lại Exim bằng systemctl restart exim.

Symlink sendmail trỏ sai gây ảnh hưởng gì tới WordPress?

Hàm mail() trong PHP gọi tới /usr/sbin/sendmail để gửi email. Nếu symlink này trỏ tới thư mục thay vì file thực thi exim, mọi email gửi từ Contact Form 7 và các plugin WordPress khác đều thất bại. Sửa bằng cách tạo lại symlink trỏ tới /usr/sbin/exim.

Vì sao Gmail từ chối mail gửi từ VPS của tôi?

Gmail từ chối khi IP gửi mail thiếu bản ghi PTR (Reverse DNS), kèm theo thông báo lỗi 550-5.7.25. Đây là cơ chế chống spam yêu cầu IP server phải có Reverse DNS hợp lệ cùng các bản ghi SPF, DKIM, DMARC đầy đủ thì mail mới được chấp nhận.

Nên dùng plugin SMTP nào cho WordPress?

FluentSMTP và WP Mail SMTP là hai plugin SMTP phổ biến và đáng tin cậy. Cả hai cho phép kết nối tới Gmail SMTP hoặc dịch vụ SMTP của nhà cung cấp email, giúp email được gửi qua hệ thống đã xác thực sẵn và tránh vấn đề thiếu PTR trên VPS.

Dùng SMTP hay tự cấu hình PTR, SPF, DKIM, DMARC tốt hơn?

Với đa số website, dùng plugin SMTP kết nối dịch vụ email chuyên nghiệp là lựa chọn đơn giản và ổn định nhất. Tự cấu hình đầy đủ PTR cùng SPF, DKIM, DMARC cho IP VPS phù hợp khi bạn cần gửi mail số lượng lớn trực tiếp từ server và có khả năng quản trị hệ thống.

Bài viết mới

spot_img

Có thể bạn quan tâm

spot_img