การส่งอีเมลด้วย 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.