การส่งอีเมลด้วย PHP จากเซิร์ฟเวอร์ SMTP


132
$from = "someonelse@example.com";
$headers = "From:" . $from;
echo mail ("borutflis1@gmail.com" ,"testmailfunction" , "Oj",$headers);

ฉันมีปัญหาในการส่งอีเมลใน PHP ฉันได้รับข้อผิดพลาด: SMTP server response: 530 SMTP authentication is required.

ฉันรู้สึกว่าคุณสามารถส่งอีเมลได้โดยไม่ต้องใช้ SMTP เพื่อยืนยัน ฉันรู้ว่าอีเมลนี้จะถูกกรองออกไป แต่ตอนนี้ไม่สำคัญ

[mail function]
; For Win32 only.
; http://php.net/smtp
SMTP = localhost
; http://php.net/smtp-port
smtp_port = 25

; For Win32 only.
; http://php.net/sendmail-from
sendmail_from = someonelse@example.com

นี่คือการตั้งค่าในphp.iniไฟล์ ฉันจะตั้งค่า SMTP ได้อย่างไร? มีเซิร์ฟเวอร์ SMTP ที่ไม่ต้องมีการตรวจสอบยืนยันหรือต้องตั้งค่าเซิร์ฟเวอร์ด้วยตนเองหรือไม่?

คำตอบ:


169

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

ตัวอย่างเช่นฉันมักจะใช้ PHPMailer ที่มีการตั้งค่าคล้ายกับตัวนี้:

$mail = new PHPMailer();

// Settings
$mail->IsSMTP();
$mail->CharSet = 'UTF-8';

$mail->Host       = "mail.example.com"; // SMTP server example
$mail->SMTPDebug  = 0;                     // enables SMTP debug information (for testing)
$mail->SMTPAuth   = true;                  // enable SMTP authentication
$mail->Port       = 25;                    // set the SMTP port for the GMAIL server
$mail->Username   = "username"; // SMTP account username example
$mail->Password   = "password";        // SMTP account password example

// Content
$mail->isHTML(true);                                  // Set email format to HTML
$mail->Subject = 'Here is the subject';
$mail->Body    = 'This is the HTML message body <b>in bold!</b>';
$mail->AltBody = 'This is the body in plain text for non-HTML mail clients';

$mail->send();

คุณสามารถค้นหาเพิ่มเติมเกี่ยวกับ PHPMailer ได้ที่นี่: https://github.com/PHPMailer/PHPMailer


21
+1 สำหรับ phpMailer - เป็นทางเลือกของบุคคลที่มีสติสำหรับmail()ฟังก์ชันในตัวของ PHP
— SDC

8
เป็นที่น่าสังเกตสำหรับผู้ที่สะดุดกับคำตอบนี้ว่า PHPMailer ถูกสร้างขึ้นใน WordPress และสามารถกำหนดค่าได้โดยใช้'phpmailer_init'action hook เป็นวิธีที่สะดวกในการตั้งค่า WordPress สำหรับเมล SMTP หรือ Amazon SES (ซึ่งรองรับการเชื่อมต่อ SMTP)
— Matt van Andel

1
PHP Mailer อนุญาตให้ใช้ในสคริปต์แบบชำระเงินหรือไม่?
— Luka

2
@ ลูก้าใช่เลย ตามไฟล์ลิขสิทธิ์ PHPMailer ใช้ใบอนุญาต LGPL 2.1 ซึ่งอนุญาตให้ใช้งานเชิงพาณิชย์ได้
— Alejandro

ฉันต้องทำอะไรเป็นพิเศษเพื่อใช้รหัสนี้หรือไม่? ฉันจะวางสิ่งนี้ไว้ที่ไหน? ฉันสามารถเรียกใช้แบบฟอร์ม HTML5 พร้อมคำขอ POST ได้หรือไม่ ฉันจะส่งอีเมลได้อย่างไรเมื่อฉันสร้างวัตถุ PHPMailer นี้
— Aaron Franke

53
<?php
ini_set("SMTP", "aspmx.l.google.com");
ini_set("sendmail_from", "YOURMAIL@gmail.com");

$message = "The mail message was sent with the following mail setting:\r\nSMTP = aspmx.l.google.com\r\nsmtp_port = 25\r\nsendmail_from = YourMail@address.com";

$headers = "From: YOURMAIL@gmail.com";

mail("Sending@provider.com", "Testing", $message, $headers);
echo "Check your email now....&lt;BR/>";
?>

หรือสำหรับรายละเอียดเพิ่มเติมอ่านต่อ


IP ที่คุณใช้ในการส่งอีเมลไม่ได้รับอนุญาตให้ 550-5.7.1 ส่งอีเมลโดยตรงไปยังเซิร์ฟเวอร์ของเรา ฉันได้รับข้อผิดพลาดนี้ ทั้งหมดที่ฉันต้องการคือรีเลย์เมลแบบเปิด
— Borut Flis

ฉันไม่มี IP แบบคงที่ คุณรู้จักรีเลย์ Open mail หรือไม่
— Borut Flis

1
นอกจากนี้โปรดดูsupport.google.com/a/answer/176600?hl=thสำหรับรีเลย์ SMTP ของ Google
— fyrye

5
นี่คือคำตอบที่ดีที่สุดสำหรับphp mail()ปัญหาเกี่ยวกับฟังก์ชันของGoDaddy - 2017 - ไม่ควรดาวน์โหลด PHPMailer หรือแหล่งข้อมูลของบุคคลที่สามอื่น ๆ - ขอบคุณ
— soulshined

4
ลิงก์ "อ่านต่อ" เสีย
— vladkras

46

สำหรับผู้ใช้ Unix mail () ใช้คำสั่งSendmailในการส่งอีเมล แทนที่จะแก้ไขแอปพลิเคชันคุณสามารถเปลี่ยนสภาพแวดล้อมได้ msmtpเป็นไคลเอนต์ SMTP ที่มีไวยากรณ์ CLI ที่เข้ากันได้กับ Sendmail ซึ่งหมายความว่าสามารถใช้แทน Sendmail ได้ ต้องการเพียงการเปลี่ยนแปลงเล็กน้อยกับ php.ini ของคุณ

sendmail_path = "/usr/bin/msmtp -C /path/to/your/config -t"

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


1
ทางออกที่ยอดเยี่ยมใช้กับเซิร์ฟเวอร์หลายเครื่องได้ทันที!
— raice

3
การนำสิ่งนี้ไปใช้บนคอนเทนเนอร์ Docker ของฉันสำหรับแอปที่ไม่ใช้ไลบรารีการส่งจดหมาย
— Batandwa

เส้นทางการโยกย้ายที่ยอดเยี่ยมจากวานิลลาmail()ไปยังสิ่งที่รองรับ SMTP ขอบคุณ!
— rinogo

MSMTP สามารถใช้ได้กับ Windows การดาวน์โหลดที่ชัดเจนมีเวอร์ชัน 1.4 เวอร์ชันที่ฉันพบคือ 1.6.2 ไม่ทราบว่ามี 1.8.6 สำหรับ Windows
— บิลโบ

ผู้เขียนหยุดให้บริการไบนารีของ Windows ก่อน 2016 กุมภาพันธ์
— บิลโบ

17

ปัญหาคือmail()ฟังก์ชันPHP มีฟังก์ชันการทำงานที่ จำกัด มาก มีหลายวิธีในการส่งอีเมลจาก PHP

  1. mail()ใช้เซิร์ฟเวอร์ SMTP บนระบบของคุณ : มีอย่างน้อยสองเซิร์ฟเวอร์คุณสามารถใช้บน Windows เป็นhMailServerและXMail ฉันใช้เวลาหลายชั่วโมงในการกำหนดค่าและเริ่มต้นใช้งาน อย่างแรกง่ายกว่าในความคิดของฉัน ตอนนี้ hMailServer กำลังทำงานบน Windows 7 x64
  2. mail()ใช้เซิร์ฟเวอร์ SMTP บนเครื่องระยะไกลหรือเสมือนกับ Linux แน่นอนว่าบริการอีเมลจริงเช่น Gmail ไม่อนุญาตให้เชื่อมต่อโดยตรงโดยไม่มีข้อมูลรับรองหรือคีย์ใด ๆ คุณสามารถตั้งค่าเครื่องเสมือนหรือใช้เครื่องที่อยู่ใน LAN ของคุณ linux distros ส่วนใหญ่มีเซิร์ฟเวอร์เมลนอกกรอบ กำหนดค่าและสนุก ฉันใช้ exim4 เริ่มต้นบน Debian 7 ที่ฟังอินเตอร์เฟส LAN
  3. ไลบรารีการส่งจดหมายใช้การเชื่อมต่อโดยตรง Libs ตั้งค่าได้ง่ายกว่า ฉันใช้ SwiftMailer และส่งอีเมลจากบัญชี Gmail ได้อย่างสมบูรณ์แบบ ฉันคิดว่า PHPMailer ก็ค่อนข้างดีเช่นกัน

ไม่ว่าคุณจะเป็นทางเลือกใดฉันขอแนะนำให้คุณใช้เลเยอร์นามธรรม คุณสามารถใช้ไลบรารี PHP บนเครื่องพัฒนาของคุณที่ใช้ Windows และmail()ทำงานบนเครื่องผลิตด้วย Linux เลเยอร์ Abstraction ช่วยให้คุณสามารถแลกเปลี่ยนไดรเวอร์เมลได้ขึ้นอยู่กับระบบที่แอปพลิเคชันของคุณกำลังทำงานอยู่ สร้างMyMailerคลาสนามธรรมหรือส่วนต่อประสานด้วยsend()วิธีนามธรรม สืบทอดสองคลาสMyPhpMailerและMySwiftMailer. ใช้send()วิธีการในรูปแบบที่เหมาะสม


17

นี่คือวิธีการใช้ PHP PEAR

// Pear Mail Library
require_once "Mail.php";

$from = '<your@mail.com>'; //change this to your email address
$to = '<someone@mail.com>'; // change to address
$subject = 'Insert subject here'; // subject of mail
$body = "Hello world! this is the content of the email"; //content of mail

$headers = array(
    'From' => $from,
    'To' => $to,
    'Subject' => $subject
);

$smtp = Mail::factory('smtp', array(
        'host' => 'ssl://smtp.gmail.com',
        'port' => '465',
        'auth' => true,
        'username' => 'your@gmail.com', //your gmail account
        'password' => 'snip' // your password
    ));

// Send the mail
$mail = $smtp->send($to, $headers, $body);

//check mail sent or not
if (PEAR::isError($mail)) {
    echo '<p>'.$mail->getMessage().'</p>';
} else {
    echo '<p>Message successfully sent!</p>';
}

หากคุณใช้ Gmail SMTP อย่าลืมเปิดใช้งาน SMTP ในบัญชี Gmail ของคุณภายใต้การตั้งค่า

แก้ไข: หากคุณไม่พบ Mail.php บน debian / ubuntu คุณสามารถติดตั้ง php-pear ด้วย

sudo apt install php-pear

จากนั้นติดตั้งส่วนขยายอีเมล:

sudo pear install mail
sudo pear install Net_SMTP
sudo pear install Auth_SASL
sudo pear install mail_mime

จากนั้นคุณจะสามารถโหลดได้โดยที่require_once "Mail.php" อื่นซึ่งอยู่ที่นี่:/usr/share/php/Mail.php


1
Require_once ('/usr/share/somewhere/Mail.php');

10

มีเซิร์ฟเวอร์ SMTP บางตัวที่ทำงานโดยไม่มีการพิสูจน์ตัวตน แต่ถ้าเซิร์ฟเวอร์ต้องการการพิสูจน์ตัวตนก็ไม่มีทางหลีกเลี่ยงสิ่งนั้นได้

ฟังก์ชันเมลในตัวของ PHP มีข้อ จำกัด มาก - การระบุเซิร์ฟเวอร์ SMTP ทำได้ใน WIndows เท่านั้น บน * nix mail()จะใช้ไบนารีของระบบปฏิบัติการ

หากคุณต้องการส่ง E-mail ไปยังเซิร์ฟเวอร์ SMTP โดยพลการในสุทธิพิจารณาการใช้ห้องสมุดเช่นSwiftMailer ซึ่งจะช่วยให้คุณสามารถใช้ตัวอย่างเช่นเซิร์ฟเวอร์ขาออกของ Google Mail


2

ในกรณีที่คุณโฮสต์ไซต์ Wordpress บน Linux และมีการเข้าถึงเซิร์ฟเวอร์คุณสามารถลดอาการปวดหัวได้โดยการติดตั้ง msmtp ซึ่งช่วยให้คุณส่งผ่าน smtp จากฟังก์ชัน php mail () มาตรฐาน msmtp เป็นทางเลือกที่ง่ายกว่าสำหรับ postfix ซึ่งต้องการการกำหนดค่าเพิ่มเติมเล็กน้อย

ขั้นตอนมีดังนี้

ติดตั้ง msmtp

sudo apt-get install msmtp-mta ca-certificates

สร้างไฟล์กำหนดค่าใหม่:

sudo nano /etc/msmtprc

... ด้วยข้อมูลการกำหนดค่าต่อไปนี้:

# Set defaults.    
defaults

# Enable or disable TLS/SSL encryption.
tls on
tls_starttls on
tls_trust_file /etc/ssl/certs/ca-certificates.crt

# Set up a default account's settings.
account default
host <smtp.example.net>
port 587
auth on
user <username@example.net>
password <password>
from <address-to-receive-bounces@example.net>
syslog LOG_MAIL

คุณต้องแทนที่ข้อมูลการกำหนดค่าที่แสดงโดยทุกอย่างภายใน "<" และ ">" (รวมลบสิ่งเหล่านี้) สำหรับโฮสต์ / ชื่อผู้ใช้ / รหัสผ่านให้ใช้ข้อมูลรับรองปกติของคุณในการส่งอีเมลผ่านผู้ให้บริการอีเมลของคุณ

บอกให้ใช้ PHP

sudo nano /etc/php5/apache2/php.ini

เพิ่มบรรทัดเดียวนี้:

sendmail_path = /usr/bin/msmtp -t

ดูเอกสารฉบับสมบูรณ์ได้ที่นี่:

https://marlam.de/msmtp/


ssmtp ยังเป็นโซลูชันโปรดดู (คู่มือภาษาฝรั่งเศส): elliptips.info/guide-debian-7-envoi-de-mails-ligne-de-commande
— ıɾuǝʞ

0

สำหรับแนวทางอื่นคุณสามารถใช้ไฟล์เช่นนี้:

From: Sunday <sunday@gmail.com>
To: Monday <monday@gmail.com>
Subject: Day

Tuesday Wednesday

แล้วส่งแบบนี้:

<?php
$a1 = ['monday@gmail.com'];
$r1 = fopen('a.txt', 'r');
$r2 = curl_init('smtps://smtp.gmail.com');
curl_setopt($r2, CURLOPT_MAIL_RCPT, $a1);
curl_setopt($r2, CURLOPT_NETRC, true);
curl_setopt($r2, CURLOPT_READDATA, $r1);
curl_setopt($r2, CURLOPT_UPLOAD, true);
curl_exec($r2);

https://php.net/function.curl-setopt

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.