Mặc dù có những phần của câu trả lời này chỉ áp dụng cho việc sử dụng chính chức năng ____, nhưng nhiều bước khắc phục sự cố này có thể được áp dụng cho bất kỳ hệ thống gửi thư PHP nào.
Có nhiều lý do khiến tập lệnh của bạn dường như không gửi email. Thật khó để chẩn đoán những điều này trừ khi có lỗi cú pháp rõ ràng. Không có ai bạn cần chạy qua danh sách kiểm tra dưới đây để tìm thấy bất kỳ cạm bẫy tiềm năng nào bạn có thể gặp phải.
Đảm bảo báo cáo lỗi được bật và đặt để báo cáo tất cả các lỗi
Báo cáo lỗi là điều cần thiết để root các lỗi trong mã của bạn và các lỗi chung mà PHP gặp phải. Báo cáo lỗi cần được bật để nhận các lỗi này. Đặt mã sau ở đầu các tệp PHP của bạn [hoặc trong tệp cấu hình chính] sẽ cho phép báo cáo lỗi.
error_reporting[-1];
ini_set['display_errors', 'On'];
set_error_handler["var_dump"];
Xem làm thế nào tôi có thể nhận được thông báo lỗi hữu ích trong PHP? - Câu trả lời này để biết thêm chi tiết về điều này.
Đảm bảo hàm mail[]
được gọi
Nó có vẻ ngớ ngẩn nhưng một lỗi phổ biến là quên thực sự đặt hàm mail[]
trong mã của bạn. Hãy chắc chắn rằng nó ở đó và không nhận xét.
Đảm bảo hàm mail[]
được gọi là chính xác
Bool mail [chuỗi $ đến, chuỗi $ chủ đề, chuỗi $ message [, chuỗi $ bổ sung_headers [, chuỗi $ bổ sung_parameter]]]]
Hàm thư có ba tham số cần thiết và tùy chọn là một tham số thứ tư và thứ năm. Nếu cuộc gọi của bạn đến mail[]
không có ít nhất ba tham số thì nó sẽ thất bại.
Nếu cuộc gọi của bạn đến mail[]
không có các tham số chính xác theo đúng thứ tự, nó cũng sẽ thất bại.
Kiểm tra nhật ký thư của máy chủ
Máy chủ web của bạn nên đăng nhập tất cả các nỗ lực để gửi email qua nó. Vị trí của các nhật ký này sẽ khác nhau [bạn có thể cần hỏi quản trị viên máy chủ của mình ở vị trí của chúng] nhưng chúng thường có thể được tìm thấy trong thư mục gốc của người dùng theo
$headers = array["From: ",
"Reply-To: ",
"X-Mailer: PHP/" . PHP_VERSION
];
$headers = implode["\r\n", $headers];
mail[$to, $subject, $message, $headers];
4. Bên trong sẽ là thông báo lỗi mà máy chủ báo cáo, nếu có, liên quan đến nỗ lực gửi email của bạn.Kiểm tra lỗi kết nối cổng
Block cổng là một vấn đề rất phổ biến mà hầu hết các nhà phát triển phải đối mặt trong khi tích hợp mã của họ để cung cấp email bằng SMTP. Và, điều này có thể dễ dàng truy tìm tại các maillog của máy chủ [vị trí của máy chủ của nhật ký thư có thể thay đổi từ máy chủ này sang máy chủ khác, như đã giải thích ở trên]. Trong trường hợp bạn đang ở trên một máy chủ lưu trữ được chia sẻ, các cổng 25 và 587 vẫn bị chặn theo mặc định. Khối này được thực hiện một cách có chủ đích bởi nhà cung cấp dịch vụ lưu trữ của bạn. Điều này đúng ngay cả đối với một số máy chủ chuyên dụng. Khi các cổng này bị chặn, hãy thử kết nối bằng cổng 2525. Nếu bạn thấy cổng đó cũng bị chặn, thì giải pháp duy nhất là liên hệ với nhà cung cấp lưu trữ của bạn để bỏ chặn các cổng này.
Hầu hết các nhà cung cấp lưu trữ chặn các cổng email này để bảo vệ mạng của họ không gửi bất kỳ email spam nào.
Sử dụng các cổng 25 hoặc 587 cho các kết nối đơn giản/TLS và cổng 465 cho các kết nối SSL. Đối với hầu hết người dùng, đề xuất sử dụng cổng 587 để tránh các giới hạn tốc độ được đặt ra bởi một số nhà cung cấp lưu trữ.
Không sử dụng toán tử triệt tiêu lỗi
Khi toán tử triệt tiêu lỗi
$headers = array["From: ",
"Reply-To: ",
"X-Mailer: PHP/" . PHP_VERSION
];
$headers = implode["\r\n", $headers];
mail[$to, $subject, $message, $headers];
5 được chuẩn bị cho một biểu thức trong PHP, bất kỳ thông báo lỗi nào có thể được tạo bởi biểu thức đó sẽ bị bỏ qua. Có những trường hợp sử dụng nhà điều hành này là cần thiết nhưng gửi thư không phải là một trong số họ.Nếu mã của bạn chứa
$headers = array["From: ",
"Reply-To: ",
"X-Mailer: PHP/" . PHP_VERSION
];
$headers = implode["\r\n", $headers];
mail[$to, $subject, $message, $headers];
6 thì bạn có thể ẩn các thông báo lỗi quan trọng sẽ giúp bạn gỡ lỗi điều này. Xóa $headers = array["From: ",
"Reply-To: ",
"X-Mailer: PHP/" . PHP_VERSION
];
$headers = implode["\r\n", $headers];
mail[$to, $subject, $message, $headers];
5 và xem có bất kỳ lỗi nào được báo cáo không.Chỉ nên sử dụng khi bạn kiểm tra với
$headers = array["From: ",
"Reply-To: ",
"X-Mailer: PHP/" . PHP_VERSION
];
$headers = implode["\r\n", $headers];
mail[$to, $subject, $message, $headers];
8 ngay sau đó cho các lỗi cụ thể.Kiểm tra giá trị trả về mail[]
Hàm mail[]
:
Trả về
1 Nếu thư được chấp nhận thành công để giao hàng,$headers = array["From ", // missing colon "Reply To: ", // missing hyphen "X-Mailer: "PHP"/" . PHP_VERSION // bad quotes ];
2 khác. Điều quan trọng cần lưu ý là chỉ vì thư được chấp nhận để giao hàng, điều đó không có nghĩa là thư sẽ thực sự đến đích dự định.$headers = array["From ", // missing colon "Reply To: ", // missing hyphen "X-Mailer: "PHP"/" . PHP_VERSION // bad quotes ];
Điều này rất quan trọng cần lưu ý bởi vì:
- Nếu bạn nhận được giá trị trả về
2, bạn sẽ biết lỗi nằm ở máy chủ của bạn chấp nhận thư của bạn. Đây có lẽ không phải là vấn đề mã hóa mà là vấn đề cấu hình máy chủ. Bạn cần nói chuyện với quản trị viên hệ thống của bạn để tìm hiểu lý do tại sao điều này xảy ra.$headers = array["From ", // missing colon "Reply To: ", // missing hyphen "X-Mailer: "PHP"/" . PHP_VERSION // bad quotes ];
- Nếu bạn nhận được giá trị trả về
1, điều đó không có nghĩa là email của bạn chắc chắn sẽ được gửi. Điều đó chỉ có nghĩa là email đã được gửi đến trình xử lý tương ứng trên máy chủ bởi PHP thành công. Vẫn còn nhiều điểm thất bại ngoài tầm kiểm soát của PHP có thể khiến email không được gửi.$headers = array["From ", // missing colon "Reply To: ", // missing hyphen "X-Mailer: "PHP"/" . PHP_VERSION // bad quotes ];
Vì vậy,
$headers = array["From ", // missing colon
"Reply To: ", // missing hyphen
"X-Mailer: "PHP"/" . PHP_VERSION // bad quotes
];
2 sẽ giúp bạn đi đúng hướng trong khi $headers = array["From ", // missing colon
"Reply To: ", // missing hyphen
"X-Mailer: "PHP"/" . PHP_VERSION // bad quotes
];
1 không nhất thiết có nghĩa là email của bạn đã được gửi thành công. Điều này rất quan trọng cần lưu ý!Đảm bảo nhà cung cấp dịch vụ lưu trữ của bạn cho phép bạn gửi email và không giới hạn gửi thư
Nhiều webhost được chia sẻ, đặc biệt là các nhà cung cấp webhosting miễn phí, hoặc không cho phép email được gửi từ máy chủ của họ hoặc giới hạn số tiền có thể được gửi trong bất kỳ khoảng thời gian nào. Điều này là do những nỗ lực của họ để hạn chế những kẻ gửi thư rác khỏi lợi dụng các dịch vụ rẻ hơn của họ.
Nếu bạn nghĩ rằng máy chủ của bạn có giới hạn gửi email hoặc chặn việc gửi email, hãy kiểm tra Câu hỏi thường gặp của họ để xem họ có liệt kê bất kỳ giới hạn nào như vậy không. Nếu không, bạn có thể cần liên hệ với hỗ trợ của họ để xác minh xem có bất kỳ hạn chế nào xung quanh việc gửi email.
Kiểm tra thư mục thư rác; Ngăn chặn email bị gắn cờ là thư rác
Thông thường, vì nhiều lý do, các email được gửi qua PHP [và các ngôn ngữ lập trình phía máy chủ khác] kết thúc trong thư mục thư rác của người nhận. Luôn kiểm tra ở đó trước khi khắc phục sự cố mã của bạn.
Để tránh thư được gửi qua PHP được gửi đến thư mục spam của người nhận, có nhiều điều bạn có thể làm, cả trong mã PHP của bạn và nếu không, để giảm thiểu khả năng email của bạn được đánh dấu là thư rác. Lời khuyên tốt từ Michiel de Mare bao gồm:
- Sử dụng các phương thức xác thực email, chẳng hạn như SPF và DKIM để chứng minh rằng email và tên miền của bạn thuộc về nhau và để tránh giả mạo tên miền của bạn. Trang web SPF bao gồm một trình hướng dẫn để tạo thông tin DNS cho trang web của bạn.
- Kiểm tra DNS ngược của bạn để đảm bảo địa chỉ IP của máy chủ thư của bạn chỉ vào tên miền mà bạn sử dụng để gửi thư.
- Đảm bảo rằng địa chỉ IP mà bạn đang sử dụng không có trong danh sách đen
- Đảm bảo rằng địa chỉ trả lời là một địa chỉ hiện có, hợp lệ.
- Sử dụng tên thực tế đầy đủ của người nhận trong trường, không chỉ là địa chỉ email [ví dụ:
7].$headers = array["From ", // missing colon "Reply To: ", // missing hyphen "X-Mailer: "PHP"/" . PHP_VERSION // bad quotes ];
- Giám sát các tài khoản lạm dụng của bạn, chẳng hạn như
8 và$headers = array["From ", // missing colon "Reply To: ", // missing hyphen "X-Mailer: "PHP"/" . PHP_VERSION // bad quotes ];
8. Điều đó có nghĩa là - đảm bảo rằng các tài khoản này tồn tại, đọc những gì được gửi cho họ và hành động theo khiếu nại.$headers = array["From ", // missing colon "Reply To: ", // missing hyphen "X-Mailer: "PHP"/" . PHP_VERSION // bad quotes ];
- Cuối cùng, làm cho nó thực sự dễ dàng để hủy đăng ký. Nếu không, người dùng của bạn sẽ hủy đăng ký bằng cách nhấn nút SPAM và điều đó sẽ ảnh hưởng đến danh tiếng của bạn.really easy to unsubscribe. Otherwise, your users will unsubscribe by pressing the spam button, and that will affect your reputation.
Xem làm thế nào để bạn chắc chắn rằng email bạn gửi theo chương trình không tự động được đánh dấu là thư rác? Để biết thêm về chủ đề này.
Đảm bảo tất cả các tiêu đề thư được cung cấp
Một số phần mềm spam sẽ từ chối thư nếu thiếu các tiêu đề phổ biến như "từ" và "Trả lời":
$headers = array["From: ",
"Reply-To: ",
"X-Mailer: PHP/" . PHP_VERSION
];
$headers = implode["\r\n", $headers];
mail[$to, $subject, $message, $headers];
Đảm bảo tiêu đề thư không có lỗi cú pháp
Tiêu đề không hợp lệ cũng tệ như không có tiêu đề. Một ký tự không chính xác có thể là tất cả những gì cần thiết để làm hỏng email của bạn. Kiểm tra kỹ để đảm bảo cú pháp của bạn là chính xác vì PHP sẽ không bắt được các lỗi này cho bạn.
$headers = array["From ", // missing colon
"Reply To: ", // missing hyphen
"X-Mailer: "PHP"/" . PHP_VERSION // bad quotes
];
Không sử dụng người gửi giả $headers = array["From: $_POST[contactform_sender_email]"]; // No!
0
$headers = array["From: $_POST[contactform_sender_email]"]; // No!
Mặc dù thư phải có từ: người gửi, bạn có thể không chỉ sử dụng bất kỳ giá trị nào. Cụ thể là địa chỉ người gửi do người dùng cung cấp là một cách chắc chắn để chặn thư:
$headers = array["From: $_POST[contactform_sender_email]"]; // No!
Lý do: Web hoặc gửi máy chủ thư của bạn không phải là SPF/DKIM-Whitelisted để giả vờ chịu trách nhiệm về địa chỉ @hotmail hoặc @Gmail. Nó thậm chí có thể âm thầm bỏ thư với các miền người gửi
$headers = array["From: $_POST[contactform_sender_email]"]; // No!
0 mà nó không được cấu hình.Đảm bảo giá trị người nhận là chính xác
Đôi khi vấn đề đơn giản như có giá trị không chính xác cho người nhận email. Điều này có thể là do sử dụng một biến không chính xác.
$to = '';
// other variables ....
mail[$recipient, $subject, $message, $headers]; // $recipient should be $to
Một cách khác để kiểm tra điều này là mã cứng giá trị người nhận vào lệnh gọi hàm mail[]
:
mail['', $subject, $message, $headers];
Điều này có thể áp dụng cho tất cả các tham số mail[]
.
Gửi đến nhiều tài khoản
Để giúp loại trừ các sự cố tài khoản email, hãy gửi email của bạn đến nhiều tài khoản email tại các nhà cung cấp email khác nhau. Nếu email của bạn không đến tài khoản Gmail của người dùng, hãy gửi cùng một email vào tài khoản Yahoo, tài khoản Hotmail và tài khoản POP3 thông thường [như tài khoản email do ISP cung cấp của bạn].
Nếu các email đến tất cả hoặc một số tài khoản email khác, bạn biết mã của bạn đang gửi email nhưng có khả năng nhà cung cấp tài khoản email đang chặn chúng vì một số lý do. Nếu email không đến bất kỳ tài khoản email nào, vấn đề có nhiều khả năng liên quan đến mã của bạn.
Đảm bảo mã khớp với phương thức biểu mẫu
Nếu bạn đã đặt phương thức biểu mẫu của mình thành
$headers = array["From: $_POST[contactform_sender_email]"]; // No!
4, hãy đảm bảo bạn đang sử dụng $headers = array["From: $_POST[contactform_sender_email]"]; // No!
5 để tìm kiếm các giá trị biểu mẫu của mình. Nếu bạn đã đặt nó thành $headers = array["From: $_POST[contactform_sender_email]"]; // No!
6 hoặc hoàn toàn không đặt nó, hãy đảm bảo bạn sử dụng $headers = array["From: $_POST[contactform_sender_email]"]; // No!
7 để tìm kiếm các giá trị biểu mẫu của mình.Đảm bảo biểu mẫu của bạn $headers = array["From: $_POST[contactform_sender_email]"]; // No!
8 giá trị điểm đến vị trí chính xác
$headers = array["From: $_POST[contactform_sender_email]"]; // No!
Đảm bảo thuộc tính
$headers = array["From: $_POST[contactform_sender_email]"]; // No!
8 của bạn chứa một giá trị trỏ đến mã gửi thư PHP của bạn.
Đảm bảo máy chủ web hỗ trợ gửi email
Một số nhà cung cấp lưu trữ web không cho phép hoặc cho phép gửi email qua máy chủ của họ. Những lý do cho điều này có thể thay đổi nhưng nếu họ đã vô hiệu hóa việc gửi thư, bạn sẽ cần sử dụng một phương pháp thay thế sử dụng bên thứ ba để gửi các email đó cho bạn.
Một email đến hỗ trợ kỹ thuật của họ [sau chuyến đi đến hỗ trợ trực tuyến hoặc Câu hỏi thường gặp của họ] sẽ làm rõ nếu khả năng email có sẵn trên máy chủ của bạn.
Đảm bảo máy chủ thư $to = '';
// other variables ....
mail[$recipient, $subject, $message, $headers]; // $recipient should be $to
0 được cấu hình
$to = '';
// other variables ....
mail[$recipient, $subject, $message, $headers]; // $recipient should be $to
Nếu bạn đang phát triển trên máy trạm địa phương bằng WAMP, MAMP hoặc XAMPP, một máy chủ email có thể không được cài đặt trên máy trạm của bạn. Không có một, PHP không thể gửi thư theo mặc định.
Bạn có thể khắc phục điều này bằng cách cài đặt một máy chủ thư cơ bản. Đối với Windows, bạn có thể sử dụng Mercury Mail miễn phí.
Bạn cũng có thể sử dụng SMTP để gửi email của bạn. Xem câu trả lời tuyệt vời này từ Vikas Dwivingi để tìm hiểu cách làm điều này.
Bật tùy chỉnh của PHP $to = '';
// other variables ....
mail[$recipient, $subject, $message, $headers]; // $recipient should be $to
1
$to = '';
// other variables ....
mail[$recipient, $subject, $message, $headers]; // $recipient should be $to
Ngoài tệp nhật ký của MTA và PHP của bạn, bạn có thể bật ghi nhật ký cho chức năng mail[]
cụ thể. Nó không ghi lại tương tác SMTP hoàn chỉnh, nhưng ít nhất các tham số cuộc gọi chức năng và tập lệnh gọi.
ini_set["mail.log", "/tmp/mail.log"];
ini_set["mail.add_x_header", TRUE];
Xem //php.net/manual/en/mail.configuration.php để biết chi tiết. [Tốt nhất là kích hoạt các tùy chọn này trong
$to = '';
// other variables ....
mail[$recipient, $subject, $message, $headers]; // $recipient should be $to
3 hoặc $to = '';
// other variables ....
mail[$recipient, $subject, $message, $headers]; // $recipient should be $to
4 hoặc $to = '';
// other variables ....
mail[$recipient, $subject, $message, $headers]; // $recipient should be $to
5 có lẽ.]Kiểm tra với dịch vụ kiểm tra thư
Có nhiều dịch vụ kiểm tra giao hàng và spam khác nhau mà bạn có thể sử dụng để kiểm tra thiết lập MTA/WebServer của mình. Thông thường, bạn gửi một đầu dò thư đến: địa chỉ của họ, sau đó nhận báo cáo giao hàng và nhiều lỗi hoặc phân tích cụ thể hơn sau:
- mail-toester.example [miễn phí/đơn giản]
- glockapps.com [miễn phí/$$$]
- senforensics.com [đăng ký/$$$]
- mailtrap.io [pro/$$$]
- Ultratools/xông/EmailTest [chỉ kiểm tra miễn phí/MX]
- Khác nhau: //www.verticalresponse.com/blog/7-email-testing-delivery-tools/
Sử dụng một người gửi thư khác
Chức năng mail[]
tích hợp của PHP rất tiện dụng và thường hoàn thành công việc nhưng nó có những thiếu sót. May mắn thay, có những lựa chọn thay thế cung cấp nhiều sức mạnh và tính linh hoạt hơn bao gồm cả việc xử lý nhiều vấn đề được nêu ở trên:
- Phổ biến nhất: PHPMailer
- Tương tự như vậy tính năng: Swiftmailer
- Hoặc thậm chí là lê cũ hơn :: mail.
Tất cả đều có thể được kết hợp với một nhà cung cấp dịch vụ/máy chủ SMTP chuyên nghiệp. .