Отправка электронной почты с помощью 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, вам действительно нужно указать его и установить хост, имя пользователя и пароль (и, возможно, порт, если он не является стандартным - 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. Вы знаете какой-нибудь открытый почтовый ретранслятор.
— Borut Flis

1
Дополнительно см. Support.google.com/a/answer/176600?hl=en для реле SMTP Google.
— fyrye 05

5
Это лучший ответ на проблемы с php mail()функцией godaddy - 2017 - не нужно загружать PHPMailer или какой-либо другой сторонний ресурс - спасибо
— soulshined

4
Ссылка "READ ON" не работает
— vladkras 07

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, не допускает прямого подключения без каких-либо учетных данных или ключей. Вы можете настроить виртуальную машину или использовать ее в своей локальной сети. В большинстве дистрибутивов 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, не забудьте включить 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()будет использовать двоичные файлы ОС.

Если вы хотите отправить электронную почту на произвольный 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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.