Как указать PHP, что mail () следует отправлять с помощью внешнего почтового сервера? - PullRequest
9 голосов
/ 04 июля 2011

Я размещаю свою электронную почту на Rackspace Email и хотел бы использовать ее в качестве почтового сервера для контактной формы на моем веб-сайте.

Глядя на файл php.ini, я могу указать sendmail_path только в системах UNIX, откуда я читаю, указывает на программу, которая фактически отправляет почту на сервер.

Я не хочу отправлять почту с моего сервера Ubuntu, так как у меня недостаточно опыта для безопасной настройки электронной почты ... Я бы хотел передать все на Rackspace mail.emailsrvr.com.

У меня вопрос, как мне указать в настройке PHP на моем сервере, что функция mail() должна использовать внешний почтовый сервер?

Ответы [ 6 ]

11 голосов
/ 12 февраля 2015

Поскольку я исследовал эту проблему и наткнулся на этот пост, сторонняя библиотека php не была для меня вариантом.

Как мы знаем, php по умолчанию использует команду sendmail сервера Параметр sendmail_path в php.ini можно изменить, чтобы переопределить настройку для вашей собственной команды с ее собственными аргументами и т. Д. Например: sendmail_path = /usr/bin/unix2dos | /usr/bin/dos2unix | /usr/sbin/sendmail -t -i

SSMTP позволит вам направлять исходящие электронные письма на почтовый хост с вашего веб / php сервера. https://wiki.archlinux.org/index.php/SSMTP

apt-get install ssmtp

Затем вы можете использовать sendmail_path = /usr/sbin/ssmtp -t, чтобы сказать php, что нужно использовать ssmtp вместо sendmail. Обязательно перезапустите веб-сервер после внесения изменений в php.ini

Также убедитесь, что вы настроили ssmtp и проверили записи SPF, DKIM, DMARC, прежде чем вносить изменения в sendmail_path в php.ini

Например, почтовый сервер gmail. /etc/ssmtp/ssmtp.conf

# The user that gets all the mails (UID < 1000, usually the admin)
root=postmaster@yourdomain.com

# The mail server (where the mail is sent to), both port 465 or 587 should be acceptable
# See also http://mail.google.com/support/bin/answer.py?answer=78799
mailhub=smtp.gmail.com:587

# The address where the mail appears to come from for user authentication.
rewriteDomain=yourdomain.com

# The full hostname
hostname=FQDN.yourdomain.com

# Use SSL/TLS before starting negotiation
UseTLS=Yes
UseSTARTTLS=Yes

# Username/Password
AuthUser=postmaster@yourdomain.com
AuthPass=postmaster-password

# Email 'From header's can override the default domain?
FromLineOverride=yes

См. Вопрос обмена стеками https://unix.stackexchange.com/questions/36982/can-i-set-up-system-mail-to-use-an-external-smtp-server

Подробнее об этом.

При использовании Google каждый адрес электронной почты From: должен быть настроен на отправляющей учетной записи как параметр «Ваша учетная запись» в разделе учетных записей. В противном случае Google перепишет заголовки с помощью x-google-original-from и в качестве отправляющей учетной записи будет указан From.

11 голосов
/ 04 июля 2011

mail() предназначен для передачи на локальный SMTP-сервер и плохо справляется с этим. Для правильной поддержки почты используйте Swiftmailer или PHPMailer , которые полностью поддерживают внешние SMTP-серверы и намного проще в использовании (плюс позволяют вам делать такие вещи, как смешанные текстовые / html-письма, вложения и т.д ...)

3 голосов
/ 12 октября 2015

Для тех, кто не хочет использовать библиотеку PHP, такую ​​как Swiftmailer (и, в конечном счете, для тех, кто не хочет трогать свою базу кода PHP только для переключения SMTP-серверов), вы можете выполнить одно из следующих действий:

1.) Серверы Windows: измените файл PHP INI, чтобы использовать внешний узел ретрансляции SMTP.Вы увидите это в разделе почтовой программы с надписью «Только для серверов Windows» - или что-то подобное.

2.) Серверы Linux: установите Postfix (служба ретрансляции электронной почты) и настройте его для использования внешнего SMTPхост.Ваша установка PHP будет пытаться использовать это для отправки электронной почты по умолчанию без какой-либо дополнительной настройки.

** Очевидно, что это не предназначено для того, чтобы дать вам пошаговую информацию о любом из перечисленных выше вариантов, а скорее для того, чтобы указать вамв правильном направлении, если вы ищете решение, которое не требует изменения экземпляров в вашем коде, где вызывается PHP mail ().

2 голосов
/ 04 июля 2011

Не относится к вопросу, но существуют почтовые демоны, которые действуют только как демон sendmail, но ретранслируют внешнюю почту.

http://freshmeat.net/projects/nullmailer/

Если вам даже не нужна установка exim / sendmail на вашем компьютере, я советую вам попробовать это. Конечно, вы все равно можете использовать другие сторонние альтернативы, однако, если вы запустите локально демон, он также сможет ставить в очередь почту, чего не может php-библиотека, если ретранслятор smtp недоступен.

Это часть обычного репо для Debian, так что я думаю, что это верно и для Ubuntu, просто apt-get install nullmailer должно быть достаточно. Затем вы можете настроить его с 1 или более SMTP-реле, которые ему разрешено использовать.

Подробнее здесь: http://packages.ubuntu.com/oneiric/nullmailer

В качестве примечания, система linux без системы почтовой программы становится поврежденной во многих других отношениях, поэтому я думаю, что это хорошая идея, как.

1 голос
/ 04 июля 2011

Функция PHP по умолчанию 'mail ()' получит только основные функции для отправки электронной почты.Для Rackspace вам, вероятно, потребуется настроить SMTP-соединение с их почтовым сервером.Для этого лучше получить более продвинутый и развитый почтовый класс.Несколько структур кода имеют их в наличии.Если вы ищете хороший пакет, проверьте PHP Mailer.Это почти стандарт в наши дни.

http://phpmailer.worxware.com/

require_once('../class.phpmailer.php');
//include("class.smtp.php"); // optional, gets called from within class.phpmailer.php if not already loaded

$mail             = new PHPMailer();

$body             = file_get_contents('contents.html');
$body             = eregi_replace("[\]",'',$body);

$mail->IsSMTP(); // telling the class to use SMTP
$mail->Host       = "mail.yourdomain.com"; // SMTP server
$mail->SMTPDebug  = 2;                     // enables SMTP debug information (for testing)
                                       // 1 = errors and messages
                                       // 2 = messages only
$mail->SMTPAuth   = true;                  // enable SMTP authentication
$mail->Host       = "mail.yourdomain.com"; // sets the SMTP server
$mail->Port       = 26;                    // set the SMTP port for the GMAIL server
$mail->Username   = "yourname@yourdomain"; // SMTP account username
$mail->Password   = "yourpassword";        // SMTP account password

$mail->SetFrom('name@yourdomain.com', 'First Last');

$mail->AddReplyTo("name@yourdomain.com","First Last");

$mail->Subject    = "PHPMailer Test Subject via smtp, basic with authentication";

$mail->AltBody    = "To view the message, please use an HTML compatible email viewer!"; // optional, comment out and test

$mail->MsgHTML($body);

$address = "whoto@otherdomain.com";
$mail->AddAddress($address, "John Doe");

$mail->AddAttachment("images/phpmailer.gif");      // attachment
$mail->AddAttachment("images/phpmailer_mini.gif"); // attachment

if(!$mail->Send()) {
  echo "Mailer Error: " . $mail->ErrorInfo;
} else {
  echo "Message sent!";
}
1 голос
/ 04 июля 2011

Настройка внутренней функции mail на использование SMTP доступна только в Windows. На других платформах PHP должен использовать локально доступный плагин sendmail или sendmail просто отлично.

Если вы хотите использовать SMTP на сервере, отличном от Windows, вам придется использовать стороннюю библиотеку, такую ​​как мой любимый Switfmailer .

С помощью Swiftmailer отправка электронного письма выглядит следующим образом:

require_once 'lib/swift_required.php';

//Create the Transport
$transport = Swift_SmtpTransport::newInstance('smtp.example.org', 25)
  ->setUsername('your username')
  ->setPassword('your password')
  ;

//Create the Mailer using your created Transport
$mailer = Swift_Mailer::newInstance($transport);

//Create a message
$message = Swift_Message::newInstance('Wonderful Subject')
  ->setFrom(array('john@doe.com' => 'John Doe'))
  ->setTo(array('receiver@domain.org', 'other@domain.org' => 'A name'))
  ->setBody('Here is the message itself')
  ;

//Send the message
$result = $mailer->send($message);
...