Отправка электронной почты с помощью PHP с SMTP-сервера

$from = "[email protected]";
$headers = "From:" . $from;
echo mail ("[email protected]" ,"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 = [email protected]

Это настройка в файле php.ini. Как настроить SMTP? Существуют ли какие-либо SMTP-серверы, которые не требуют проверки, или я должен сам настроить сервер?

Ответ 1

Когда вы отправляете электронное письмо через сервер, которому требуется 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

Ответ 2

<?php
ini_set("SMTP", "aspmx.l.google.com");
ini_set("sendmail_from", "[email protected]");

$message = "The mail message was sent with the following mail setting:\r\nSMTP = aspmx.l.google.com\r\nsmtp_port = 25\r\nsendmail_from = [email protected]";

$headers = "From: [email protected]";

mail("[email protected]", "Testing", $message, $headers);
echo "Check your email now....&lt;BR/>";
?>

или, для более подробной информации, читайте дальше.

Ответ 3

Для пользователей Unix, mail() фактически использует команду Sendmail для отправки электронной почты. Вместо изменения приложения вы можете изменить среду. msmtp - это SMTP-клиент с синтаксисом CLI, совместимым с Sendmail, что означает, что он может использоваться вместо Sendmail. Это требует только небольшого изменения вашего php.ini.

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

Тогда даже функция lowly mail() может работать с поддержкой SMTP. Это очень полезно, если вы пытаетесь подключить существующее приложение к почтовым службам, таким как sendgrid или mandrill, без изменения приложения.

Ответ 4

Вот способ сделать это с PHP PEAR

// Pear Mail Library
require_once "Mail.php";

$from = '<[email protected]>'; //change this to your email address
$to = '<[email protected]>'; // 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' => '[email protected]', //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>';
}

Если вы используете SMTP Gmail, не забудьте включить SMTP в своей учетной записи Gmail, в настройках

Ответ 5

Проблема в том, что функция PHP mail() имеет очень ограниченную функциональность. Существует несколько способов отправки почты с PHP.

  • mail() использует SMTP-сервер в вашей системе. В Windows можно использовать как минимум два сервера: hMailServer и xmail. Я провел несколько часов, настраивая и поднимая их. На мой взгляд, первый из них проще. Сейчас hMailServer работает с Windows 7 x64.
  • mail() использует SMTP-сервер на удаленной или виртуальной машине с Linux. Конечно, реальная почтовая служба, такая как Gmail, не позволяет прямое соединение без каких-либо учетных данных или ключей. Вы можете настроить виртуальную машину или использовать ее в локальной сети. Большинство дистрибутивов Linux имеют почтовый сервер из коробки. Настройте его и получайте удовольствие. Я использую exim4 по умолчанию на Debian 7, который прослушивает его интерфейс LAN.
  • Библиотеки рассылки используют прямые подключения. Libs легче настроить. Я использовал SwiftMailer, и он отлично отправляет почту из учетной записи Gmail. Я думаю, что PHPMailer тоже хорош.

Независимо от вашего выбора, я рекомендую вам использовать некоторый уровень абстракции. Вы можете использовать библиотеку PHP на своей машине разработки под управлением Windows и просто mail() на производственной машине с Linux. Уровень абстракции позволяет вам обменивать почтовые драйверы в зависимости от системы, в которой работает ваше приложение. Создайте абстрактный класс MyMailer или интерфейс с абстрактным методом send(). Наследуем два класса MyPhpMailer и MySwiftMailer. Внедрите метод send() соответствующим образом.

Ответ 6

Есть несколько SMTP-серверов, которые работают без проверки подлинности, но если сервер требует аутентификации, нет способа обойти это.

Встроенные функции почты PHP очень ограничены - указание SMTP-сервера возможно только в WIndows. On * nix, mail() будет использовать двоичные файлы OS.

Если вы хотите отправить E-Mail на произвольный SMTP-сервер в сети, подумайте об использовании библиотеки, например SwiftMailer. Это позволит вам использовать, например, исходящие серверы Google Mail.

Ответ 7

В тех случаях, когда вы размещаете сайт 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 settings.
account default
host <smtp.example.net>
port 587
auth on
user <[email protected]>
password <password>
from <[email protected]>
syslog LOG_MAIL

Вам необходимо заменить данные конфигурации, представленные всем, что находится внутри "<" и ">" (включительно, удалите их). Для хоста/имени пользователя/пароля используйте ваши обычные учетные данные для отправки почты через вашего почтового провайдера.

Скажите PHP, чтобы использовать его

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

Добавьте эту единственную строку:

sendmail_path = /usr/bin/msmtp -t

Полная документация может быть найдена здесь:

https://marlam.de/msmtp/