Назад | Перейти на главную страницу

Электронная почта в веб-приложение?

Может кто-нибудь сказать мне, как я могу сделать следующее:

Моя компания построила свою собственную систему управления проектами с Linux, Apache, MySQL и PHP. В базе данных веб-приложения есть таблица t_project, в которой хранится информация обо всех проектах компании. Мой босс хочет, чтобы я разработал решение, при котором, если кто-то отправит электронное письмо на (t_project.project_id) @ mysite.com, веб-приложение запишет его в таблицу базы данных с именем t_project_message.

Как мне решить эту проблему? Что мне нужно изучить?

Дополнительные замечания Я только что заметил, что в моем вопросе пропало "(t_project.project_id) @ mysite.com", которое я добавил обратно. Значит ли это, что мне понадобится столько учетных записей электронной почты, сколько проектов в моей базе данных? Это могут быть десятки тысяч ...

Какой почтовый сервер вы используете на хосте PHP? Для нескольких приложений PHP, за которые я отвечаю, я использую Exim, а с Exim я настраиваю транспорт и маршрутизатор. Это означает, что exim примет сообщение, а затем запустит сценарий PHP и передаст сообщение сценарию PHP STDIN. Затем сценарий PHP выполняет действия на основе содержимого сообщения.

Указанный ниже маршрутизатор / конфигурация будет принимать сообщения на helpdesk@helpdesk.example.org, helpdesk-bounce@helpdesk.example.org и tckt-{id#}@helpdesk.example.org. С Exim конфигурация транспорта и маршрутизатора чрезвычайно гибкая, ниже приведен лишь один из возможных способов ее настройки. Я сомневаюсь, что то, что я настроил, применимо непосредственно к вашему проекту, вам, вероятно, нужно будет прочитать Exim. Я также почти уверен, что другие почтовые серверы также могут делать то же самое. Просто я с ними не знаком.

### router/050_helpdesk_router
#################################
helpdesk_router:
  driver = accept
  domains = helpdesk.example.org
  caseful_local_part = true
  local_parts = lsearch;/etc/exim4/helpdesk
  local_part_suffix_optional
  local_part_suffix = -*
  transport = helpdesk_transport


### transport/20_helpdesk_router
#################################

helpdesk_transport:
  driver = pipe
  command = /usr/bin/php ${lookup{$local_part}lsearch{/etc/exim4/helpdesk}} $local_part '${if def:local_part_suffix {$local_part_suffix}}'
  # return the data from the script on a failure
  return_fail_output = true
  # temporary error
  temp_errors = 10
  # set a timeout for 30 seconds
  timeout = 30s
  current_directory = /home/helpdeskadmin/
  home_directory = /home/helpdeskadmin/
  user = helpdeskadmin
  group = helpdeskadmin

### /etc/exim4/helpdesk
#################################
helpdesk:   /srv/www/helpdesk.example.org/www/helpdesk/mail/recv.php
tckt:       /srv/www/helpdesk.example.org/www/helpdesk/mail/recv.php

Чтобы дать отправную точку в части вопроса, связанной с анализом почты. я использую Zend_Mail для разбора входящего сообщения и отправки почты.

У вас будет время также рассказать мне о преимуществах / недостатках вашего метода по сравнению с методом Бена?

С крючком в MTA, как я описываю.

  • Интервал опроса отсутствует. Когда отправляющий почтовый сервер подключится, ваш процесс немедленно запустится, чтобы принять сообщение. С почтовым ящиком и опросом вам придется подождать до следующего цикла опроса.
  • Вы можете немедленно отклонить недопустимые сообщения или ответить на них, не рискуя тем, что ваше приложение может стать источником обратного рассеивания. Возможно, вы захотите отклонить сообщение, если адрес неверен.
  • Вы сказали, что у вас много проектов. С транспортом вам не нужно создавать много почтовых ящиков и опрашивать каждый почтовый ящик отдельно, если вы правильно определите свой транспорт, вы можете получить одну транспортную конфигурацию для обработки всего.

Обычно в PHP опрашиваются почтовые ящики из cron. Из cron вы должны быть очень осторожны, чтобы убедиться, что ваш опрос имеет некоторую форму блокировки, чтобы вы не отвечали или не обрабатывали одно и то же сообщение дважды.

Раньше я часто делал это, бегая fetchmail каждые X минут через cron. Fetchmail будет получать почту через IMAP или POP3, а затем может направлять почту через обработчик / парсер скрипта определенного типа (обычно написанного на perl, python и т. Д.). Сценарий синтаксического анализатора извлечет из сообщения любые необходимые данные и затем вставит эту информацию в соответствующие места в вашей базе данных.

В зависимости от вашего почтового сервера вы можете написать сценарий PHP, который будет опрашивать почтовый ящик на сервере с помощью IMAP и предпринимать соответствующие действия.

Для PHP доступно расширение IMAP, которое может получать сообщения электронной почты с сервера, а также перемещать их по серверу или полностью удалять, когда вы зафиксировали его в базе данных.

Вы можете запланировать это соответствующим образом с помощью cron.

Хотя вы можете опросить почтовый ящик POP, это очень неэффективное решение. Предполагая, что вы можете направить почту в целевую систему, лучшим решением будет синхронная обработка запроса. Хотя вы можете просто использовать механизм .forward, я бы рекомендовал использовать procmail в качестве MDA - он позволяет вам создавать сценарии для сложных действий, таких как запуск программ, пересылка копий, условные ответы и многое другое.