2011-06-19 39 views
20

Tôi muốn viết một mẫu đăng ký đơn giản với thư kích hoạt và vân vân. Nhưng đối với một số lý do mail() không gửi email, hoặc 3 tài khoản email khác nhau của tôi (hotmail, gmail, yahoo) không nhận được chúng và do đó thậm chí không đưa chúng vào thư mục spam.Thư PHP() không hoạt động

Code:

<?php 
    $mailto = '[email protected]'; 
    $subject = 'the subject'; 
    $message = 'the message'; 
    $from = '[email protected]'; 
    $header = 'From:'.$from; 

    if(mail($mailto,$subject,$message,$header)) { 
     echo 'Email on the way'; 
    } 
?> 

Mỗi lần nó ra 'Email trên đường' để mail() trả về true, phải không? Tôi thực sự không nhận được nó, tôi thậm chí đã cố gắng để tắt snitch nhỏ của tôi (mặc dù tôi đã không chặn SMTP).

+3

Bạn có đang thử nghiệm điều này trên máy tính cục bộ của mình hoặc trên máy chủ web thực không? Nếu nó trên máy cục bộ của bạn, cơ hội là nó không được cấu hình để gửi/nhận thư. – itsols

+0

Sendmail được thiết lập như thế nào trong tệp php.ini của bạn? Và đây là trên * nix hay Windows? –

+0

@ ETWW-Dave: Tôi dám bạn tìm thấy thực tế 'sendmail' trên một máy tính gần đây;) Nhưng có, tôi nghi ngờ rằng e-mail đang bị từ chối bởi máy chủ SMTP tiếp theo. – Piskvor

Trả lời

0

Kiểm tra phpinfo và/hoặc php.ini của bạn để cài đặt thư và đảm bảo rằng bạn có thể gửi thư bằng bất kỳ chương trình php nào đang cố gắng sử dụng. Chức năng sẽ thành công nếu lệnh thực hiện nhưng không biết liệu thư có thực sự bị hỏng hay không.

0

Kiểm tra nhật ký thư của máy chủ thư của bạn. Trên các hệ thống Unix-ish, nó thường là/var/log/maillog. Trên Windows, những người hiểu biết, nhưng phải có một bản ghi ở đâu đó. Nếu thư đang trả về TRUE, thì bất kỳ máy chủ thư nào mà nó kết nối đã chấp nhận thư cho việc gửi thư cuối cùng. Sau đó, mail() không còn liên quan đến bất kỳ cách nào và tùy thuộc vào máy chủ SMTP để thực hiện phân phối thực tế.

Trong điều khoản thực tế, mail() là bạn đang đi một lá thư xuống khối và thả nó vào một hộp thư. Mọi thứ sau đó hoàn toàn nằm ngoài phạm vi và kiểm soát của PHP.

1

Bạn có thể cần thêm các ký tự cuối dòng chính xác vào Tiêu đề. Có thể là \n hoặc \r\n

13

Xem this article by Jeff Atwood.

Tóm lại: Chỉ vì mã của bạn đã trao e-mail cho một Tác nhân chuyển thư, điều đó không có nghĩa là nó sẽ được gửi. Có, mail() trả lại đúng nghĩa là "được chấp nhận để phân phối" - có nghĩa là "Có vẻ như một e-mail, tôi sẽ thử để phân phối", không phải "Giao hàng". Thậm chí the manual for mail() says:

Điều quan trọng cần lưu ý rằng chỉ vì thư được chấp nhận cho giao hàng, nó KHÔNG nghĩa là mail sẽ thực sự đạt đích như mong muốn.

Soooo: kiểm tra MTA (email được gửi từ máy tính địa phương của bạn?), Cố gắng gửi đến địa chỉ cục bộ (nếu địa chỉ là địa phương, nó được gửi đi không?), Hãy thử gửi e-mail từ ứng dụng thư của bạn, bằng cách sử dụng các cài đặt tương tự như tập lệnh PHP của bạn, hãy thử gửi tới một ứng dụng thư nhỏ hơn cho phép bạn tắt tính năng chống thư rác (được phân phối bên ngoài mạng của bạn không?). Ngoài ra, hãy đọc bài viết đó và kiểm tra các điểm được đề cập ở đó.

4

Có thể máy chủ của bạn không được định cấu hình để xử lý mail().

<?php 
    print phpinfo(); 
?> 

và nhìn vào sendmail_path

+13

tiếp theo là gì? của tôi là _/usr/local/bin/phpsendmail_ – newbieguy

0

Nếu đây là một máy chủ Linux nó có thể thiết lập để gửi vào hàng đợi thư địa phương. Khi tôi gặp vấn đề này, tôi đã làm việc này bằng cách thêm một mục nhập MX trên máy chủ DNS được sử dụng bởi các máy chủ Linux trỏ đến máy chủ thư của ISP của chúng tôi.

Các vấn đề liên quan