Gửi email với PHP từ máy chủ SMTP


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

Tôi gặp khó khăn khi gửi email trong PHP. Tôi gặp lỗi : SMTP server response: 530 SMTP authentication is required.

Tôi có ấn tượng rằng bạn có thể gửi email mà không cần xác minh. Tôi biết rằng thư này sẽ được lọc ra, nhưng điều đó không thành vấn đề ngay bây giờ.

[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

Đây là thiết lập trong php.initập tin. Tôi nên thiết lập SMTP như thế nào? Có máy chủ SMTP nào không yêu cầu xác minh hay tôi phải tự thiết lập máy chủ?

Câu trả lời:


168

Khi bạn đang gửi e-mail thông qua một máy chủ yêu cầu SMTP Auth, bạn thực sự cần chỉ định nó và đặt máy chủ, tên người dùng và mật khẩu (và có thể là cổng nếu nó không phải là mặc định - 25).

Ví dụ: tôi thường sử dụng PHPMailer với các cài đặt tương tự với các cài đặt này:

$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();

Bạn có thể tìm hiểu thêm về PHPMailer tại đây: https://github.com/PHPMailer/PHPMailer


21
+1 cho phpMailer - đó là người lành mạnh thay thế cho mail()chức năng tích hợp sẵn của PHP .
SDC

8
Thật đáng chú ý cho những người vấp phải câu trả lời này rằng PHPMailer cũng được tích hợp vào WordPress và có thể được cấu hình bằng cách sử dụng 'phpmailer_init'hook hành động. Đây là một cách thuận tiện để thiết lập WordPress cho thư SMTP hoặc Amazon SES (hỗ trợ kết nối SMTP).
Matt van Andel

1
PHP Mailer có được phép sử dụng trong các tập lệnh trả phí không?
Luka

2
@Luka Vâng, đúng vậy. Theo tệp giấy phép của họ, PHPMailer sử dụng giấy phép LGPL 2.1, cho phép sử dụng thương mại.
Alejandro

Tôi có cần phải làm gì đặc biệt để sử dụng mã này không? Tôi để cái này ở đâu? Tôi có thể gọi nó bằng biểu mẫu HTML5 với yêu cầu POST không? Làm cách nào để gửi Email sau khi tôi tạo đối tượng PHPMailer này?
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/>";
?>

hoặc, để biết thêm chi tiết, đọc tiếp .


IP bạn đang sử dụng để gửi thư không được ủy quyền cho 550-5.7.1 gửi email trực tiếp đến máy chủ của chúng tôi. Tôi nhận được lỗi này. tất cả những gì tôi muốn là một chuyển tiếp thư mở.
Borut Flis

Tôi không có IP tĩnh. Bạn có biết bất kỳ chuyển tiếp thư mở.
Borut Flis

1
Ngoài ra, hãy xem support.google.com/a(/666600?hl=vi để biết các rơle google SMTP.
fyrye

5
Đây là câu trả lời tốt nhất cho php mail()các vấn đề về chức năng của Godaddy - 2017 - không cần phải tải xuống PHPMailer hoặc một số tài nguyên bên thứ 3 khác - cảm ơn
soulshined

4
Liên kết "ĐỌC TRÊN" bị hỏng
vladkras

46

Đối với người dùng Unix, mail () thực sự sử dụng lệnh Sendmail để gửi email. Thay vì sửa đổi ứng dụng, bạn có thể thay đổi môi trường. msmtp là một máy khách SMTP với cú pháp CLI tương thích Sendmail, có nghĩa là nó có thể được sử dụng thay cho Sendmail. Nó chỉ yêu cầu một thay đổi nhỏ đối với php.ini của bạn.

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

Sau đó, ngay cả hàm mail () thấp cũng có thể hoạt động với độ tốt của SMTP. Sẽ rất hữu ích nếu bạn đang cố gắng kết nối một ứng dụng hiện có với các dịch vụ thư như sendgrid hoặc mandrill mà không sửa đổi ứng dụng.


1
Giải pháp tuyệt vời, sử dụng nó trên nhiều máy chủ ngay bây giờ!
raice

3
Triển khai điều này trên các container Docker của tôi cho các ứng dụng không sử dụng thư viện gửi thư.
Batandwa

Đường di chuyển tuyệt vời từ vanilla mail()đến một cái gì đó hỗ trợ SMTP. Cảm ơn bạn!
rinogo

MSMTP cũng có sẵn cho Windows. Các bản tải xuống rõ ràng có phiên bản 1.4. Phiên bản tôi tìm thấy ở đâu đó là 1.6.2. Không biết có bản 1.8.6 cho Windows không.
Bilbo

Tác giả đã ngừng cung cấp nhị phân Windows trước tháng 2 năm 2016.
Bilbo

17

Vấn đề là mail()chức năng PHP có chức năng rất hạn chế. Có một số cách để gửi thư từ PHP.

  1. mail()sử dụng máy chủ SMTP trên hệ thống của bạn. Có ít nhất hai máy chủ bạn có thể sử dụng trên Windows: hMailServerxmail . Tôi đã dành vài giờ để cấu hình và nhận được chúng. Đầu tiên là đơn giản hơn theo ý kiến ​​của tôi. Ngay bây giờ, hMailServer đang hoạt động trên Windows 7 x64.
  2. mail()sử dụng máy chủ SMTP trên máy từ xa hoặc ảo với Linux. Tất nhiên, dịch vụ thư thực như Gmail không cho phép kết nối trực tiếp mà không có bất kỳ thông tin xác thực hoặc khóa nào. Bạn có thể thiết lập máy ảo hoặc sử dụng một máy nằm trong mạng LAN của bạn. Hầu hết các distro linux có máy chủ mail ra khỏi hộp. Cấu hình nó và vui chơi. Tôi sử dụng exim4 mặc định trên Debian 7 để nghe giao diện LAN của nó.
  3. Thư viện gửi thư sử dụng kết nối trực tiếp. Libs dễ dàng hơn để thiết lập. Tôi đã sử dụng SwiftMailer và nó hoàn toàn gửi thư từ tài khoản Gmail. Tôi nghĩ rằng PHPMailer cũng khá tốt.

Bất kể lựa chọn nào là của bạn, tôi khuyên bạn nên sử dụng một số lớp trừu tượng. Bạn có thể sử dụng thư viện PHP trên máy phát triển chạy Windows và chỉ cần mail()hoạt động trên máy sản xuất với Linux. Lớp trừu tượng cho phép bạn trao đổi trình điều khiển thư tùy thuộc vào hệ thống mà ứng dụng của bạn đang chạy. Tạo MyMailerlớp trừu tượng hoặc giao diện với send()phương thức trừu tượng . Kế thừa hai lớp MyPhpMailerMySwiftMailer. Thực hiện send()phương pháp theo những cách thích hợp.


17

Đây là một cách để làm điều đó với 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>';
}

Nếu bạn sử dụng Gmail SMTP, hãy nhớ bật SMTP trong tài khoản Gmail của bạn, trong cài đặt

EDIT: Nếu bạn không thể tìm thấy Mail.php trên debian / ubfox, bạn có thể cài đặt php-pear với

sudo apt install php-pear

Sau đó cài đặt phần mở rộng thư:

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

Sau đó, bạn sẽ có thể tải nó bằng cách đơn giản là require_once "Mail.php" nó được đặt ở đây:/usr/share/php/Mail.php


1
Yêu cầu ('/usr/share/somewhere/Mail.php');

10

Có một số máy chủ SMTP hoạt động mà không cần xác thực, nhưng nếu máy chủ yêu cầu xác thực, không có cách nào để phá vỡ điều đó.

Các chức năng thư tích hợp của PHP rất hạn chế - chỉ có thể chỉ định máy chủ SMTP trong WUsows. Trên * nix,mail() sẽ sử dụng nhị phân của HĐH.

Nếu bạn muốn gửi E-Mail đến một máy chủ SMTP tùy ý trên mạng, hãy xem xét sử dụng một thư viện như SwiftMailer . Điều đó sẽ cho phép bạn sử dụng, ví dụ: các máy chủ gửi đi của Google Mail.


2

Trong trường hợp bạn đang lưu trữ một trang Wordpress trên Linux và có quyền truy cập máy chủ, bạn có thể tiết kiệm một số vấn đề đau đầu bằng cách cài đặt msmtp cho phép bạn gửi qua smtp từ hàm php mail () tiêu chuẩn. msmtp là một thay thế đơn giản hơn cho postfix đòi hỏi cấu hình nhiều hơn một chút.

Dưới đây là các bước:

Cài đặt msmtp

sudo apt-get install msmtp-mta ca-certificates

Tạo một tệp cấu hình mới:

sudo nano /etc/msmtprc

... với thông tin cấu hình sau:

# 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

Bạn cần thay thế dữ liệu cấu hình được đại diện bởi mọi thứ trong "<" và ">" (đã bao gồm, loại bỏ những dữ liệu này). Đối với máy chủ / tên người dùng / mật khẩu, hãy sử dụng thông tin đăng nhập bình thường của bạn để gửi thư thông qua nhà cung cấp thư của bạn.

Nói với PHP để sử dụng nó

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

Thêm dòng duy nhất này:

sendmail_path = /usr/bin/msmtp -t

Tài liệu đầy đủ có thể được tìm thấy ở đây:

https://marlam.de/msmtp/


ssmtp cũng là một giải pháp xem (hướng dẫn tiếng Pháp): elliptips.info/guide-debian-7-envoi-de-mails-ligne-de-commande
ıɾuǝʞ
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.