Как сделать так, чтобы мой PHP отправлял почту?


71

Я установил Ubuntu 11.04, LAMP, используя tasksel.

Я считаю, что PHP mail()не работает.

Я полагаю, мне нужно включить это или что-то? Как мне это сделать?


Это просто и легко отправить из вашего Gmail. kvcodes.com/2016/03/send-e-mail-localhost-ubuntu-php
Квварадха

Ответы:


51

Из почтового руководства php:

Требования

Чтобы функции почты были доступны, PHP требует установленной и работающей системы электронной почты. Используемая программа определяется настройками конфигурации в файле php.ini.

Это означает, что вам нужно установить какой-нибудь почтовый сервер и настроить php для его использования. Обычно этот почтовый сервер является постфиксом в Ubuntu. Однако - если сторона php, которую вы кодируете, в конечном итоге будет храниться на стороне хостинг-сервиса (например, xmission), то, скорее всего, почтовый сервер там уже будет установлен. В этом случае просто протестируйте свой сайт онлайн, а не локально.

Если вам нужно протестировать его в вашей собственной системе или вы хотите разместить его на своем домашнем сервере, выполните следующие действия:

Постфиксная установка

Установка: postfix Установить постфикс / sudo apt-get install postfix Во время процесса вас спросят, в каком режиме вы хотите установить postfix. Есть четыре возможных режима:

  • Интернет : Ваш собственный почтовый сервер.
  • Спутник : внешний почтовый провайдер (например, Google) будет использоваться для отправки и получения почты. Сервер не будет получать почту.
  • Smarthost : смесь между двумя. Почта хранится локально, но отправляется через внешнего почтового провайдера.
  • Только местный : вас это не касается. Это системный внутренний почтовый сервер. Вы можете только отправлять почту от пользователя к пользователю в системе.

Остальные параметры установки зависят от вашего выбора этой общей конфигурации.

Скорее всего, вы выберете спутниковую установку. Это означает, что почта будет отправлена ​​через внешнего провайдера. В качестве smtp-сервера (сервера исходящей почты) вам нужно будет указать своих провайдеров smtp. Остальные варианты говорят сами за себя.

Конфигурация после установки

Большинство smtp-серверов требуют аутентификации по паролю для отправки почты. Поэтому postfix нужно будет знать этот пароль. Также есть такие вещи, как шифрование, которое нужно учитывать (что вам придется гуглить). Вот как вы настраиваете postfix с использованием аутентификации по паролю (sasl):

  • Установите libsasl2-modules Установите libsasl2-модули и sasl2-bin Установите sasl2-bin , щелкнув значки Центра программного обеспечения или из терминала, используя:

    sudo apt-get install libsasl2-2 libsasl2-modules sasl2-bin
    
  • Включите sasl-auth, добавив эти строки в /etc/postfix/main.cf

     # add to /etc/postfix/main.cf
     smtp_sasl_auth_enable = yes
     smtp_sasl_security_options = noplaintext noanonymous
     smtp_sasl_password_maps = hash:/etc/postfix/sasl_password
    
  • Создайте файл /etc/postfix/sasl_passwordс такой строкой:

     smtp.gmail.com USERNAME@gmail.com:USERPASSWORD
    

    Подставьте реальный пароль, имя пользователя и smtp-адрес.

  • Обновление постфикса:

     sudo chmod 600 /etc/postfix/sasl_password # for safety of your smtp password
     sudo postmap hash:/etc/postfix/sasl_password 
     sudo postmap /etc/postfix/sender_canonical
     sudo /etc/init.d/postfix restart   
    

    Вы , возможно , придется обойти «разрешение отказано» ошибка по chown postfix:postfix /etc/postfixзаранее.

Это должно делать это в большинстве случаев. Тем не менее, некоторые провайдеры SMTP требуют определенного адреса в качестве отправителя или шифрования.

Связанный: PEAR :: Mail интерфейс также может быть интересен для вас.

Gmail (и, возможно, другим службам) может не понравиться то, что вы пытаетесь отправлять почту таким образом, поскольку это может считаться небезопасным по их стандартам, и это может заблокировать вашу попытку, т. Е. На экране ничего не произойдет, или какое-то место всего процесса заблокирует ваша аутентификация. Также ваш POP3 должен быть включен.

Чтобы противостоять этому, смотрите здесь. (Если вы хотите быть в безопасности, создайте фиктивную учетную запись Gmail)


Отправка почты из Ubuntu (локальной) работает. Но что, если я хочу, чтобы моя Windows использовала эту машину для отправки почты (также PHP)? Как мне это настроить?
JM на работе

Не уверен, что я понял вопрос. Вы можете шлифовать с вашей машины Ubuntu. Теперь, что вы хотите сделать, это отправить mal через эту машину Ubuntu с вашего ПК с Windows через php? Это правильно?
con-f-use

2
Теперь пакет libsasl2 не существует. Я использую 11.04. Его libsasl2-2 согласно обновленному пакету ..
Мифический

61

Как уже отмечалось, postfix будет излишним, если вам просто нужно отправлять электронные письма от php при разработке приложений на вашем домашнем компьютере.

Я лично использую очень простой и легкий пакет ssmtp. Он будет использовать любой SMTP-сервер для отправки исходящих писем. Установите его, запустив:

sudo apt-get install ssmtp

Затем отредактируйте /etc/ssmtp/ssmtp.confфайл, закомментируйте существующую строку mailhub и добавьте следующие строки (этот пример для сервера gmail smtp):

mailhub=smtp.gmail.com:587
UseSTARTTLS=YES
AuthUser=<YOUR-EMAIL>@gmail.com
AuthPass=<YOUR-PASSWORD>

(Укажите свое имя пользователя и пароль gmail. Конечно, вы можете использовать любой другой SMTP-сервер).

Теперь убедитесь, что ваш php.ini имеет правильный sendmail_path. Следует читать как:

sendmail_path = /usr/sbin/sendmail -t

( Из комментариев @ dima-l и @ omar-sabic : вам не нужно указывать ssmtpздесь, потому что установка должна была создать символическую ссылку, на /usr/sbin/sendmailкоторую правильно указывает ssmtp. В противном случае вы должны указать sendmail_path = /usr/sbin/ssmtp -t)

Перезагрузите apache, и ваш php сможет отправлять исходящие письма прямо сейчас.


3
Я думаю, что вы имели в виду sendmail_path = /usr/sbin/ssmtp -t. Это сработало, спасибо
Омер Сабик

1
ssmtp должен создать символическую ссылку для /usr/sbin/sendmail, которая правильно указывает на ssmtp. Таким образом, использование sendmail_path = /usr/sbin/sendmail -tдолжно работать так же
Дима Л.

2
Подробнее о настройке ssmtp(нашел несколько полезных заметок): Как настроить PHP почту в Debian - этот вопрос + эта ссылка помогла настроить программу.
gskema

1
Для gmail подумайте, что вы должны настроить свою учетную запись google, чтобы она могла работать в «небезопасных приложениях». См support.google.com/accounts/answer/6010255
aesede

1
Я также должен был добавить следующую строку: FromLineOverride=YESчтобы избежать следующей ошибки:550 5.7.60 SMTP; Client does not have permissions to send as this sender
Caumons

29

PHP требует SMTP-клиента для отправки почты. Вы можете установить полнофункциональный агент пересылки почты (MTA), такой как Postfix, для обслуживания этой функции, но это излишне, если вам нужно только отправлять почту через PHP. Вместо этого установите msmtp . Это легкий и гораздо проще в настройке.

Установить MSMTP

sudo apt-get install msmtp-mta ca-certificates

Настройте это

Создайте новый файл конфигурации:

sudo vi /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 vi /etc/php5/apache2/php.ini

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

sendmail_path = /usr/bin/msmtp -t

Конечно, 'sudo vi /etc/php5/conf.d' без php.ini не будет работать. В моем случае (Ubuntu) мне пришлось отредактировать '/etc/php5/apache2/php.ini', а также перезапустить apache 'sudo /etc/init.d/apache2 reload', чтобы он заработал.
Деян

1
Кстати, вы можете проверить свою конфигурацию msmtprc, используя:cat <<EOF | msmtp <receiver@test.com> Subject: test This is a test! EOF
Dejan

Было бы хорошо, но это не работает для меня. Ничего не появляется в его журнале. Кажется, все в порядке, но не игра в кости.
Джеймс Т Снелл

2
Чтобы сделать msmtp доступным для всей системы, установите «msmtp-mta».
Колан

1
Если вы слишком буквальны, как я в следующих инструкциях, вы фактически не сохраняете скобки <> в файле конфигурации. Мне понадобилось 20 минут, чтобы понять это
де Раад

4

Должно быть простое исправление. Вам просто нужно установить Postfix, который выполняет фактическую рассылку.

sudo apt-get install postfix

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


2

Это старый вопрос, и на него есть достойные ответы выше, но я нуждался eximв своей среде. Кроме того, сначала убедитесь, что у вас установлен sendmail ( $ which sendmail- должен возвращать что-то вроде / usr / sbin / sendmail). Я нашел хорошее руководство на linode.com , но суть:

apt-get install exim4-daemon-light mailutils

с последующим:

dpkg-reconfigure exim4-config

который доставит вас в интерактивный редактор.


1

Отличный ответ , контрафакт.

У меня есть одна вещь, которую нужно добавить о «фиктивной учетной записи gmail»:

Настоятельно рекомендуется, потому что вы должны настроить свою учетную запись Gmail, чтобы разрешить менее безопасные приложения: https://www.google.com/settings/u/0/security/lesssecureapps. В противном случае вы получите «войдите в систему с помощью веб-браузера. а затем попробуйте еще раз "ошибка в вашем /var/log/mail.logфайле.

Также я обнаружил, что получаю сообщение об ошибке тайм-аута, если я не отправляю серверу gmail smtp мой корневой сертификат. Сделать это:

sudo nano /etc/postfix/main.cf

добавьте следующее в конец файла

smtp_tls_CAfile = /etc/postfix/cacert.pem

Затем скопируйте корневой сертификат thawte в cacert.pemфайл:

cat /etc/ssl/certs/thawte_Primary_Root_CA.pem | sudo tee -a /etc/postfix/cacert.pem

Вот ссылка, которую я использовал: Настройка Postfix для использования Gmail SMTP в Ubuntu | EasyEngine

Надеюсь, это сэкономит кому-то несколько волосяных фолликулов ...


0

Я обнаружил, что решения, предоставленные Dima L., являются наиболее простым и легким в использовании.

Просто некоторые дополнения для большей ясности в настройке. Вы должны оставить комментарий hostnameв /etc/ssmtp/ssmtp.confфайле. Пример ssmtp.confфайла, как показано ниже:

#
# Config file for sSMTP sendmail
#
# The person who gets all mail for userids < 1000
# Make this empty to disable rewriting.
root=postmaster

# The place where the mail goes. The actual machine name is required no 
# MX records are consulted. Commonly mailhosts are named mail.domain.com
mailhub=smtp.yourdomain.com
UseSTARTTLS=YES
AuthUser=mail@yourdomain.com
AuthPass=YOUREMAILPASSWORD

# Where will the mail seem to come from?
#rewriteDomain=

# The full hostname
#hostname=

# Are users allowed to set their own From: address?
# YES - Allow the user to specify their own From: address
# NO - Use the system generated From: address
FromLineOverride=YES
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.