Поиск

Отправка почты из Web-страницы

Теперь в вашем распоряжении есть способ отправки электронной почты программными средствами с помощью функции send_mail(), а уж организовать это "мероприятие" из Web-страницы — пара пустяков! Вам просто нужно спроектировать страницу и написать CGI-программу, координирующую "совместные" действия. Пример HTML-формы, предназначенной для отправки электронной почты, представлен в листинге 22.3. Эта форма не отличается особой изысканностью, но при желании вы можете "украсить" ее по своему вкусу.

Следует обратить внимание на несколько моментов в этой маленькой программе. Во-первых, чтобы обеспечить работоспособность этой программы, вы должны вставить функцию sendmail, текст которой приведен либо в листинге 22.1, либо в листинге 22.2.

Используйте вариант, который работает лучше и больше вам подходит. Во-вторых, обратите внимание на то, что адрес, указываемый в поле То:, жестко "зашит" в программе — в виде адреса webmaster@myhost.com. Вам придется изменить этот адрес, поскольку по нему будут отправляться сообщения. Причина, по которой адрес получателя не берется из поля формы, совсем проста: не стоит разрешать неизвестным пользователям отправлять сообщения по электронной почте с помощью Web-формы. Если кто-нибудь будет злоупотреблять использованием вашей формы и посылать "направо и налево", скажем, неприличные сообщения, то вас могут обвинить как инициатора сообщений такого рода. Вряд ли вам захотелось бы очутиться в такой ситуации.

Если нужно, то, используя только одну Web-форму, можно организовать отправку сообщений по нескольким адресам. Для этого создайте раскрывающийся список получателей или используйте кнопки переключателя:

Затем в CGI-программе используйте следующий программный код:

Какой бы способ вы ни выбрали, не разрешайте передавать почтовые сообщения из Web-формы по произвольно задаваемому адресу То:. Вместо этого передайте CGI-программе какое-нибудь безопасное значение (в данном примере мы использовали число в диапазоне 1-3), а затем интерпретируйте его соответствующим образом. Обратите внимание, как в нашем примере с помощью директивы else обрабатывается некорректное значение (на всякий случай).

Контроль адресов электронной почты

Возможно, вы заметили, что CGl-программа не пытается установить, достоверен ли адрес, введенный пользователем. На это есть причина: сие невозможно!

Такой поворот дел может удивить вас.

Одна из "святых заповедей" разработки систем электронной почты в Internet — знать, достоверен ли адрес получателя. На это есть короткая отповедь: это невозможно!

О трудностях в решении этого вопроса можно судить, обратившись к рис. 22.1 и 22.2, приведенным в начале данного занятия. С позиции отправителя совсем не виден конец всей цепи доставки сообщения. Она должна полностью передать сообщение второй системе в цепи, которая затем передаст его третьей, и т.д. Задержка между передачами "эстафетной палочки" весьма значительна. И важно то, что инициирующая система не имеет никакого контроля над сообщением после того, как она "сбыла его с рук".

Стандартный подход — постараться избавиться от явно неверных адресов, но, к сожалению, нет способа для утверждения, что данный адрес недействителен. Стандарт Internet для адресов электронной почты — RFC 822 — содержит шаблон для стандартных адресов электронной почты. Однако нельзя не отметить, что некоторые совершенно корректные с точки зрения стандарта RFC-822 адреса оказываются недействительными, а другие, нарушающие этот стандарт, — вполне действительны.

Попытки написать регулярные выражения, чтобы с ними можно было сравнивать адреса электронной почты, ни к чему не привели. Например, выражение /"[\w.-]+\@([\w.-]\.)+\w+$/ выглядит вполне подходяще. Ему даже можно поставить в соответствие такие адреса, как me@somewhere.com. Однако это выражение "забракует" следующие вполне рабочие адреса:

Одно регулярное выражение, которое соответствует адресам электронной почты, удовлетворяюшим стандарту RFC-822, содержит 4 700 символов — слишком много, чтобы приводить его в этой книге и ожидать от вас готовности его использовать. Причем следует учесть, что оно совпадает далеко не со всеми действующими адресами в Internet.

Так что же делать?

Единственный способ определить достоверность некоторого адреса электронной почты — послать по этому адресу сообщение и ожидать ответа. Если по каким-то причинам вам понадобится иметь гарантии существования получателя с таким-то адресом, например для отправки ему сообщений в будущем, пошлите ему сообщение с просьбой ответить отправителю. Получив ответ, вы будете знать, что имеете дело с достоверным адресом электронной почты.