Hướng dẫn php send email not working - php gửi email không hoạt động

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.

Show

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ề

$headers = array("From ", // missing colon
    "Reply To: ",      // missing hyphen
    "X-Mailer: "PHP"/" . PHP_VERSION      // bad quotes
);
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.

Đ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ề
    $headers = array("From ", // missing colon
        "Reply To: ",      // missing hyphen
        "X-Mailer: "PHP"/" . PHP_VERSION      // bad quotes
    );
    
    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.
  • Nếu bạn nhận được giá trị trả về
    $headers = array("From ", // missing colon
        "Reply To: ",      // missing hyphen
        "X-Mailer: "PHP"/" . PHP_VERSION      // bad quotes
    );
    
    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.

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ụ:
    $headers = array("From ", // missing colon
        "Reply To: ",      // missing hyphen
        "X-Mailer: "PHP"/" . PHP_VERSION      // bad quotes
    );
    
    7).
  • Giám sát các tài khoản lạm dụng của bạn, chẳng hạn như
    $headers = array("From ", // missing colon
        "Reply To: ",      // missing hyphen
        "X-Mailer: "PHP"/" . PHP_VERSION      // bad quotes
    );
    
    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.
  • 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

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

Đả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

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

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 http://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: http://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. .

Tại sao thư PHP không gửi đi?

Vì vậy, Captain Rõ ràng với Cứu hộ, những lý do thông thường đằng sau lý do tại sao thư PHP không gửi ra là một trong những điều sau đây: Không có máy chủ SMTP nào được cài đặt, không có cách nào để PHP hoặc máy chủ gửi email. Máy chủ SMTP có thể được cài đặt nhưng không được cấu hình đúng. Tường lửa hoặc chống vi-rút đang chặn gửi thư.

Làm cách nào để gửi email trong PHP mà không có máy chủ?

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.

Làm thế nào để gửi email văn bản đơn giản trong PHP?

Gửi email văn bản đơn giản. PHP sử dụng hàm mail () để gửi email. Hàm này yêu cầu ba đối số bắt buộc chỉ định địa chỉ email của người nhận, chủ đề của tin nhắn và tin nhắn thực tế cũng có hai tham số tùy chọn khác.

Tại sao tôi có thể gửi email thông qua lưu trữ web của mình?

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.

Tại sao thư của tôi không gửi trong PHP?

Ví dụ, nó có thể là thiếu các tham số cần thiết, có lỗi chính tả trong địa chỉ email của người nhận hoặc cần thiết lập rơle SMTP. Trong tất cả các tùy chọn có thể là lý do tại sao thư PHP của bạn () không gửi email, chúng tôi thấy rằng hầu hết các vấn đề xuất phát từ postfix được cấu hình không chính xác.you're missing necessary parameters, have typos in your recipient's email address, or need to set up an SMTP relay. Out of all the possible options as to why your PHP mail() isn't sending email, we found that most issues stem from Postfix being configured incorrectly.

Làm thế nào để bạn kiểm tra php mail () đang hoạt động?

Để kiểm tra xem nó có gửi thư như dự định không;if($sendMail) { echo "Email Sent Successfully"; } else { echo "Mail Failed"; } ?>

Làm cách nào để kích hoạt email PHP?

PHP.Tệp INI là nơi bạn định cấu hình cài đặt PHP của mình.Đây là tệp bạn cần chỉnh sửa để định cấu hình PHP để gửi thư ...
Mở PHP của bạn.....
Tìm kiếm dòng đọc [hàm thư].
Thêm/thay đổi chi tiết của máy chủ thư của bạn.....
Lưu/đóng PHP.....
Khởi động lại máy chủ web của bạn ..

Thư PHP có yêu cầu SMTP không?

Khi bạn sử dụng chức năng thư PHP, bạn sẽ gửi email trực tiếp từ máy chủ web của mình.Điều này có thể gây ra các vấn đề nếu địa chỉ từ không được đặt đúng hoặc nếu email của bạn không được lưu trữ với Dreamhost.Gửi thư qua SMTP được khuyến nghị vì email được gửi từ máy chủ thư thay vì máy chủ web.Sending mail via SMTP is recommended as email is sent from the mail server rather than the web server.