Khi biểu mẫu liên hệ nói “Cảm ơn” nhưng không có e-mail nào đến
Biểu mẫu liên hệ có thể hỏng mà không ai thấy lỗi: khách nhận xác nhận thân thiện, còn bạn không nhận gì. Vì sao xảy ra và cách nhận ra kịp thời.
Hãy hình dung một phòng khám vật lý trị liệu nhỏ. Website có biểu mẫu liên hệ và biểu mẫu hoạt động — ít nhất có vẻ như vậy. Khách điền, nhấp “Gửi” và thấy lời thân thiện “Cảm ơn, chúng tôi sẽ sớm liên hệ lại”. Điều không ai thấy là tin nhắn đã ngừng tới hộp thư của phòng khám từ trước đó. Không có lỗi, không có thư báo trả lại trong hộp thư của ai, không đèn đỏ ở đâu cả. Biểu mẫu âm thầm hỏng.
Vì sao không ai nhận ra
Trang “Cảm ơn” của biểu mẫu thường chỉ có nghĩa là website đã chuyển tin nhắn đi. Máy chủ e-mail có chấp nhận, xếp vào thư rác hay từ chối dọc đường hay không xảy ra sau đó, ngoài tầm nhìn của biểu mẫu. Chẳng hạn hàm mail() của PHP báo thành công ngay khi hệ thống cục bộ nhận tin nhắn để chuyển đi — không phải khi thư đến người nhận. Vì thế khách nhận xác nhận rồi tiếp tục việc khác. Trong khi đó, chủ website thấy hộp thư trống và cho rằng chỉ là tháng ít khách. Ít yêu cầu hơn hiếm khi tự gây báo động: kỳ nghỉ, thời tiết, kinh tế — luôn có lời giải thích nghe hợp lý hơn “biểu mẫu bị hỏng”.
- Ngày 0Cập nhật tiện ích thường lệ chạy qua đêm. Website trông hệt như trước.
- Ngày 1Tin nhắn cuối cùng đến. Không ai biết đó là tin nhắn cuối.
- Ngày 2–13Khách vẫn gửi biểu mẫu và vẫn thấy “Cảm ơn”. Không có gì tới hộp thư đến.
- Ngày 14Có người gọi và hơi khó chịu hỏi vì sao chưa ai trả lời yêu cầu của họ.
- Ngày 15Nguyên nhân được tìm ra trong vòng một giờ. Tin nhắn của hai tuần đó đã mất — trừ khi biểu mẫu còn giữ một bản sao.
Những nguyên nhân thường gặp
- Mật khẩu SMTP hoặc nhà cung cấp e-mail đã đổi. Biểu mẫu vẫn đăng nhập bằng thông tin cũ và máy chủ e-mail từ chối — âm thầm theo những gì khách có thể nhận biết.
- mail() của PHP không có xác thực. Máy chủ web gửi thư trực tiếp, không đăng nhập máy chủ e-mail đúng nghĩa. Nhiều máy chủ nhận xem thư đó là đáng ngờ: thư vào mục thư rác hoặc bị từ chối hoàn toàn.
- SPF, DKIM và DMARC không khớp. Nhiều biểu mẫu đặt địa chỉ khách vào trường From. Tin nhắn khi đó tự nhận đến từ, chẳng hạn, địa chỉ gmail.com nhưng lại do máy chủ web của bạn gửi — đúng điều DMARC được thiết kế để ngăn.
- Cập nhật tiện ích hoặc đổi giao diện làm hỏng biểu mẫu hay CAPTCHA. Mẫu trang thay đổi làm mất trường, tập lệnh không tải nữa hoặc widget CAPTCHA hiện ra thiếu tập lệnh — và mọi lần gửi đều không qua kiểm tra tính hợp lệ.
- Hộp thư nhận đã đầy. Máy chủ e-mail từ chối tin nhắn mới và thông báo trả lại đi tới địa chỉ không ai đọc.
- Biểu ngữ cookie chặn tập lệnh biểu mẫu. Nếu công cụ đồng ý phân loại CAPTCHA hoặc tập lệnh biểu mẫu là “tiếp thị”, khách từ chối cookie có thể gặp biểu mẫu không gửi được hoặc lần gửi bị từ chối vì thiếu token.
- Chứng chỉ TLS hoặc tên miền hết hạn. Khách thấy cảnh báo trình duyệt rồi rời đi, hoặc không thể truy cập máy chủ e-mail an toàn nữa. Nếu tên miền của hộp thư nhận hết hạn, thư tới đó đơn giản ngừng lại.
- Lớp bộ nhớ đệm cung cấp trang cũ. Bộ nhớ đệm toàn trang có thể đưa ra biểu mẫu chứa token bảo mật hết hạn (nonce hoặc token CSRF). Máy chủ từ chối lần gửi và tùy cấu hình, khách không thấy lỗi rõ ràng.
Cạm bẫy của địa chỉ From
Nguyên nhân thứ ba đáng xem kỹ vì nhiều cấu hình biểu mẫu có sẵn lỗi này theo mặc định. DMARC kiểm tra tên miền trong địa chỉ From hiển thị có khớp tên miền được SPF hoặc DKIM xác nhận hay không. Nếu biểu mẫu gửi tin nhắn “từ” địa chỉ khách, máy chủ của bạn không được phép gửi thay tên miền đó nên kiểm tra thất bại. Tùy chính sách DMARC của tên miền khách và nhà cung cấp e-mail của bạn, thư vào mục thư rác hoặc bị từ chối. Cách sửa đơn giản: gửi từ địa chỉ thuộc tên miền của bạn và đặt địa chỉ khách trong Reply-To. Nhấp “Trả lời” vẫn liên hệ được với khách.
- From: địa chỉ của khách truy cập
- Không có Reply-To
- mail() của PHP trực tiếp từ máy chủ web
- Không có SPF, DKIM hay DMARC cho tên miền gửi
- Tin nhắn chỉ tồn tại dưới dạng e-mail
- From: địa chỉ thuộc tên miền của bạn, ví dụ form@yourdomain
- Reply-To: địa chỉ của khách truy cập
- SMTP có xác thực hoặc dịch vụ gửi thư
- SPF, DKIM và DMARC được cấu hình và khớp nhau
- Một bản sao còn được lưu trong cơ sở dữ liệu
Việc cần làm
- 1Định kỳ gửi tin nhắn thử qua biểu mẫu của bạn — ít nhất hằng tháng và luôn sau cập nhật, đổi giao diện hoặc thay đổi cài đặt e-mail. Đánh dấu rõ là thử nghiệm để không ai trả lời.
- 2Nắm nhịp bình thường. Nếu biểu mẫu thường đem lại vài tin nhắn mỗi tuần, hai tuần im lặng là lý do để kiểm tra, không phải một tháng ít khách.
- 3Gửi qua SMTP có xác thực — thông qua nhà cung cấp e-mail hoặc dịch vụ gửi chuyên dụng — thay vì dựa vào mail() của PHP.
- 4Dùng tên miền của bạn trong From và địa chỉ khách trong Reply-To. Sau đó cấu hình SPF, DKIM và DMARC cho tên miền ấy để thư vượt qua kiểm tra.
- 5Giữ bản sao mỗi lần gửi trong cơ sở dữ liệu. Nhiều tiện ích biểu mẫu có chức năng này, đôi khi dưới dạng tiện ích bổ sung. Nếu e-mail hỏng, yêu cầu vẫn còn.
- 6Kiểm tra biểu mẫu sau mỗi lần cập nhật tiện ích — kể cả CAPTCHA và cả khi đã từ chối cookie.
Những kiểm tra này dễ bị quên, vì thế đáng để tự động hóa. Với tài khoản và tên miền đã xác minh, formexposed có thể gửi nội dung thử được đánh dấu rõ và kiểm tra có thực sự tới nơi không (kiểm tra giao thư, chỉ khi chủ động kích hoạt). Nó còn phát hiện im lặng — biểu mẫu vốn thường nhận tin nhắn đột nhiên không nhận gì — và kiểm tra SPF, DKIM, DMARC của e-mail thông báo cũng như thời hạn chứng chỉ TLS và tên miền. Bạn chỉ nhận cảnh báo khi có thay đổi.
Nếu chỉ muốn xem sơ bộ, kiểm tra miễn phí trên formexposed.com không cần tài khoản và không gửi gì. Trong số các thông tin khác, nó cho biết CAPTCHA có mặt nhưng hỏng hay không — widget thiếu tập lệnh, khóa thử nghiệm công khai, lỗi trình duyệt — một trong những cách biểu mẫu âm thầm ngừng hoạt động. Chỉ tin nhắn thử thật mới xác nhận thư có đến hay không, nên hãy gửi thử ngay hôm nay.