Chức năng thư PHP không hoàn thành gửi e-mail


477
<?php
    $name = $_POST['name'];
    $email = $_POST['email'];
    $message = $_POST['message'];
    $from = 'From: yoursite.com';
    $to = 'contact@yoursite.com';
    $subject = 'Customer Inquiry';
    $body = "From: $name\n E-Mail: $email\n Message:\n $message";

    if ($_POST['submit']) {
        if (mail ($to, $subject, $body, $from)) {
            echo '<p>Your message has been sent!</p>';
        } else {
            echo '<p>Something went wrong, go back and try again!</p>';
        }
    }
?>

Tôi đã thử tạo một hình thức thư đơn giản. Bản thân biểu mẫu nằm trên index.htmltrang của tôi , nhưng nó gửi đến một trang "cảm ơn bạn đã gửi" thankyou.php, trong đó mã PHP ở trên được nhúng. Mã gửi hoàn hảo, nhưng không bao giờ gửi email. Làm thế nào tôi có thể sửa lỗi này?


2
là chương trình của bạn trong máy tính cục bộ hoặc máy chủ lưu trữ trực tiếp
Tamil Selvan C

6
1. bạn có chắc chắn nó không đi vào thư rác của bạn không? 2. bạn có cấu hình sendmail trên hộp của bạn không?
Steven Moseley

Nó trên một máy chủ trực tiếp, nó không đi vào thư rác của tôi..tôi không chắc ý của bạn là gì khi gửi sendmail được cấu hình trên hộp của tôi vì vậy tôi cho là không?
dùng3818620

hãy thử gửi mà không có$from
Artem Ilchenko

Câu trả lời:


512

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 mail()hàm, 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 phải chạy qua danh sách kiểm tra bên dưới để tìm 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à được đặt thành báo cáo tất cả các lỗi

Báo cáo lỗi là điều cần thiết để loại bỏ 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 phải được kích hoạt để nhận được các lỗi này. Đặt mã sau vào đầu 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.

Hãy chắc chắn rằng mail()hàm đượ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 mail()hàm trong mã của bạn. Hãy chắc chắn rằng nó ở đó và không bình luận ra.

Hãy chắc chắn rằng mail()hàm được gọi đúng

thư bool (chuỗi $ đến, chuỗi $ chủ đề, chuỗi $ message [, chuỗi $ thêm_headers [, chuỗi $ thêm_parameter]])

Hàm mail có ba tham số bắt buộc và tùy chọn thứ tư và thứ năm. Nếu cuộc gọi của bạ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 mail()không có các tham số chính xác theo đúng thứ tự thì 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 sẽ đăng nhập tất cả các nỗ lực để gửi email thông 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 nơi chúng được đặt) 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 bên dưới logs. Bên trong sẽ có 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

Khối 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ọ để gửi email bằng cách sử dụng SMTP. Và, điều này có thể dễ dàng truy tìm tại các maillogs 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 cố tình thực hiện 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 dịch vụ 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 dịch vụ lưu trữ đều chặn các cổng email này để bảo vệ mạng của họ gửi bất kỳ email spam nào.

Sử dụng cổng 25 hoặc 587 cho kết nối trơn / TLS và cổng 465 cho kết nối SSL. Đối với hầu hết người dùng, nên sử dụng cổng 587 để tránh giới hạn tốc độ do một số nhà cung cấp dịch vụ lưu trữ đặt ra.

Không sử dụng toán tử triệt tiêu lỗi

Khi toán tử triệt tiêu lỗi @ được thêm vào một biểu thức trong PHP, mọi thông báo lỗi 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 toán tử này là cần thiết nhưng gửi thư không phải là một trong số đó.

Nếu mã của bạn chứa @mail(...)thì bạn có thể đang ẩn các thông báo lỗi quan trọng sẽ giúp bạn gỡ lỗi này. Loại bỏ @và xem nếu có bất kỳ lỗi được báo cáo.

Nó chỉ được khuyến khích khi bạn kiểm traerror_get_last() ngay sau đó cho các lỗi cụ thể.

Kiểm tra mail()giá trị trả lại

Các mail()chức năng:

Trả về TRUEnếu thư được chấp nhận thành công để gửi, FALSEnếu không. Điều quan trọng cần lưu ý là chỉ vì thư được chấp nhận để gửi, điều đó KHÔNG có nghĩa là thư sẽ thực sự đến đích.

Điều này rất quan trọng để lưu ý bởi vì:

  • Nếu bạn nhận được FALSEgiá trị trả về, bạn biết lỗi nằm ở việc 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 TRUEgiá trị trả về, điều đó không có nghĩa là email của bạn chắc chắn sẽ được gửi. Nó chỉ có nghĩa là email đã được gửi đến trình xử lý tương ứng của nó trên máy chủ bởi PHP. 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, FALSEsẽ giúp chỉ cho bạn đi đúng hướng trong khi TRUEkhông không nhất thiết có nghĩa 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í, không cho phép gửi email từ máy chủ của họ hoặc giới hạn số lượng có thể được gửi trong bất kỳ khoảng thời gian nhất định 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 tận 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 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. Mặt khác, bạn có thể cần liên hệ với bộ phận hỗ trợ của họ để xác minh xem có bất kỳ hạn chế nào xảy ra xung quanh việc gửi email không.

Kiểm tra thư mục thư rác; ngă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 luôn kiểm tra ở đó trước khi xử lý sự cố mã của bạn.

Để tránh thư được gửi qua PHP không được gửi đến thư mục thư rác của người nhận, có nhiều cách bạn có thể làm, cả trong mã PHP của bạn và mặt khác, để giảm thiểu khả năng email của bạn bị đánh dấu là thư rác. Những lời khuyên hay 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ư SPFDKIM để 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 trỏ đến tên miền bạn sử dụng để gửi thư.
  • Đảm bảo rằng địa chỉ IP bạn đang sử dụng không nằm 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 đầy đủ, tên thật của người nhận trong trường Đến, không chỉ địa chỉ email (ví dụ "John Smith" <john@blacksmiths-international.com>).
  • Theo dõi các tài khoản lạm dụng của bạn, chẳng hạn như lạm dụng@yourdomain.com và postmaster@yourdomain.com. Đ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.

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 rằng 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: from@example.com",
    "Reply-To: replyto@example.com",
    "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 những lỗi này cho bạn.

$headers = array("From from@example.com", // missing colon
    "Reply To: replyto@example.com",      // missing hyphen
    "X-Mailer: "PHP"/" . PHP_VERSION      // bad quotes
);

Đừng sử dụng From:người gửi giả

Mặc dù thư phải có Từ: người gửi, bạn không được sử dụng bất kỳ giá trị nào . Các địa chỉ người gửi cụ thể do người dùng sử dụng là một cách chắc chắn để gửi thư bị chặn:

$headers = array("From: $_POST[contactform_sender_email]"); // No!

Lý do: web hoặc máy chủ gửi thư của bạn không phải là SPF / DKIM được liệt kê trong danh sách trắng để giả vờ chịu trách nhiệm về các địa chỉ @hotmail hoặc @gmail. Nó thậm chí có thể âm thầm thả thư với From:tên miền người gửi mà nó không được định 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ó một 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 = 'user@example.com';
// 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 mail()gọi hàm:

mail('user@example.com', $subject, $message, $headers); 

Điều này có thể áp dụng cho tất cả các mail()tham số.

Gửi tới 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 đến 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).

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 POST, hãy đảm bảo rằng bạn đang sử dụng $_POSTđể tìm kiếm các giá trị biểu mẫu của mình. Nếu bạn đã đặt thành GEThoặc không đặt nó ở tất cả, hãy đảm bảo bạn sử dụng $_GETđể tìm giá trị biểu mẫu của mình.

Đảm bảo actiongiá trị biểu mẫu của bạn trỏ đến đúng vị trí

Hãy chắc chắn rằng actionthuộc tính biểu mẫu của bạn chứa một giá trị trỏ đến mã gửi thư PHP của bạn.

<form action="send_email.php" method="POST">

Đảm bảo máy chủ web hỗ trợ gửi email

Một số nhà cung cấp dịch vụ lưu trữ web không cho phép hoặc cho phép gửi email thông qua máy chủ của họ. Lý do cho việc này có thể khác nhau 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 những email đó cho bạn.

Một email đến bộ phận hỗ trợ kỹ thuật của họ (sau chuyến đi tới bộ phậ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 rằng localhostmáy chủ thư được cấu hình

Nếu bạn đang phát triển trên máy trạm cục bộ của mình bằng WAMP, MAMP hoặc XAMPP, 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ó ai, 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 mình. Xem câu trả lời tuyệt vời này từ Vikas Dwivingi để tìm hiểu làm thế nào để làm điều này.

Kích hoạt tùy chỉnh của PHP mail.log

Ngoài tệp nhật ký của MTA và PHP, bạn có thể kích hoạt tính năng ghi nhật ký cho mail()chức năng một cách cụ thể. Nó không ghi lại tương tác SMTP hoàn chỉnh, nhưng ít nhất là chức năng tham số cuộc gọi 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à để cho phép các tùy chọn này trong php.inihoặc .user.inihoặc .htaccesscó lẽ.)

Kiểm tra với một dịch vụ kiểm tra thư

Có nhiều dịch vụ kiểm tra giao hàng và kiểm tra spam mà bạn có thể sử dụng để kiểm tra thiết lập MTA / máy chủ web của mình. Thông thường, bạn gửi một thăm dò thư đến: địa chỉ của họ, sau đó nhận được báo cáo gửi và các thất bại hoặc phân tích cụ thể hơn sau:

Sử dụng một bưu phẩm khác

mail()Hàm dựng sẵn 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 xử lý rất nhiều vấn đề được nêu ở trên:

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. (Bởi vì 08/15 gói chia sẻ webhosting điển hình bị tấn công hoặc bỏ lỡ khi cài đặt / cấu hình email.)


11
John viết tốt lắm. Tôi chỉ muốn thêm một điều nữa: Kiểm tra nhật ký máy chủ thư của máy chủ gửi thư (dù là lưu trữ cục bộ hay từ xa), nếu có thể, thường có thể làm sáng tỏ những gì gây ra sự cố. Các nhật ký này sẽ hiển thị 1) liệu có nhận được tin nhắn từ tập lệnh PHP hay không và nếu vậy, 2) có hay không việc nhận MX được chấp nhận từ máy chủ gửi thư.
mti2935

@ mti2935 Điều đó rất hữu ích Tôi ngạc nhiên tôi đã bỏ lỡ điều đó. Tôi chắc chắn sẽ thêm nó ngay. :)
John Conde

1
Tôi sẽ bắt đầu với việc không sử dụng mail(), nó làm một công việc tồi tệ và khó gỡ lỗi hơn bất kỳ thư viện thư nào khác

1
cùng một trang web trên 000webhost gửi email thành công và nhanh chóng trên tên miền netai.net nhưng trên trang web88.net tôi có cùng một trang web tôi nhận được trong bảng điều khiển rằng tin nhắn gửi thành công nhưng tôi không nhận được bất kỳ tin nhắn nào. Ngoài ra trong tên miền comuf.com tôi gặp lỗi. (Cùng một trang web trên cùng một máy chủ chỉ hoạt động trên tên miền netai.net, net16.net cũng hoạt động)
Nicolas Papaconstantinou

1
câu hỏi của tôi ( stackoverflow.com/questions/44866673/ - ) đã được đánh dấu là một bản sao của câu hỏi này, nhưng tôi vẫn không thể tìm ra nó. Bất kỳ đề xuất?
Zachary Elkins

37

Thêm một tiêu đề thư trong chức năng thư:

$header = "From: noreply@example.com\r\n";
$header.= "MIME-Version: 1.0\r\n";
$header.= "Content-Type: text/html; charset=ISO-8859-1\r\n";
$header.= "X-Priority: 1\r\n";

$status = mail($to, $subject, $message, $header);

if($status)
{
    echo '<p>Your mail has been sent!</p>';
} else {
    echo '<p>Something went wrong. Please try again!</p>';
}

25
  1. Luôn luôn thử gửi tiêu đề trong chức năng thư.
  2. Nếu bạn đang gửi thư qua localhost thì hãy thực hiện cài đặt SMTP để gửi thư.
  3. Nếu bạn đang gửi thư qua máy chủ thì hãy kiểm tra tính năng gửi email được bật trên máy chủ của bạn.

20

Nếu bạn đang sử dụng cấu hình SMTP để gửi email, hãy thử sử dụng PHPMailer thay thế. Bạn có thể tải xuống thư viện từ https://github.com/PHPMailer/PHPMailer .

Tôi đã tạo email của mình gửi theo cách này:

function send_mail($email, $recipient_name, $message='')
{
    require("phpmailer/class.phpmailer.php");

    $mail = new PHPMailer();

    $mail->CharSet = "utf-8";
    $mail->IsSMTP();                                      // Set mailer to use SMTP
    $mail->Host = "mail.example.com";  // Specify main and backup server
    $mail->SMTPAuth = true;     // Turn on SMTP authentication
    $mail->Username = "myusername";  // SMTP username
    $mail->Password = "p@ssw0rd"; // SMTP password

    $mail->From = "me@walalang.com";
    $mail->FromName = "System-Ad";
    $mail->AddAddress($email, $recipient_name);

    $mail->WordWrap = 50;                                 // Set word wrap to 50 characters
    $mail->IsHTML(true);                                  // Set email format to HTML (true) or plain text (false)

    $mail->Subject = "This is a Sampleenter code here Email";
    $mail->Body    = $message;
    $mail->AltBody = "This is the body in plain text for non-HTML mail clients";
    $mail->AddEmbeddedImage('images/logo.png', 'logo', 'logo.png');
    $mail->addAttachment('files/file.xlsx');

    if(!$mail->Send())
    {
       echo "Message could not be sent. <p>";
       echo "Mailer Error: " . $mail->ErrorInfo;
       exit;
    }

    echo "Message has been sent";
}

2
Tôi cũng đã phải sử dụng: Yêu cầu ("phpmailer / class.smtp.php");
Doug

15

Chỉ cần thêm một số tiêu đề trước khi gửi thư:

<?php 
$name = $_POST['name'];
$email = $_POST['email'];
$message = $_POST['message'];
$from = 'From: yoursite.com'; 
$to = 'contact@yoursite.com'; 
$subject = 'Customer Inquiry';
$body = "From: $name\n E-Mail: $email\n Message:\n $message";

$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-type: text/html\r\n";
$headers .= 'From: from@example.com' . "\r\n" .
'Reply-To: reply@example.com' . "\r\n" .
'X-Mailer: PHP/' . phpversion();

mail($to, $subject, $message, $headers);

Và một điều nữa. Các mail()chức năng không hoạt động trong localhost. Tải mã của bạn lên máy chủ và thử.


1
điều này thực sự đã làm cho biểu mẫu gửi-- câu hỏi của tôi bây giờ sẽ là..làm thế nào để tôi hiển thị người dùng đã nhập email, bây giờ tôi đã thay thế nó bằng tiêu đề ...
user3818620

nó sẽ ngăn thư từ thư mục thư rác. Tôi đã thấy nếu chúng tôi gửi thư hơn 10 bằng phương thức này bạn đã sử dụng trong mã gmail của mình, hãy gửi thư này để spam.
jewhuq

OP có dòng này: $from = 'From: yoursite.com'; Không giống như một địa chỉ email hợp lệ hoàn chỉnh, không có phần địa phương. Bạn đã thay thế tiêu đề From và thêm các tiêu đề bổ sung. Hay đúng hơn là $fromở trên là dư thừa trong ví dụ của bạn. Và bị dị tật có lẽ là vấn đề ban đầu của OP.
Progrock

13

Nó hoạt động với tôi trên 000webhost bằng cách làm như sau:

$headers  = "MIME-Version: 1.0" . "\r\n";
$headers .= "Content-type: text/html; charset=iso-8859-1" . "\r\n";
$headers .= "From: ". $from. "\r\n";
$headers .= "Reply-To: ". $from. "\r\n";
$headers .= "X-Mailer: PHP/" . phpversion();
$headers .= "X-Priority: 1" . "\r\n";

Nhập trực tiếp địa chỉ email khi gửi email:

mail('email@gmail.com', $subject, $message, $headers)

Sử dụng ''và không "".

Mã này hoạt động, nhưng email đã nhận được với độ trễ nửa giờ.


10

Chủ yếu là mail()chức năng bị vô hiệu hóa trong lưu trữ chia sẻ. Một lựa chọn tốt hơn là sử dụng SMTP. Tùy chọn tốt nhất sẽ là Gmail hoặc SendGrid.


SMTPconfig.php

<?php 
    $SmtpServer="smtp.*.*";
    $SmtpPort="2525"; //default
    $SmtpUser="***";
    $SmtpPass="***";
?>

SMTPmail.php

<?php
class SMTPClient
{

    function SMTPClient ($SmtpServer, $SmtpPort, $SmtpUser, $SmtpPass, $from, $to, $subject, $body)
    {

        $this->SmtpServer = $SmtpServer;
        $this->SmtpUser = base64_encode ($SmtpUser);
        $this->SmtpPass = base64_encode ($SmtpPass);
        $this->from = $from;
        $this->to = $to;
        $this->subject = $subject;
        $this->body = $body;

        if ($SmtpPort == "") 
        {
            $this->PortSMTP = 25;
        }
        else
        {
            $this->PortSMTP = $SmtpPort;
        }
    }

    function SendMail ()
    {
        $newLine = "\r\n";
        $headers = "MIME-Version: 1.0" . $newLine;  
        $headers .= "Content-type: text/html; charset=iso-8859-1" . $newLine;  

        if ($SMTPIN = fsockopen ($this->SmtpServer, $this->PortSMTP)) 
        {
            fputs ($SMTPIN, "EHLO ".$HTTP_HOST."\r\n"); 
            $talk["hello"] = fgets ( $SMTPIN, 1024 ); 
            fputs($SMTPIN, "auth login\r\n");
            $talk["res"]=fgets($SMTPIN,1024);
            fputs($SMTPIN, $this->SmtpUser."\r\n");
            $talk["user"]=fgets($SMTPIN,1024);
            fputs($SMTPIN, $this->SmtpPass."\r\n");
            $talk["pass"]=fgets($SMTPIN,256);
            fputs ($SMTPIN, "MAIL FROM: <".$this->from.">\r\n"); 
            $talk["From"] = fgets ( $SMTPIN, 1024 ); 
            fputs ($SMTPIN, "RCPT TO: <".$this->to.">\r\n"); 
            $talk["To"] = fgets ($SMTPIN, 1024); 
            fputs($SMTPIN, "DATA\r\n");
            $talk["data"]=fgets( $SMTPIN,1024 );
            fputs($SMTPIN, "To: <".$this->to.">\r\nFrom: <".$this->from.">\r\n".$headers."\n\nSubject:".$this->subject."\r\n\r\n\r\n".$this->body."\r\n.\r\n");
            $talk["send"]=fgets($SMTPIN,256);
            //CLOSE CONNECTION AND EXIT ... 
            fputs ($SMTPIN, "QUIT\r\n"); 
            fclose($SMTPIN); 
            // 
        } 
        return $talk;
    } 
}
?>

contact_email.php

<?php 
include('SMTPconfig.php');
include('SMTPmail.php');
if($_SERVER["REQUEST_METHOD"] == "POST")
{
    $to = "";
    $from = $_POST['email'];
    $subject = "Enquiry";
    $body = $_POST['name'].'</br>'.$_POST['companyName'].'</br>'.$_POST['tel'].'</br>'.'<hr />'.$_POST['message'];
    $SMTPMail = new SMTPClient ($SmtpServer, $SmtpPort, $SmtpUser, $SmtpPass, $from, $to, $subject, $body);
    $SMTPChat = $SMTPMail->SendMail();
}
?>

Có phải là một ý tưởng tốt để lưu người dùng và mật khẩu smtp trong bản rõ trên máy chủ?
Juri

@Juri có lẽ không ... trời ơi, tôi không thể tìm ra cách để chức năng thư hoạt động :. (

9

Nếu bạn chỉ sử dụng mail()chức năng, bạn cần hoàn thành tệp cấu hình.

Bạn cần mở rộng thư, và đặt SMTP smtp_port, v.v. và quan trọng nhất là tên người dùng và mật khẩu của bạn. Không có điều đó, thư không thể được gửi. Ngoài ra, bạn có thể sử dụng PHPMaillớp để gửi.


9

Hãy thử hai điều này một cách riêng biệt và cùng nhau:

  1. gỡ bỏ if($_POST['submit']){}
  2. loại bỏ $from(chỉ ruột của tôi)

8

Tôi nghĩ rằng điều này nên làm các mẹo. Tôi vừa thêm một if(issetvà thêm phép nối vào các biến trong phần thân để tách PHP khỏi HTML.

<?php
    $name = $_POST['name'];
    $email = $_POST['email'];
    $message = $_POST['message'];
    $from = 'From: yoursite.com'; 
    $to = 'contact@yoursite.com'; 
    $subject = 'Customer Inquiry';
    $body = "From:" .$name."\r\n E-Mail:" .$email."\r\n Message:\r\n" .$message;

if (isset($_POST['submit'])) 
{
    if (mail ($to, $subject, $body, $from)) 
    { 
        echo '<p>Your message has been sent!</p>';
    } 
    else 
    { 
        echo '<p>Something went wrong, go back and try again!</p>'; 
    }
}

?>

8

Đối với bất cứ ai tìm thấy điều này sẽ tiếp tục, tôi sẽ không khuyên bạn nên sử dụng mail. Có một số câu trả lời chạm vào điều này, nhưng không phải là lý do tại sao .

mailChức năng của PHP không chỉ mờ đục, nó hoàn toàn dựa vào bất kỳ MTA nào bạn sử dụng (ví dụ Sendmail ) để thực hiện công việc. mailsẽ chỉ cho bạn biết nếu MTA không chấp nhận nó (tức là Sendmail bị hỏng khi bạn cố gửi). Nó không thể cho bạn biết nếu thư thành công bởi vì nó đã được gửi đi. Như vậy (như chi tiết câu trả lời của John Conde ), giờ đây bạn có thể tìm hiểu nhật ký của MTA và hy vọng rằng nó cho bạn biết đủ về sự thất bại trong việc khắc phục nó. Nếu bạn đang sử dụng máy chủ được chia sẻ hoặc không có quyền truy cập vào nhật ký MTA, bạn sẽ không gặp may. Đáng buồn thay, mặc định cho hầu hết các cài đặt vanilla cho Linux xử lý theo cách này.

Một thư viện thư ( PHPMailer , Zend Framework 2+, v.v.), làm một cái gì đó rất khác với mail. Họ mở một ổ cắm trực tiếp đến máy chủ thư nhận và sau đó gửi các lệnh thư SMTP trực tiếp qua ổ cắm đó. Nói cách khác, lớp đóng vai trò là MTA của chính nó (lưu ý rằng bạn có thể yêu cầu các thư viện sử dụng mailđể gửi thư cuối cùng, nhưng tôi thực sự khuyên bạn không nên làm điều đó).

Điều này có nghĩa là sau đó bạn có thể thấy trực tiếp các phản hồi từ máy chủ nhận (ví dụ, trong PHPMailer, bạn có thể bật đầu ra gỡ lỗi ). Không còn phải đoán nếu một thư thất bại để gửi hoặc tại sao.

Nếu bạn đang sử dụng SMTP (tức là bạn đang gọi isSMTP()), bạn có thể nhận được bản ghi chi tiết của cuộc hội thoại SMTP bằng thuộc SMTPDebugtính.

Đặt tùy chọn này bằng cách bao gồm một dòng như thế này trong tập lệnh của bạn:

$mail->SMTPDebug = 2;

Bạn cũng có được lợi ích của một giao diện tốt hơn. Với mailbạn phải thiết lập tất cả các tiêu đề, tệp đính kèm, v.v ... Với một thư viện, bạn có một chức năng chuyên dụng để làm điều đó. Nó cũng có nghĩa là chức năng đang thực hiện tất cả các phần khó khăn (như tiêu đề).


6
$name = $_POST['name'];
$email = $_POST['email'];
$reciver = '/* Reciver Email address */';
if (filter_var($reciver, FILTER_VALIDATE_EMAIL)) {
    $subject = $name;
    // To send HTML mail, the Content-type header must be set.
    $headers = 'MIME-Version: 1.0' . "\r\n";
    $headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
    $headers .= 'From:' . $email. "\r\n"; // Sender's Email
    //$headers .= 'Cc:' . $email. "\r\n"; // Carbon copy to Sender
    $template = '<div style="padding:50px; color:white;">Hello ,<br/>'
        . '<br/><br/>'
        . 'Name:' .$name.'<br/>'
        . 'Email:' .$email.'<br/>'
        . '<br/>'
        . '</div>';
    $sendmessage = "<div style=\"background-color:#7E7E7E; color:white;\">" . $template . "</div>";
    // Message lines should not exceed 70 characters (PHP rule), so wrap it.
    $sendmessage = wordwrap($sendmessage, 70);
    // Send mail by PHP Mail Function.
    mail($reciver, $subject, $sendmessage, $headers);
    echo "Your Query has been received, We will contact you soon.";
} else {
    echo "<span>* invalid email *</span>";
}

6

Bạn có thể sử dụng email cấu hình của CodeIgniter . Ví dụ: sử dụng SMTP (cách đơn giản):

$config = Array(
        'protocol' => 'smtp',
        'smtp_host' => 'mail.domain.com', // Your SMTP host
        'smtp_port' => 26, // Default port for SMTP
        'smtp_user' => 'name@domain.com',
        'smtp_pass' => 'password',
        'mailtype' => 'html',
        'charset' => 'iso-8859-1',
        'wordwrap' => TRUE
);
$message = 'Your msg';
$this->load->library('email', $config);
$this->email->from('name@domain.com', 'Title');
$this->email->to('emaildestination@domain.com');
$this->email->subject('Header');
$this->email->message($message);

if($this->email->send()) 
{
   // Conditional true
}

Nó làm việc cho tôi!


1
fsockopen () [function.fsockopen]: php_network_getaddresses: getaddrinfo không thành công: Không có máy chủ nào như vậy được biết đến. - Nếu tôi gặp phải lỗi này thì lý do là gì và cần phải làm gì?
Choudhury Saadmaan Mahmid

1
"Hoạt động cho tôi" chỉ là thông tin giai thoại, nhưng thực sự không có nhiều lời giải thích. Mật khẩu cổng và smtp sẽ gây hiểu nhầm cho hầu hết người dùng.
mario

Là gì "config email" ? Bạn đã có một tài liệu tham khảo?
Peter Mortensen

4

Thử cái này

if ($_POST['submit']) {
    $success= mail($to, $subject, $body, $from);
    if($success)
    { 
        echo '
        <p>Your message has been sent!</p>
        ';
    } else { 
        echo '
        <p>Something went wrong, go back and try again!</p>
        '; 
    }
}

4

Có lẽ vấn đề là cấu hình của máy chủ thư. Để tránh loại sự cố này hoặc bạn không phải lo lắng về sự cố máy chủ thư, tôi khuyên bạn nên sử dụng PHPMailer .

Đây là một plugin có mọi thứ cần thiết để gửi thư và điều duy nhất bạn phải tính đến là phải bật cổng SMTP (Cổng: 25 và 465).

require_once 'PHPMailer/PHPMailer.php';
require_once '/servicios/PHPMailer/SMTP.php';
require_once '/servicios/PHPMailer/Exception.php';

$mail = new \PHPMailer\PHPMailer\PHPMailer(true);
try {
    //Server settings
    $mail->SMTPDebug = 0;
    $mail->isSMTP();
    $mail->Host = 'smtp.gmail.com';
    $mail->SMTPAuth = true;
    $mail->Username = 'correo@gmail.com';
    $mail->Password = 'contrasenia';
    $mail->SMTPSecure = 'ssl';
    $mail->Port = 465;

    // Recipients
    $mail->setFrom('correo@gmail.com', 'my name');
    $mail->addAddress('destination@correo.com');

    // Attachments
    $mail->addAttachment('optional file');         // Add files, is optional

    // Content
    $mail->isHTML(true);// Set email format to HTML
    $mail->Subject = utf8_decode("subject");
    $mail->Body    = utf8_decode("mail content");
    $mail->AltBody = '';
    $mail->send();
}
catch (Exception $e) {
    $error = $mail->ErrorInfo;
}

1
IANA đã thay thế cổng 465 bằng cổng 587. Đây là cổng gửi thư mặc định. Khi một ứng dụng email hoặc máy chủ gửi đi đang gửi một email được định tuyến bởi một máy chủ thư thích hợp, nó sẽ luôn sử dụng cổng SMTP 587 làm cổng mặc định. Xem mailgun.com/blog/which-smtp-port-under Hiểu -ports-25-465-587 . Một lời khuyên khôn ngoan: Đừng mở cổng trên máy tính của bạn nếu bạn không hoàn toàn nhận thức được những gì bạn đang làm!
hại

3

Hãy chắc chắn rằng bạn đã cài đặt Sendmail trong máy chủ của mình.

Nếu bạn đã kiểm tra mã của mình và xác minh rằng không có gì sai ở đó, hãy truy cập / var / mail và kiểm tra xem thư mục đó có trống không.

Nếu nó trống, bạn sẽ cần phải làm:

sudo apt-get install sendmail

nếu bạn đang ở trên máy chủ Ubuntu.


Đó là cách quá thô để có ích. Chỉ cài đặt một MTA sẽ hiếm khi cho phép để có được nó. Và một hướng dẫn thiết lập sendmail / postfix / qmail đầy đủ sẽ lạc đề ở đây.
mario

Nhận xét này có liên quan đến câu trả lời của tôi không? Bởi vì điều này đã không xảy ra với tôi và tôi đã không giải quyết nó theo cùng một cách chính xác. Có nhiều câu trả lời khác nhau cho câu hỏi, tôi là một trong số họ sau khi đã thử tất cả những điều trên trong quá khứ, câu trả lời của tôi đã giải quyết vấn đề cho tôi, vì vậy tôi đã đưa ra đây là một giải pháp tiềm năng khác.
Daniel

Có chắc chắn. Đó là một trong nhiều câu trả lời có thể. Tuy nhiên, đó vẫn là cách để IMO hời hợt. Tổng quát hóa nó thành "bạn cần một MTA", chẳng hạn như - và đây là một vài hướng dẫn thiết lập được liên kết có thể thực tế hơn.
mario

3

Trước hết, bạn có thể có quá nhiều tham số cho hàm mail () ... Bạn có thể có tối đa năm tham số, mail(to, subject, message, headers, parameters);

Theo như $frombiến, điều đó sẽ tự động đến từ webhost của bạn nếu bạn sử dụng Linux cPanel . Nó tự động đến từ tên người dùng và địa chỉ IP cPanel của bạn.

$name = $_POST['name'];
$email = $_POST['email'];
$message = $_POST['message'];
$from = 'From: yoursite.com';
$to = 'contact@yoursite.com';
$subject = 'Customer Inquiry';
$body = "From: $name\n E-Mail: $email\n Message:\n $message";

Đồng thời đảm bảo rằng bạn có thứ tự chính xác của các biến trong hàm mail ().

Theo mail($to, $subject, $message, etc.)thứ tự đó, nếu không thì có khả năng nó không hoạt động.


3

Nếu bạn gặp sự cố khi gửi thư bằng PHP, hãy xem xét một giải pháp thay thế như PHPMailer hoặc SwiftMailer .

Tôi thường sử dụng SwiftMailer bất cứ khi nào tôi cần gửi thư bằng PHP.


Cách sử dụng cơ bản:

require 'mail/swift_required.php';

$message = Swift_Message::newInstance()
    // The subject of your email
    ->setSubject('Jane Doe sends you a message')
    // The from address(es)
    ->setFrom(array('jane.doe@gmail.com' => 'Jane Doe'))
    // The to address(es)
    ->setTo(array('frank.stevens@gmail.com' => 'Frank Stevens'))
    // Here, you put the content of your email
    ->setBody('<h3>New message</h3><p>Here goes the rest of my message</p>', 'text/html');

if (Swift_Mailer::newInstance(Swift_MailTransport::newInstance())->send($message)) {
    echo json_encode([
        "status" => "OK",
        "message" => 'Your message has been sent!'
    ], JSON_PRETTY_PRINT);
} else {
    echo json_encode([
        "status" => "error",
        "message" => 'Oops! Something went wrong!'
    ], JSON_PRETTY_PRINT);
}

Xem tài liệu chính thức để biết thêm thông tin về cách sử dụng SwiftMailer.


3

Dành cho những người không muốn sử dụng các bưu phẩm bên ngoài và muốn gửi thư () trên máy chủ Linux chuyên dụng.

Cách thức, thư PHP, được mô tả php.initrong phần [mail function].

Tham số sendmail-pathmô tả cách sendmail được gọi. Giá trị mặc định là sendmail -t -i, vì vậy nếu bạn làm việc sendmail -t -i < message.txttrong bảng điều khiển Linux - bạn sẽ hoàn thành. Bạn cũng có thể thêm mail.logvào gỡ lỗi và chắc chắn thư () thực sự được gọi.

Các MTA khác nhau có thể thực hiện sendmail. Họ chỉ tạo một liên kết tượng trưng cho nhị phân của họ trên tên đó. Ví dụ, trong Debian mặc định là Postfix . Định cấu hình MTA của bạn để gửi thư và kiểm tra nó từ bảng điều khiển với sendmail -v -t -i < message.txt. Tệp message.txtphải chứa tất cả các tiêu đề của thư và nội dung, địa chỉ đích cho phong bì sẽ được lấy từ To:tiêu đề. Thí dụ:

From: myapp@example.com
To: mymail@example.com
Subject: Test mail via sendmail.

Text body.

Tôi thích sử dụng ssmtp như MTA vì nó đơn giản và không yêu cầu chạy daemon với các cổng đã mở. ssmtp chỉ phù hợp để gửi thư từ localhost . Nó cũng có thể gửi email xác thực qua tài khoản của bạn trên một dịch vụ thư công cộng. Cài đặt ssmtp và chỉnh sửa tập tin cấu hình /etc/ssmtp/ssmtp.conf. Để có thể nhận thư hệ thống cục bộ đến các tài khoản Unix (ví dụ: cảnh báo đến root từ các công việc định kỳ) định cấu hình /etc/ssmtp/revaliasestệp.

Đây là cấu hình của tôi cho tài khoản của tôi trên thư Yandex:

root=mymail@example.com
mailhub=smtp.yandex.ru:465
FromLineOverride=YES
UseTLS=YES
AuthUser=abcde@yandex.ru
AuthPass=password

2

Điều này sẽ chỉ ảnh hưởng đến một số ít người dùng, nhưng tôi muốn nó được ghi lại cho số ít đó. Thành viên nhỏ bé này đã dành 6 giờ để khắc phục sự cố một tập lệnh thư PHP đang hoạt động vì vấn đề này.

Nếu bạn đang đến một trường đại học chạy XAMPP từ www.AceITLab.com, bạn nên biết giáo sư của chúng tôi đã không nói gì với chúng tôi: Tường lửa AceITLab (không phải tường lửa Windows) chặn MercuryMail trong XAMPP. Bạn sẽ phải sử dụng một ứng dụng thư thay thế, lê đang làm việc cho chúng tôi. Bạn sẽ phải gửi đến tài khoản Gmail có cài đặt bảo mật thấp.

Vâng, tôi biết, điều này là hoàn toàn vô dụng đối với email thế giới thực. Tuy nhiên, từ những gì tôi đã thấy, môi trường học thuật và thế giới thực thường có rất ít điểm chung quý giá.


Điều đó quá cụ thể, và thực sự sẽ giúp được ai khác. Vui lòng sử dụng liên kết [xóa] bên dưới câu trả lời của bạn.
mario

"Lê" trong bối cảnh này là gì? Ý bạn là PEAR , kho lưu trữ phần mềm PHP? Hay cái gì khác? Ví dụ như bạn bè ?
Peter Mortensen

Bạn có thực sự có nghĩa là "chút quý giá" ? Nó có phải là một cái gì đó để ước? Tại sao?
Peter Mortensen

1

Nếu bạn đang chạy mã này trên máy chủ cục bộ (tức là máy tính của bạn cho mục đích phát triển), nó sẽ không gửi email đến người nhận. Nó sẽ tạo một .txttập tin trong một thư mục có tên mailoutput.

Trong trường hợp nếu bạn đang sử dụng một dịch vụ Hosing miễn phí, như 000webhosthoặc hostinger, những nhà cung cấp dịch vụ vô hiệu hóa mail()chức năng để ngăn chặn sử dụng ngoài ý muốn của giả mạo email, gửi thư rác, vv Tôi thích bạn liên hệ với họ để xem liệu họ hỗ trợ tính năng này.

Nếu bạn chắc chắn rằng nhà cung cấp dịch vụ hỗ trợ chức năng mail (), bạn có thể kiểm tra hướng dẫn sử dụng PHP này để tham khảo thêm,

Thư PHP ()

Để kiểm tra thời tiết dịch vụ lưu trữ của bạn hỗ trợ chức năng mail (), hãy thử chạy mã này (nhớ thay đổi địa chỉ email người nhận) :

<?php
    $to      = 'nobody@example.com';
    $subject = 'the subject';
    $message = 'hello';
    $headers = 'From: webmaster@example.com' . "\r\n" .
        'Reply-To: webmaster@example.com' . "\r\n" .
        'X-Mailer: PHP/' . phpversion();

    mail($to, $subject, $message, $headers);
?>

1

Cài đặt Sendmail cho Debian 10.0.0 ('Buster') trên thực tế là không đáng kể!

php.ini

[mail function]
sendmail_path=/usr/sbin/sendmail -t -i
; (Other directives are mostly windows)

Cài đặt gói sendmail tiêu chuẩn (cho phép 'gửi'):

su -                                        # Install as user 'root'
dpkg --list                                 # Is install necessary?
apt-get install sendmail sendmail-cf m4     # Note multiple package selection
sendmailconfig                              # Respond all 'Y' for new install

Các lệnh hữu ích khác:

which sendmail                              # /usr/sbin/sendmail
which sendmailconfig                        # /usr/sbin/sendmailconfig
man sendmail                                # Documentation
systemctl restart sendmail                  # As and when required

Xác minh (khả năng gửi)

echo "Subject: sendmail test" | sendmail -v <yourEmail>@gmail.com

Ở trên mất khoảng 5 phút. Sau đó, tôi đã lãng phí 5 giờ ... Đừng quên kiểm tra thư mục thư rác của bạn !


0

Có một số khả năng:

  1. Bạn đang đối mặt với một vấn đề máy chủ. Máy chủ không có bất kỳ máy chủ thư. Vì vậy, thư của bạn không hoạt động, bởi vì mã của bạn vẫn ổn và thư đang hoạt động với loại.

  2. Bạn không nhận được giá trị được đăng. Hãy thử mã của bạn với một giá trị tĩnh.

  3. Sử dụng thư SMTP để gửi thư ...


0

Bạn có thể sử dụng libmail: http://lwest.free.fr/doc/php/lib/index.php3?page=mail&lang=en

include "libmail.php";
$m = new Mail(); // Create the mail
$m->From($_POST['form']);
$m->To($_POST['to']);
$m->Subject($_POST['subject']);
$m->Body($_POST['body']);
$m->Cc($_POST['cc']);
$m->Priority(4);
// Attach a file of type 'image/gif' to be displayed in the message if possible
$m->Attach("/home/leo/toto.gif", "image/gif", "inline");
$m->Send(); // Send the mail
echo "Mail was sent:"
echo $m->Get(); // Show the mail source

5
Điều quan trọng cần đề cập: đây chỉ đơn thuần là một mail()hàm bao. Chỉ thêm xây dựng tin nhắn và một số mánh lới quảng cáo.
mario

0

Bạn có thể thấy lỗi của mình bằng cách:

error_reporting(E_ALL);

Và mã mẫu của tôi là:

<?php
    use PHPMailer\PHPMailer\PHPMailer;
    require 'PHPMailer.php';
    require 'SMTP.php';
    require 'Exception.php';

    $name = $_POST['name'];
    $mailid = $_POST['mail'];
    $mail = new PHPMailer;
    $mail->IsSMTP();
    $mail->SMTPDebug = 0;                   // Set mailer to use SMTP
    $mail->Host = 'smtp.gmail.com';         // Specify main and backup server
    $mail->Port = 587;                      // Set the SMTP port
    $mail->SMTPAuth = true;                 // Enable SMTP authentication
    $mail->Username = 'someone@gmail.com';  // SMTP username
    $mail->Password = 'password';           // SMTP password
    $mail->SMTPSecure = 'tls';              // Enable encryption, 'ssl' also accepted

    $mail->From = 'someone@gmail.com';
    $mail->FromName = 'name';
    $mail->AddAddress($mailid, $name);       // Name is optional
    $mail->IsHTML(true);                     // Set email format to HTML
    $mail->Subject = 'Here is the subject';
    $mail->Body    = 'Here is your message' ;
    $mail->AltBody = 'This is the body in plain text for non-HTML mail clients';
    if (!$mail->Send()) {
       echo 'Message could not be sent.';
       echo 'Mailer Error: ' . $mail->ErrorInfo;
       exit;
    }
    echo 'Message has been sent';
?>

1
SMTPDebug = 0không hữu ích "Mật khẩu" đơn giản cũng không hoạt động với GMail. Câu trả lời này không đóng góp nhiều ở đây.
mario

-2

Với điều kiện hệ thống sendmail của bạn hoạt động, mã của bạn phải được sửa đổi như sau:

<?php
    $name = $_POST['name'];
    $email = $_POST['email'];
    $message = $_POST['message'];

    $header ="
Content-Type: text/html; charset=UTF-8\r\n
MIME-Version: 1.0\r\n
From: \"$name\" <$email>\r\n
Reply-To: no-reply@yoursite.com\r\n
X-Mailer: yoursite.com mailer\r\n
";

    $to = '"Contact" <contact@yoursite.com>'; 
    $subject = 'Customer Inquiry';
    $body =<<<EOB
<!DOCTYPE html>
<html>
    <body>
        $message
    </body>
</html>
EOB;

    if ($_POST['submit']) {
        if (mail ($to, $subject, $body, $header) !== false) { 
            echo '<p>Your message has been sent!</p>';
        } else { 
            echo '<p>Something went wrong, go back and try again!</p>'; 
        }
    }
?>

Điều này cho phép bạn gửi email dựa trên HTML.

Quan tâm đáng chú ý:

  1. chúng tôi đã xây dựng một chuỗi đa dòng tiêu đề (mỗi dòng cách nhau bởi \ r \ n);
  2. chúng tôi đã thêm Kiểu nội dung để thể hiện, chúng tôi trả lại HTML để bạn có thể soạn email tốt hơn (bạn có thể thêm mã HTML này bạn muốn, bao gồm CSS, vào tin nhắn của bạn như bạn sẽ làm trong trang HTML).

Ghi chú: <<<EOB cú pháp yêu cầu điểm đánh dấu EOB cuối cùng bắt đầu khi bắt đầu pf dòng và không có khoảng trắng hoặc ký tự nào sau dấu chấm phẩy.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.