Отправка электронной почты с помощью 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, без изменения приложения.

txyoji
источник
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

Стивен Пенни
источник