Надсилання електронної пошти з PHP з SMTP-сервера


131
$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, які не потребують підтвердження, або я повинен сам налаштувати сервер?

Відповіді:


168

Коли ви надсилаєте повідомлення електронною поштою через сервер, на якому потрібен 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'гачка дій. Це зручний спосіб налаштування WordPress для SMTP пошти або Amazon SES (який підтримує SMTP-з'єднання).
Метт ван Андель

1
Чи дозволено використовувати PHP Mailer у платних сценаріях?
Лука

2
@Luka Так, так. Відповідно до їх ліцензійного файлу PHPMailer використовує ліцензію LGPL 2.1, яка дозволяє комерційне використання.
Алехандро

Чи потрібно робити щось особливе, щоб використовувати цей код? Куди я це кладу? Чи можу я назвати його формою HTML5 із запитом POST? Як мені надіслати електронний лист, коли я створив цей об’єкт PHPMailer?
Аарон Франке

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. Чи знаєте ви про будь-яке відкрите поштове реле.
Борут Фліс

1
Додатково див. Support.google.com/a/answer/176600?hl=uk щодо реле 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"

Тоді навіть функція низької пошти () може працювати з добротою SMTP. Це дуже корисно, якщо ви намагаєтесь підключити існуючий додаток до поштових служб, таких як sendgrid або mandrill, не змінюючи додаток.


1
Чудове рішення, використовуйте його на декількох серверах зараз!
раса

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, не дозволяє здійснювати пряме з'єднання без будь-яких облікових даних або ключів. Ви можете налаштувати віртуальну машину або використовувати один, розташований у вашій локальній мережі. У більшості дистрибутивів Linux немає поштового сервера. Налаштуйте це та отримайте задоволення. Я використовую exim4 за замовчуванням на Debian 7, який слухає його інтерфейс LAN.
  3. Бібліотеки розсилки використовують прямі з'єднання. Губи простіше налаштувати. Я використовував SwiftMailer, і він ідеально надсилає пошту з облікового запису Gmail. Я думаю, що PHPMailer теж непоганий.

Незалежно від того, який вибір ви вибрали, я рекомендую вам використовувати якийсь шар абстракції. Ви можете використовувати бібліотеку PHP на своїй розробній машині під управлінням Windows і просто mail()функціонувати на виробничій машині з Linux. Шар абстракції дозволяє обмінюватися поштовими драйверами залежно від системи, на якій працює ваша програма. Створіть абстрактний 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 Gmail, не забудьте ввімкнути SMTP у своєму акаунті Gmail у розділі "Налаштування"

EDIT: Якщо ви не можете знайти 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
need_once ('/usr/share/somewhere/Mail.php');

10

Є деякі SMTP-сервери, які працюють без автентифікації, але якщо сервер вимагає автентифікації, немає можливості цього обійти.

Функції вбудованої пошти PHP дуже обмежені - уточнення SMTP-сервера можливе лише в WIndows. On * nix, 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ǝʞ
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.