ฟังก์ชันเมล PHP ส่งอีเมลไม่เสร็จสมบูรณ์

Jul 09 2014
<?php
    $name = $_POST['name'];
    $email = $_POST['email'];
    $message = $_POST['message'];
    $from = 'From: yoursite.com';
    $to = '[email protected]';
    $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>';
        }
    }
?>

ฉันได้ลองสร้างแบบฟอร์มจดหมายธรรมดาแล้ว แบบฟอร์มอยู่ในindex.htmlหน้าของฉันแต่จะส่งไปยังหน้า "ขอบคุณสำหรับการส่ง" แยกต่างหากthankyou.phpซึ่งมีการฝังโค้ด PHP ด้านบนไว้ รหัสส่งสมบูรณ์ แต่ไม่เคยส่งอีเมล ฉันจะแก้ไขปัญหานี้ได้อย่างไร?

คำตอบ

533 JohnConde Jul 09 2014 at 09:21

แม้ว่าจะมีบางส่วนของคำตอบนี้ที่ใช้กับการใช้งานmail()ฟังก์ชันเท่านั้น แต่ขั้นตอนการแก้ไขปัญหาเหล่านี้สามารถนำไปใช้กับระบบส่งเมล PHP ใดก็ได้

มีสาเหตุหลายประการที่สคริปต์ของคุณดูเหมือนจะไม่ส่งอีเมล เป็นการยากที่จะวินิจฉัยสิ่งเหล่านี้เว้นแต่จะมีข้อผิดพลาดทางไวยากรณ์ที่ชัดเจน คุณไม่จำเป็นต้องดำเนินการตามรายการตรวจสอบด้านล่างเพื่อค้นหาข้อผิดพลาดที่อาจเกิดขึ้นที่คุณอาจพบ

ตรวจสอบให้แน่ใจว่าได้เปิดใช้งานการรายงานข้อผิดพลาดและตั้งค่าให้รายงานข้อผิดพลาดทั้งหมด

การรายงานข้อผิดพลาดเป็นสิ่งสำคัญในการขจัดจุดบกพร่องในโค้ดของคุณและข้อผิดพลาดทั่วไปที่ PHP พบ ต้องเปิดใช้งานการรายงานข้อผิดพลาดเพื่อรับข้อผิดพลาดเหล่านี้ การวางโค้ดต่อไปนี้ที่ด้านบนของไฟล์ PHP ของคุณ (หรือในไฟล์คอนฟิกูเรชันหลัก) จะเปิดใช้งานการรายงานข้อผิดพลาด

error_reporting(-1);
ini_set('display_errors', 'On');
set_error_handler("var_dump");

ดูฉันจะรับข้อความแสดงข้อผิดพลาดที่เป็นประโยชน์ใน PHP ได้อย่างไร - คำตอบนี้สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับเรื่องนี้

ตรวจสอบให้แน่ใจว่าmail()ฟังก์ชันถูกเรียกใช้

อาจดูเหมือนโง่ แต่ข้อผิดพลาดทั่วไปคือการลืมวางmail()ฟังก์ชันลงในโค้ดของคุณ ตรวจสอบให้แน่ใจว่ามีและไม่แสดงความคิดเห็น

ตรวจสอบให้แน่ใจว่าmail()ฟังก์ชันถูกเรียกใช้อย่างถูกต้อง

บูลเมล (สตริง $ ถึง, สตริง $ หัวเรื่อง, สตริง $ ข้อความ [, สตริง $ เพิ่มเติม_headers [, สตริง $ เพิ่มเติม_parameters]])

ฟังก์ชันเมลรับพารามิเตอร์ที่ต้องการสามพารามิเตอร์และตัวเลือกที่สี่และห้า หากการโทรของคุณmail()ไม่มีพารามิเตอร์อย่างน้อยสามพารามิเตอร์จะล้มเหลว

หากการโทรของคุณmail()ไม่มีพารามิเตอร์ที่ถูกต้องตามลำดับที่ถูกต้องก็จะล้มเหลวเช่นกัน

ตรวจสอบบันทึกเมลของเซิร์ฟเวอร์

เว็บเซิร์ฟเวอร์ของคุณควรบันทึกทุกครั้งที่พยายามส่งอีเมลผ่านมัน สถานที่ตั้งของบันทึกเหล่านี้จะแตกต่างกัน (คุณอาจต้องขอให้ผู้ดูแลระบบเซิร์ฟเวอร์ของคุณที่พวกเขาอยู่) logsแต่พวกเขาสามารถทั่วไปจะพบในภายใต้ไดเรกทอรีรากของผู้ใช้ ภายในจะเป็นข้อความแสดงข้อผิดพลาดที่เซิร์ฟเวอร์รายงานว่าเกี่ยวข้องกับความพยายามของคุณในการส่งอีเมล

ตรวจสอบการเชื่อมต่อพอร์ตล้มเหลว

การบล็อกพอร์ตเป็นปัญหาที่พบบ่อยมากซึ่งนักพัฒนาส่วนใหญ่ต้องเผชิญในขณะที่รวมโค้ดเพื่อส่งอีเมลโดยใช้ SMTP และสามารถตรวจสอบได้อย่างง่ายดายที่เซิร์ฟเวอร์ Maillogs (ตำแหน่งของเซิร์ฟเวอร์บันทึกเมลอาจแตกต่างกันไปในแต่ละเซิร์ฟเวอร์ตามที่อธิบายไว้ข้างต้น) ในกรณีที่คุณอยู่บนเซิร์ฟเวอร์โฮสติ้งที่ใช้ร่วมกันพอร์ต 25 และ 587 จะยังคงถูกบล็อกโดยค่าเริ่มต้น ผู้ให้บริการโฮสติ้งของคุณทำบล็อกนี้โดยเจตนา สิ่งนี้เป็นจริงแม้แต่กับเซิร์ฟเวอร์เฉพาะบางเครื่อง เมื่อพอร์ตเหล่านี้ถูกบล็อกให้ลองเชื่อมต่อโดยใช้พอร์ต 2525 หากคุณพบว่าพอร์ตนั้นถูกบล็อกด้วยวิธีเดียวคือติดต่อผู้ให้บริการโฮสติ้งของคุณเพื่อปลดบล็อกพอร์ตเหล่านี้

ผู้ให้บริการโฮสติ้งส่วนใหญ่บล็อกพอร์ตอีเมลเหล่านี้เพื่อป้องกันเครือข่ายของตนจากการส่งอีเมลขยะ

ใช้พอร์ต 25 หรือ 587 สำหรับการเชื่อมต่อธรรมดา / TLS และพอร์ต 465 สำหรับการเชื่อมต่อ SSL สำหรับผู้ใช้ส่วนใหญ่ขอแนะนำให้ใช้พอร์ต 587 เพื่อหลีกเลี่ยงการ จำกัด อัตราที่กำหนดโดยผู้ให้บริการโฮสติ้งบางราย

อย่าใช้ตัวดำเนินการปราบปรามข้อผิดพลาด

เมื่อตัวดำเนินการระงับข้อผิดพลาด @ถูกนำหน้านิพจน์ใน PHP ข้อความแสดงข้อผิดพลาดใด ๆ ที่อาจสร้างขึ้นโดยนิพจน์นั้นจะถูกละเว้น มีบางสถานการณ์ที่จำเป็นต้องใช้โอเปอเรเตอร์นี้ แต่การส่งอีเมลไม่ใช่หนึ่งในนั้น

หากรหัสของคุณมีแสดง@mail(...)ว่าคุณกำลังซ่อนข้อความแสดงข้อผิดพลาดที่สำคัญซึ่งจะช่วยคุณแก้ไขข้อบกพร่องนี้ ลบ@และดูว่ามีการรายงานข้อผิดพลาดหรือไม่

ขอแนะนำให้ตรวจสอบerror_get_last()ทันทีเพื่อหาข้อผิดพลาดที่เป็นรูปธรรมในภายหลัง

ตรวจสอบmail()ค่าส่งคืน

mail()ฟังก์ชั่น:

ส่งคืนTRUEหากอีเมลได้รับการตอบรับสำหรับการจัดส่งเรียบร้อยแล้วFALSEมิฉะนั้น สิ่งสำคัญคือต้องทราบว่าเพียงเพราะอีเมลได้รับการยอมรับในการจัดส่งจึงไม่ได้หมายความว่าจดหมายจะไปถึงปลายทางที่ตั้งใจไว้จริงๆ

สิ่งนี้สำคัญที่ควรทราบเนื่องจาก:

  • หากคุณได้รับFALSEค่าส่งคืนคุณทราบว่าข้อผิดพลาดเกิดขึ้นกับเซิร์ฟเวอร์ของคุณที่ยอมรับอีเมลของคุณ นี่อาจไม่ใช่ปัญหาการเข้ารหัส แต่เป็นปัญหาการกำหนดค่าเซิร์ฟเวอร์ คุณต้องพูดคุยกับผู้ดูแลระบบของคุณเพื่อหาสาเหตุที่เกิดขึ้น
  • หากคุณได้รับTRUEมูลค่าคืนไม่ได้หมายความว่าอีเมลของคุณจะถูกส่งไปอย่างแน่นอน หมายความว่าอีเมลถูกส่งไปยังตัวจัดการที่เกี่ยวข้องบนเซิร์ฟเวอร์สำเร็จโดย PHP ยังมีจุดล้มเหลวอีกมากนอกเหนือจากการควบคุมของ PHP ที่อาจทำให้ไม่สามารถส่งอีเมลได้

ดังนั้นFALSEจะช่วยชี้ให้คุณไปในทิศทางที่ถูกต้องในขณะที่TRUEไม่ได้หมายความว่าอีเมลของคุณจะส่งสำเร็จเสมอไป นี่เป็นสิ่งสำคัญที่ควรทราบ!

ตรวจสอบให้แน่ใจว่าผู้ให้บริการโฮสติ้งของคุณอนุญาตให้คุณส่งอีเมลและไม่ จำกัด การส่งอีเมล

เว็บโฮสต์ที่ใช้ร่วมกันจำนวนมากโดยเฉพาะผู้ให้บริการเว็บโฮสติ้งฟรีไม่อนุญาตให้ส่งอีเมลจากเซิร์ฟเวอร์ของตนหรือ จำกัด จำนวนที่สามารถส่งได้ในช่วงเวลาใดก็ได้ เนื่องจากความพยายามในการ จำกัด ผู้ส่งสแปมจากการใช้ประโยชน์จากบริการที่ถูกกว่าของตน

หากคุณคิดว่าโฮสต์ของคุณมีข้อ จำกัด ในการส่งอีเมลหรือบล็อกการส่งอีเมลโปรดตรวจสอบคำถามที่พบบ่อยเพื่อดูว่ามีข้อ จำกัด ดังกล่าวหรือไม่ มิฉะนั้นคุณอาจต้องติดต่อฝ่ายสนับสนุนเพื่อตรวจสอบว่ามีข้อ จำกัด ใด ๆ เกี่ยวกับการส่งอีเมลหรือไม่

ตรวจสอบโฟลเดอร์สแปม ป้องกันไม่ให้อีเมลถูกตั้งค่าสถานะว่าเป็นสแปม

บ่อยครั้งด้วยเหตุผลหลายประการอีเมลที่ส่งผ่าน PHP (และภาษาโปรแกรมฝั่งเซิร์ฟเวอร์อื่น ๆ ) จะไปอยู่ในโฟลเดอร์สแปมของผู้รับ ตรวจสอบที่นั่นเสมอก่อนแก้ไขปัญหารหัสของคุณ

เพื่อหลีกเลี่ยงไม่ให้อีเมลที่ส่งผ่าน PHP ถูกส่งไปยังโฟลเดอร์สแปมของผู้รับมีหลายสิ่งที่คุณสามารถทำได้ทั้งในโค้ด PHP ของคุณและอื่น ๆ เพื่อลดโอกาสที่อีเมลของคุณจะถูกทำเครื่องหมายว่าเป็นสแปม เคล็ดลับดีๆจากMichiel de Mareได้แก่ :

  • ใช้วิธีการรับรองความถูกต้องของอีเมลเช่นSPFและDKIMเพื่อพิสูจน์ว่าอีเมลและชื่อโดเมนของคุณเป็นของคู่กันและเพื่อป้องกันการปลอมแปลงชื่อโดเมนของคุณ เว็บไซต์ SPF มีวิซาร์ดในการสร้างข้อมูล DNS สำหรับไซต์ของคุณ
  • ตรวจสอบDNS ย้อนกลับของคุณเพื่อให้แน่ใจว่าที่อยู่ IP ของเซิร์ฟเวอร์อีเมลของคุณชี้ไปที่ชื่อโดเมนที่คุณใช้ในการส่งอีเมล
  • ตรวจสอบให้แน่ใจว่าที่อยู่ IP ที่คุณใช้ไม่อยู่ในบัญชีดำ
  • ตรวจสอบให้แน่ใจว่าที่อยู่สำหรับตอบกลับเป็นที่อยู่ที่ถูกต้องและมีอยู่
  • ใช้นามสกุลจริงของผู้รับในช่องถึงไม่ใช่แค่ที่อยู่อีเมล (เช่น"John Smith" <[email protected]>)
  • ตรวจสอบบัญชีการละเมิดของคุณเช่น [email protected] และ [email protected] นั่นหมายความว่า - ตรวจสอบให้แน่ใจว่ามีบัญชีเหล่านี้อยู่อ่านสิ่งที่ส่งถึงพวกเขาและดำเนินการตามข้อร้องเรียน
  • สุดท้ายทำให้การยกเลิกการสมัครเป็นเรื่องง่ายมาก มิฉะนั้นผู้ใช้ของคุณจะยกเลิกการสมัครโดยการกดปุ่มสแปมซึ่งจะส่งผลต่อชื่อเสียงของคุณ

ดูคุณจะแน่ใจได้อย่างไรว่าอีเมลที่คุณส่งโดยใช้โปรแกรมจะไม่ถูกทำเครื่องหมายว่าเป็นสแปมโดยอัตโนมัติ สำหรับข้อมูลเพิ่มเติมเกี่ยวกับหัวข้อนี้

ตรวจสอบให้แน่ใจว่ามีการระบุส่วนหัวของอีเมลทั้งหมด

ซอฟต์แวร์สแปมบางตัวจะปฏิเสธอีเมลหากไม่มีส่วนหัวทั่วไปเช่น "จาก" และ "ตอบกลับ":

$headers = array("From: [email protected]",
    "Reply-To: [email protected]",
    "X-Mailer: PHP/" . PHP_VERSION
);
$headers = implode("\r\n", $headers);
mail($to, $subject, $message, $headers);

ตรวจสอบว่าส่วนหัวของอีเมลไม่มีข้อผิดพลาดทางไวยากรณ์

ส่วนหัวที่ไม่ถูกต้องก็แย่พอ ๆ กับการไม่มีส่วนหัว อักขระที่ไม่ถูกต้องเพียงตัวเดียวอาจทำให้อีเมลของคุณตกรางได้ ตรวจสอบให้แน่ใจว่าไวยากรณ์ของคุณถูกต้องเนื่องจาก PHP จะไม่พบข้อผิดพลาดเหล่านี้สำหรับคุณ

$headers = array("From [email protected]", // missing colon
    "Reply To: [email protected]",      // missing hyphen
    "X-Mailer: "PHP"/" . PHP_VERSION      // bad quotes
);

อย่าใช้From:ผู้ส่งปลอม

แม้ว่าอีเมลจะต้องมีผู้ส่งจาก: แต่คุณไม่สามารถใช้เพียงค่าใดก็ได้ โดยเฉพาะที่อยู่ผู้ส่งที่ระบุโดยผู้ใช้เป็นวิธีที่แน่นอนในการบล็อกเมล:

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

เหตุผล: เว็บหรือเซิร์ฟเวอร์อีเมลที่ส่งของคุณไม่อยู่ในรายการที่อนุญาตพิเศษของ SPF / DKIM เพื่อแสร้งทำเป็นว่ารับผิดชอบที่อยู่ @hotmail หรือ @gmail มันอาจยังส่งอีเมลแบบเงียบ ๆ ด้วยFrom:โดเมนผู้ส่งที่ไม่ได้กำหนดค่าไว้

ตรวจสอบว่าค่าผู้รับถูกต้อง

บางครั้งปัญหาก็ง่ายๆเพียงแค่ระบุค่าที่ไม่ถูกต้องสำหรับผู้รับอีเมล อาจเกิดจากการใช้ตัวแปรที่ไม่ถูกต้อง

$to = '[email protected]';
// other variables ....
mail($recipient, $subject, $message, $headers); // $recipient should be $to

อีกวิธีหนึ่งในการทดสอบสิ่งนี้คือการฮาร์ดโค้ดค่าผู้รับลงในการmail()เรียกฟังก์ชัน:

mail('[email protected]', $subject, $message, $headers); 

สิ่งนี้สามารถใช้ได้กับmail()พารามิเตอร์ทั้งหมด

ส่งไปยังหลายบัญชี

เพื่อช่วยขจัดปัญหาเกี่ยวกับบัญชีอีเมลให้ส่งอีเมลของคุณไปยังบัญชีอีเมลหลายบัญชีที่ผู้ให้บริการอีเมลต่างๆ หากอีเมลของคุณไม่มาถึงบัญชี Gmail ของผู้ใช้ให้ส่งอีเมลเดียวกันไปยังบัญชี Yahoo บัญชี Hotmail และบัญชี POP3 ปกติ (เช่นบัญชีอีเมลที่ ISP ให้ไว้)

หากอีเมลมาถึงบัญชีอีเมลทั้งหมดหรือบางบัญชีคุณทราบว่ารหัสของคุณกำลังส่งอีเมล แต่มีแนวโน้มว่าผู้ให้บริการบัญชีอีเมลจะบล็อกอีเมลเหล่านี้ด้วยเหตุผลบางประการ หากอีเมลไม่มาถึงบัญชีอีเมลใด ๆ ปัญหาน่าจะเกี่ยวข้องกับรหัสของคุณมากกว่า

ตรวจสอบว่ารหัสตรงกับวิธีการแบบฟอร์ม

หากคุณตั้งค่าวิธีการแบบฟอร์มของคุณPOSTให้ตรวจสอบว่าคุณกำลังใช้$_POSTเพื่อค้นหาค่าฟอร์มของคุณ หากคุณตั้งค่าเป็นGETหรือไม่ได้ตั้งค่าเลยตรวจสอบให้แน่ใจว่าคุณใช้$_GETเพื่อค้นหาค่าแบบฟอร์มของคุณ

ตรวจสอบให้แน่ใจว่าactionค่าแบบฟอร์มของคุณชี้ไปยังตำแหน่งที่ถูกต้อง

ตรวจสอบให้แน่ใจว่าactionแอตทริบิวต์แบบฟอร์มของคุณมีค่าที่ชี้ไปยังรหัสไปรษณีย์ PHP ของคุณ

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

ตรวจสอบให้แน่ใจว่าโฮสต์เว็บรองรับการส่งอีเมล

ผู้ให้บริการเว็บโฮสติ้งบางรายไม่อนุญาตหรือเปิดใช้งานการส่งอีเมลผ่านเซิร์ฟเวอร์ของตน เหตุผลในการนี้อาจแตกต่างกันไป แต่หากพวกเขาปิดใช้งานการส่งอีเมลคุณจะต้องใช้วิธีอื่นที่ใช้บุคคลที่สามในการส่งอีเมลเหล่านั้นให้คุณ

อีเมลไปยังฝ่ายสนับสนุนด้านเทคนิคของพวกเขา (หลังจากเดินทางไปยังฝ่ายสนับสนุนออนไลน์หรือคำถามที่พบบ่อย) ควรชี้แจงว่ามีความสามารถของอีเมลบนเซิร์ฟเวอร์ของคุณหรือไม่

ตรวจสอบให้แน่ใจว่าlocalhostได้กำหนดค่าเมลเซิร์ฟเวอร์แล้ว

หากคุณกำลังพัฒนาบนเวิร์กสเตชันท้องถิ่นของคุณโดยใช้ WAMP, MAMP หรือ XAMPP เซิร์ฟเวอร์อีเมลอาจไม่ได้ติดตั้งบนเวิร์กสเตชันของคุณ ถ้าไม่มี PHP ก็ไม่สามารถส่งเมลได้ตามค่าเริ่มต้น

คุณสามารถเอาชนะสิ่งนี้ได้โดยการติดตั้งเซิร์ฟเวอร์เมลพื้นฐาน สำหรับ Windows คุณสามารถใช้Mercury Mailฟรี

คุณยังสามารถใช้ SMTP เพื่อส่งอีเมลของคุณ ดูคำตอบที่ยอดเยี่ยมจากVikas Dwivediเพื่อเรียนรู้วิธีการทำสิ่งนี้

เปิดใช้งานแบบกำหนดเองของ PHP mail.log

นอกจากไฟล์บันทึกของ MTA และ PHP แล้วคุณยังสามารถเปิดใช้งานการบันทึกสำหรับmail()ฟังก์ชันนี้โดยเฉพาะได้ ไม่ได้บันทึกการโต้ตอบ SMTP ที่สมบูรณ์ แต่อย่างน้อยพารามิเตอร์การเรียกฟังก์ชันและสคริปต์การเรียกใช้

ini_set("mail.log", "/tmp/mail.log");
ini_set("mail.add_x_header", TRUE);

ดูรายละเอียดhttp://php.net/manual/en/mail.configuration.php (ควรเปิดใช้งานตัวเลือกเหล่านี้ในphp.iniหรือ.user.iniหรือ.htaccessอาจจะ)

ตรวจสอบกับบริการทดสอบอีเมล

มีบริการตรวจสอบการจัดส่งและการส่งสแปมต่างๆที่คุณสามารถใช้เพื่อทดสอบการตั้งค่า MTA / เว็บเซิร์ฟเวอร์ของคุณ โดยปกติคุณจะส่งโพรบทางไปรษณีย์ไปที่: ที่อยู่ของพวกเขาจากนั้นรับรายงานการจัดส่งและความล้มเหลวหรือการวิเคราะห์ที่เป็นรูปธรรมมากขึ้นในภายหลัง:

ใช้จดหมายอื่น

PHP ในตัวmail()ฟังก์ชั่นเป็นประโยชน์และมักจะได้รับงานทำ แต่ก็มีข้อบกพร่องของตน โชคดีที่มีทางเลือกอื่นที่ให้พลังและความยืดหยุ่นมากกว่ารวมถึงการจัดการปัญหาต่างๆมากมายที่ระบุไว้ข้างต้น:

  • เป็นที่นิยมมากที่สุด: PHPMailer
  • คุณสมบัติในทำนองเดียวกัน: SwiftMailer
  • หรือแม้แต่พี่ ๆPEAR :: Mail .

ซึ่งทั้งหมดนี้สามารถใช้ร่วมกับเซิร์ฟเวอร์ / ผู้ให้บริการ SMTP ระดับมืออาชีพ (เนื่องจากแผนบริการเว็บโฮสติ้งที่ใช้ร่วมกันทั่วไปเมื่อ 08/15 จะถูกโจมตีหรือพลาดเมื่อพูดถึงการตั้งค่า / กำหนดค่าอีเมล)

39 er.irfankhan11 Jul 27 2015 at 21:01

เพิ่มส่วนหัวของเมลในฟังก์ชันเมล:

$header = "From: [email protected]\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 sonamgupta May 20 2015 at 20:23
  1. พยายามส่งส่วนหัวในฟังก์ชันเมลเสมอ
  2. หากคุณกำลังส่งเมลผ่าน localhost ให้ทำการตั้งค่า SMTP สำหรับการส่งเมล
  3. หากคุณส่งอีเมลผ่านเซิร์ฟเวอร์ให้ตรวจสอบว่าเปิดใช้งานคุณสมบัติการส่งอีเมลบนเซิร์ฟเวอร์ของคุณ
21 oneDerer Jul 09 2014 at 09:55

หากคุณใช้การกำหนดค่า SMTP ในการส่งอีเมลให้ลองใช้PHPMailerแทน คุณสามารถดาวน์โหลดห้องสมุดจากhttps://github.com/PHPMailer/PHPMailer

ฉันสร้างอีเมลเพื่อส่งด้วยวิธีนี้:

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 = "[email protected]";
    $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";
}
17 user1258544 Jul 09 2014 at 10:22

เพียงเพิ่มส่วนหัวก่อนส่งอีเมล:

<?php 
$name = $_POST['name'];
$email = $_POST['email'];
$message = $_POST['message'];
$from = 'From: yoursite.com'; 
$to = '[email protected]'; 
$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: [email protected]' . "\r\n" .
'Reply-To: [email protected]' . "\r\n" .
'X-Mailer: PHP/' . phpversion();

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

และอีกสิ่งหนึ่ง mail()ฟังก์ชั่นที่ไม่ได้ทำงานใน localhost อัปโหลดรหัสของคุณไปยังเซิร์ฟเวอร์และลอง

13 bat.t Sep 29 2015 at 21:25

มันใช้ได้กับฉันบน 000webhost โดยทำสิ่งต่อไปนี้:

$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";

ป้อนที่อยู่อีเมลโดยตรงเมื่อส่งอีเมล:

mail('[email protected]', $subject, $message, $headers)

การใช้งานและไม่ได้''""

รหัสนี้ใช้งานได้ แต่ได้รับอีเมลล่าช้าครึ่งชั่วโมง

10 Karthik Jun 23 2016 at 16:02

ส่วนใหญ่mail()ฟังก์ชันจะถูกปิดใช้งานในโฮสติ้งที่ใช้ร่วมกัน ตัวเลือกที่ดีกว่าคือใช้ SMTP ตัวเลือกที่ดีที่สุดคือ Gmail หรือ 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();
}
?>
9 iatboy Aug 05 2014 at 10:49

หากคุณใช้เพียงmail()ฟังก์ชันนี้คุณจะต้องกรอกไฟล์คอนฟิกูเรชันให้เสร็จสิ้น

คุณต้องเปิดส่วนขยายอีเมลและตั้งค่าSMTP smtp_portและอื่น ๆ และที่สำคัญที่สุดคือชื่อผู้ใช้และรหัสผ่านของคุณ หากไม่มีสิ่งนั้นจะไม่สามารถส่งจดหมายได้ นอกจากนี้คุณสามารถใช้PHPMailชั้นเรียนเพื่อส่ง

9 vldfr Feb 11 2015 at 22:20

ลองสองสิ่งนี้แยกกันและรวมกัน:

  1. ลบไฟล์ if($_POST['submit']){}
  2. ลบ$from(แค่ลำไส้ของฉัน)
8 StephenM Jan 03 2015 at 09:32

ฉันคิดว่านี่น่าจะเป็นเคล็ดลับ ฉันเพิ่งเพิ่มการif(issetเชื่อมต่อและเพิ่มการเชื่อมต่อกับตัวแปรในร่างกายเพื่อแยก PHP ออกจาก HTML

<?php
    $name = $_POST['name'];
    $email = $_POST['email'];
    $message = $_POST['message'];
    $from = 'From: yoursite.com'; 
    $to = '[email protected]'; 
    $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 Machavity May 20 2016 at 19:45

mailสำหรับทุกคนที่พบนี้ไปข้างหน้าไปผมจะไม่แนะนำให้ใช้ มีคำตอบบางอย่างที่ตรงกับสิ่งนี้ แต่ไม่ใช่เหตุผลของมัน

mailฟังก์ชันของ PHP ไม่เพียง แต่ทึบแสงเท่านั้น แต่ยังต้องอาศัยMTA ที่คุณใช้ (เช่นSendmail ) ในการทำงาน mailจะเพียงบอกคุณถ้าเอ็มทีล้มเหลวที่จะยอมรับมัน (เช่น Sendmail ลดลงเมื่อคุณพยายามที่จะส่ง) มันไม่สามารถบอกคุณได้ว่าจดหมายนั้นประสบความสำเร็จหรือไม่เพราะมันถูกส่งต่อไป ด้วยเหตุนี้ (เช่นรายละเอียดคำตอบของ John Conde ) ตอนนี้คุณสามารถเล่นกับบันทึกของ MTA และหวังว่ามันจะบอกคุณได้เพียงพอเกี่ยวกับความล้มเหลวในการแก้ไข หากคุณใช้โฮสต์ที่ใช้ร่วมกันหรือไม่มีสิทธิ์เข้าถึงบันทึก MTA คุณก็โชคไม่ดี น่าเศร้าที่ค่าเริ่มต้นสำหรับการติดตั้งวานิลลาส่วนใหญ่สำหรับ Linux จัดการด้วยวิธีนี้

ไลบรารีอีเมล ( PHPMailer , Zend Framework 2+ ฯลฯ ) ทำสิ่งที่แตกต่างจากmailไฟล์. พวกเขาเปิดซ็อกเก็ตโดยตรงไปยังเซิร์ฟเวอร์อีเมลที่รับจากนั้นส่งคำสั่งเมล SMTP โดยตรงผ่านซ็อกเก็ตนั้น กล่าวอีกนัยหนึ่งคลาสจะทำหน้าที่เป็น MTA ของตัวเอง (โปรดทราบว่าคุณสามารถบอกให้ไลบรารีใช้mailในการส่งอีเมลได้ในที่สุด แต่ฉันขอแนะนำอย่างยิ่งให้คุณไม่ทำเช่นนั้น)

ซึ่งหมายความว่าคุณสามารถดูการตอบสนองจากเซิร์ฟเวอร์ที่รับได้โดยตรง (ตัวอย่างเช่นใน PHPMailer คุณสามารถเปิดเอาต์พุตการดีบัก ) ไม่ต้องเดาอีกต่อไปว่าอีเมลส่งไม่สำเร็จหรือเพราะเหตุใด

หากคุณใช้ SMTP (เช่นคุณกำลังโทรisSMTP()) คุณสามารถรับการถอดเสียงโดยละเอียดของการสนทนา SMTP โดยใช้SMTPDebugคุณสมบัติ

ตั้งค่าตัวเลือกนี้โดยรวมบรรทัดเช่นนี้ในสคริปต์ของคุณ:

$mail->SMTPDebug = 2;

คุณยังได้รับประโยชน์จากอินเทอร์เฟซที่ดีขึ้น เมื่อmailคุณต้องตั้งค่าส่วนหัวไฟล์แนบและอื่น ๆ ทั้งหมดด้วยไลบรารีคุณมีฟังก์ชันเฉพาะสำหรับทำสิ่งนั้น นอกจากนี้ยังหมายความว่าฟังก์ชันกำลังทำส่วนที่ยุ่งยากทั้งหมด (เช่นส่วนหัว)

6 Chiragpatel Jul 13 2015 at 14:27
$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 dEsta88 Oct 07 2014 at 05:33

คุณสามารถใช้การตั้งค่าอีเมลโดยCodeIgniter ตัวอย่างเช่นการใช้SMTP (วิธีง่ายๆ):

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

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

ได้ผลสำหรับฉัน!

4 GauravSirauthiya Jun 23 2015 at 17:58

ลองทำตามนี้

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 JackCh Mar 20 2018 at 02:09

ปัญหาอาจเกิดจากการกำหนดค่าเมลเซิร์ฟเวอร์ เพื่อหลีกเลี่ยงปัญหาประเภทนี้หรือคุณจะได้ไม่ต้องกังวลเกี่ยวกับปัญหาเซิร์ฟเวอร์อีเมลผมขอแนะนำให้คุณใช้PHPMailer

เป็นปลั๊กอินที่มีทุกอย่างที่จำเป็นในการส่งเมลและสิ่งเดียวที่คุณต้องคำนึงถึงคือต้องเปิดใช้งานพอร์ต SMTP (พอร์ต: 25 และ 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 = '[email protected]';
    $mail->Password = 'contrasenia';
    $mail->SMTPSecure = 'ssl';
    $mail->Port = 465;

    // Recipients
    $mail->setFrom('[email protected]', 'my name');
    $mail->addAddress('[email protected]');

    // 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;
}
3 Daniel Sep 24 2017 at 10:50

ตรวจสอบให้แน่ใจว่าคุณได้ติดตั้ง Sendmail ในเซิร์ฟเวอร์ของคุณ

หากคุณตรวจสอบรหัสของคุณและตรวจสอบแล้วว่าไม่มีอะไรผิดปกติให้ไปที่ / var / mail และตรวจสอบว่าโฟลเดอร์นั้นว่างเปล่า

หากว่างคุณจะต้องทำ:

sudo apt-get install sendmail

หากคุณอยู่บนเซิร์ฟเวอร์ Ubuntu

3 aidangig Jan 31 2016 at 21:15

ก่อนอื่นคุณอาจมีพารามิเตอร์มากเกินไปสำหรับฟังก์ชัน mail () ... คุณสามารถมีได้สูงสุดห้า mail(to, subject, message, headers, parameters);

เท่าที่$fromตัวแปรไปโดยอัตโนมัติควรมาจากเว็บโฮสต์ของคุณถ้าใช้ลินุกซ์ของคุณcPanel โดยอัตโนมัติมาจากชื่อผู้ใช้ cPanel และที่อยู่ IP ของคุณ

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

ตรวจสอบว่าคุณมีลำดับตัวแปรที่ถูกต้องในฟังก์ชัน mail () ของคุณ

mail($to, $subject, $message, etc.)ในลำดับที่หรืออื่น ๆ ที่มีโอกาสของมันไม่ได้ทำงาน

3 JohnSlegers Feb 10 2016 at 20:23

หากคุณกำลังมีปัญหาในการส่งอีเมลด้วย PHP พิจารณาทางเลือกเช่นPHPMailerหรือSwiftMailer

ฉันมักจะใช้ SwiftMailer ทุกครั้งที่ต้องส่งอีเมลด้วย PHP


การใช้งานพื้นฐาน:

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('[email protected]' => 'Jane Doe'))
    // The to address(es)
    ->setTo(array('[email protected]' => '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);
}

ดูเอกสารอย่างเป็นทางการสำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีใช้ SwiftMailer

3 user3132194 Jun 21 2017 at 19:07

สำหรับผู้ที่ไม่ต้องการใช้เมลภายนอกและต้องการส่งเมล () บนเซิร์ฟเวอร์ Linux โดยเฉพาะ

วิธีวิธีอีเมล PHP, อธิบายไว้ในในส่วนphp.ini[mail function]

พารามิเตอร์sendmail-pathอธิบายวิธีการเรียก sendmail ค่าเริ่มต้นคือsendmail -t -iดังนั้นหากคุณได้รับการทำงานsendmail -t -i < message.txtในคอนโซล Linux - คุณจะเสร็จสิ้น คุณสามารถเพิ่มลงmail.logใน debug และต้องแน่ใจว่า mail () ถูกเรียกจริงๆ

MTA ที่แตกต่างกันสามารถใช้งานsendmailได้ พวกเขาเพียงแค่สร้างลิงก์สัญลักษณ์ไปยังไบนารีของพวกเขาในชื่อนั้น ยกตัวอย่างเช่นในDebianเริ่มต้นคือPostfix กำหนดค่า MTA sendmail -v -t -i < message.txtของคุณในการส่งจดหมายและการทดสอบได้จากคอนโซลด้วย ไฟล์message.txtควรมีส่วนหัวทั้งหมดของข้อความและเนื้อหาที่อยู่ปลายทางของซองจดหมายจะถูกนำมาจากTo:ส่วนหัว ตัวอย่าง:

From: [email protected]
To: [email protected]
Subject: Test mail via sendmail.

Text body.

ฉันชอบใช้ssmtpเป็น MTA เพราะมันง่ายและไม่ต้องการการรัน daemon ด้วยพอร์ตที่เปิด ssmtp เหมาะสำหรับการส่งเมลจากlocalhostเท่านั้น นอกจากนี้ยังสามารถส่งอีเมลที่ผ่านการรับรองความถูกต้องผ่านบัญชีของคุณในบริการไปรษณีย์สาธารณะ การติดตั้งและการกำหนดค่า ssmtp /etc/ssmtp/ssmtp.confแก้ไขไฟล์ เพื่อให้สามารถรับเมลระบบภายในไปยังบัญชี Unix (การแจ้งเตือนถึงรูทจากงาน cron เป็นต้น) กำหนดค่า/etc/ssmtp/revaliasesไฟล์

นี่คือการกำหนดค่าสำหรับบัญชีของฉันใน Yandex mail:

[email protected]
mailhub=smtp.yandex.ru:465
FromLineOverride=YES
UseTLS=YES
[email protected]
AuthPass=password
2 TonyLuigiC Apr 05 2017 at 08:09

สิ่งนี้จะส่งผลกระทบต่อผู้ใช้เพียงไม่กี่คน แต่ฉันต้องการบันทึกไว้สำหรับผู้ใช้จำนวนน้อยคนนั้น สมาชิกในกลุ่มเล็ก ๆ คนนี้ใช้เวลา 6 ชั่วโมงในการแก้ปัญหาสคริปต์เมล PHP ที่ใช้งานได้เนื่องจากปัญหานี้

หากคุณกำลังจะไปมหาวิทยาลัยที่เรียกใช้ XAMPP จาก www.AceITLab.com คุณควรรู้ว่าศาสตราจารย์ของเราไม่ได้บอกอะไรเรา: ไฟร์วอลล์ AceITLab (ไม่ใช่ไฟร์วอลล์ Windows) จะบล็อก MercuryMail ใน XAMPP คุณจะต้องใช้โปรแกรมรับส่งเมลอื่นแพร์กำลังทำงานให้เรา คุณจะต้องส่งไปยังบัญชี Gmail ที่มีการตั้งค่าความปลอดภัยต่ำ

ใช่ฉันรู้ว่านี่ไม่มีประโยชน์เลยสำหรับอีเมลในโลกแห่งความเป็นจริง อย่างไรก็ตามจากสิ่งที่ฉันได้เห็นการตั้งค่าทางวิชาการและโลกแห่งความเป็นจริงมักจะมีค่าเล็กน้อยที่เหมือนกัน

1 Ron Apr 01 2017 at 10:30

หากคุณกำลังเรียกใช้รหัสนี้บนเซิร์ฟเวอร์ภายใน (เช่นคอมพิวเตอร์ของคุณเพื่อการพัฒนา) จะไม่ส่งอีเมลไปยังผู้รับ มันจะสร้าง.txtไฟล์ในโฟลเดอร์ชื่อmailoutput.

ในกรณีที่คุณใช้บริการฟรี hosing เช่น000webhostหรือhostingerผู้ให้บริการเหล่านั้นจะปิดการใช้งานmail()ฟังก์ชันนี้เพื่อป้องกันการใช้อีเมลปลอมแปลงสแปมและอื่น ๆ โดยไม่ได้ตั้งใจฉันต้องการให้คุณติดต่อพวกเขาเพื่อดูว่าพวกเขารองรับคุณสมบัตินี้หรือไม่

หากคุณแน่ใจว่าผู้ให้บริการรองรับฟังก์ชัน mail () คุณสามารถตรวจสอบคู่มือ PHP นี้เพื่ออ้างอิงเพิ่มเติม

เมล PHP ()

ในการตรวจสอบสภาพอากาศบริการโฮสติ้งของคุณรองรับฟังก์ชัน mail () ให้ลองเรียกใช้รหัสนี้(อย่าลืมเปลี่ยนที่อยู่อีเมลของผู้รับ) :

<?php
    $to      = '[email protected]';
    $subject = 'the subject';
    $message = 'hello';
    $headers = 'From: [email protected]' . "\r\n" .
        'Reply-To: [email protected]' . "\r\n" .
        'X-Mailer: PHP/' . phpversion();

    mail($to, $subject, $message, $headers);
?>
1 BadLoser Aug 21 2019 at 16:14

การติดตั้ง Sendmailสำหรับ Debian 10.0.0 ('Buster') เป็นเรื่องเล็กน้อย!

php.ini

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

การติดตั้งแพ็คเกจsendmailมาตรฐาน(อนุญาตให้ 'ส่ง'):

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

คำสั่งที่มีประโยชน์อื่น ๆ :

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

การยืนยัน (ความสามารถในการส่ง)

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

ข้างต้นใช้เวลาประมาณ 5 นาที จากนั้นฉันเสียเวลาไป 5 ชั่วโมง ... อย่าลืมตรวจสอบโฟลเดอร์สแปมของคุณ !

SuReSh Apr 28 2015 at 13:08

มีความเป็นไปได้หลายประการ:

  1. คุณกำลังประสบปัญหาเซิร์ฟเวอร์ เซิร์ฟเวอร์ไม่มีเมลเซิร์ฟเวอร์ใด ๆ ดังนั้นอีเมลของคุณจึงใช้งานไม่ได้เนื่องจากรหัสของคุณใช้ได้และอีเมลใช้งานได้กับประเภท

  2. คุณไม่ได้รับค่าที่โพสต์ ลองใช้รหัสของคุณด้วยค่าคงที่

  3. ใช้เมล SMTP ในการส่งเมล ...

krishna Dec 23 2018 at 21:25

คุณสามารถดูข้อผิดพลาดของคุณได้โดย:

error_reporting(E_ALL);

และรหัสตัวอย่างของฉันคือ:

<?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 = '[email protected]';  // SMTP username
    $mail->Password = 'password';           // SMTP password
    $mail->SMTPSecure = 'tls';              // Enable encryption, 'ssl' also accepted

    $mail->From = '[email protected]';
    $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';
?>
ofricofri Aug 16 2020 at 08:44

หากคุณติดอยู่กับแอปที่โฮสต์บน Hostgator นี่คือสิ่งที่ช่วยแก้ปัญหาของฉันได้ ขอบคุณมากสำหรับคนที่โพสต์วิธีแก้ปัญหาโดยละเอียด ในกรณีที่ลิงก์ออฟไลน์ในวันหนึ่งคุณจะมีข้อมูลสรุป:

  • มองหาเส้นทาง sendmail ในเซิร์ฟเวอร์ของคุณ <?php phpinfo(); ?>วิธีง่ายๆในการตรวจสอบคือการเขียนโค้ดต่อไปนี้เป็นการชั่วคราวในหน้าเท่านั้นที่คุณจะเข้าถึงการอ่านข้อมูลที่สร้างไปนี้: sendmail pathเปิดหน้านี้และมองหา (จากนั้นอย่าลืมลบรหัสนี้!)
  • ปัญหาและการแก้ไข:หากเส้นทางการส่งอีเมลของคุณบอกอย่างเดียว-t -iให้แก้ไขเซิร์ฟเวอร์ของคุณphp.iniและเพิ่มบรรทัดต่อไปนี้:sendmail_path = /usr/sbin/sendmail -t -i;

แต่หลังจากสามารถส่งอีเมลด้วยmail()ฟังก์ชันPHP ฉันได้เรียนรู้ว่ามันส่งอีเมลที่ไม่ผ่านการรับรองความถูกต้องสิ่งที่สร้างปัญหาอีกครั้ง อีเมลทั้งหมดตกอยู่ในกล่องเมลขยะของ Hotmail ของฉันและอีเมลบางฉบับไม่เคยถูกส่งซึ่งฉันเดาว่าเกี่ยวข้องกับการที่พวกเขาไม่ได้รับการรับรองความถูกต้อง นั่นเป็นเหตุผลที่ฉันตัดสินใจเปลี่ยนจากmail()เป็นPHPMailerSMTP ในที่สุด