php mail () функціонує болісно повільно на локальній машині розвитку


21

Передумови: Якщо ви створили локальний сервер apache для цілей розвитку, можливо, у вас виникли проблеми, коли відправлення електронної пошти займає тривалий час (принаймні одну хвилину). Це надзвичайно засмучує, якщо ви намагаєтеся налагодити проблему із створеним електронним повідомленням.

В Інтернеті є кілька дописів форуму, які обговорюють цю проблему. Однак жодна тема не описувала, що потрібно робити досить детально для моїх обмежених знань. Ось такі кроки, які працювали для мене:

1) знайдіть ім’я хоста (якщо ви його забули) за допомогою цієї команди:

:~$ cat /hosts/hostname

myhostname

2) відредагуйте файл /etc/hostsі переконайтесь, що перший рядок такий:

127.0.0.1 localhost.localdomain localhost myhostname

3) відредагуйте конфігураційний файл sendmail ( /etc/mail/sendmail.cfв Ubuntu) та Uncomment the line#O HostsFile=/etc/hosts

4) Перезавантажте комп'ютер. Зараз комп'ютер повинен завантажуватися набагато швидше, а функція пошти () повинна повернутися майже негайно. ЗАРАЗУ, електронні листи насправді не надсилатимуться, якщо ви не виконаєте кроку 5.

5) Ви повинні знову використовувати параметр sendmail '-f', коли використовуєте функцію пошти. Наприклад:

mail('recipient@somewhere.com', 'the subject', 'the message', null, '-fsender@somewhere.com');

Моє запитання до моїх колег по відношенню до сервера:

Які подальші зміни можна внести, щоб мені не довелося використовувати параметр sendmail -f? Хоча додати параметр -f не дуже важко, це проблема, коли ваша CMS (наприклад, Drupal) не використовує параметр -f під час надсилання пошти. Вам потрібно буде зламати основний модуль, щоб додати цю опцію.


1
у моїй системі Ubuntu командаcat /etc/hostname
zkent

Відповіді:


6

Я знаю, що це не те, про що ви питаєте, але чому ви не спробуйте Postfix або Exim? Вони обидва доступні ubuntu (Postfix - це навіть mta за замовчуванням у системах Ubuntu), і вони обидва забезпечують сумісну команду 'sendmail', яка працює дуже добре. IMHO sendmail начебто датований, і ви отримаєте кращі шанси на підтримку більш сучасних MTA.


Навіть якщо є кращі поштові системи, ніж sendmail, проблема полягає в обслуговуванні сервера розробки, який відображає сервер виробництва. sendmail - поштовий агент за замовчуванням для php.
Майкл Б

1
Ви маєте на увазі sendmail програмне забезпечення або sendmail двійкове? Оскільки у Exim та Postfix також є sendmailдвійковий файл, який приймає ті самі параметри, що й оригінальний sendmail, для питань сумісності.
coredump

Я не дуже прихильник Exim з минулого досвіду, але я постарався Postfix спробувати вирішити проблеми, що трапляються з Sendmail негайно!
quickshiftin

2

Це працювало для мене:

  • Встановити постфікс

Дивіться тут інструкції, як це зробити тут: https://help.ubuntu.com/community/Postfix (можливо, він уже встановлений, а двійковий файл 'sendmail' може бути фактично псевдонімом для постфікса)

  • Дотримуйтесь інструкцій тут:

http://lenss.nl/2009/01/making-php-mail-work-on-ubuntu-through-postfix/

mkfifo /var/spool/postfix/public/pickup

Знайдіть sendmailпроцес

ps aux | grep mail

Вбий це

kill <thepid>

Перезапустити postfix

/etc/init.d/postfix restart

Я думаю, що ви можете просто встановити параметр 'myorigin' на будь-яке активне ім’я домену, наприклад, у вас є доменне ім’я.


Ідеально! Це це ПІСЛЯ мучило мене дві години. =)
Ханнес Шнайдермайер

1

Це може бути, а може і не бути вирішенням для вас: додайте mail.force_extra_parameters = "-fsender@somewhere.com"у файл php.ini . Це змушує PHP автоматично додавати -fsender@somewhere.com як п'ятий параметр до функції mail () PHP.

Це твердо кодоване значення і застосовується лише у php.ini, тому воно не буде дуже гнучким, але, можливо, працює для вас у вашому випадку розвитку?


0

Переглядаючи мережевий трафік (подумайте tcpdump) або запустивши straceна ваших процесах sendmail або apache, ви повинні мати уявлення про те , чому така затримка існує, щоб ви могли вирішити основну проблему.

Зазвичай затримки в цьому діапазоні пов’язані з невдалим пошуком DNS, але ви не знаєте, поки не подивитеся. Якщо ви не вирішите основну проблему, це, ймовірно, стане проблемою, незалежно від того, як ви намагаєтеся її вирішити.


1
Затримка була викликана тим, що ім'я хоста було одним словом, а не FQDN (повністю кваліфіковане доменне ім'я). Вказуючи sendmail на / etc / hosts та маючи localhost.domain як перше доменне ім’я (яке є FQDN), затримки немає. Це було зафіксовано на кроках 1-4. У питанні, що залишилося, потрібно використовувати "-f" - все ще велике вдосконалення щодо необхідності чекати 2 хвилини для надсилання пошти.
Майкл Б

0

Я ніколи не стикався з проблемою використання пошти () в PHP, яка не була результатом проблеми на MTA.

У вашому файлі php.ini буде показано, яку команду він виконує для надсилання електронного листа (за замовчуванням: "sendmail -t -i"). Спробуйте надіслати електронний лист із командного рядка, використовуючи це - я буду ставити його повільно.

Звичайні речі, які потрібно перевірити, - чи правильно налаштовано сервер DNS на пристрої (і може вирішити всі адреси, налаштовані в MTA), а якщо налаштовано інтелектуальне реле, то ім'я може бути встановлено на адресу, до якої може підключитися система.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.