Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 [ 108 ] 109 110 111 112 113 114 115 116 117 118 119 120 121 122

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

Вряд ли вам захотелось бы очутиться в такой ситуации.

Если нужно, то, используя только одну Web-форму, можно организовать отправку

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

<IIIPDT TYPE=radio NAHE=target Valtie=l СНЕСКЕП>Отдел технической поддерхкн <INPUT TyPE=j:adio NAME=target Valae=2>0irnefl продаж <INPU1! TYPEdio NAME=target Уа1ие=3>11ридячес1сий отдел

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

$formtarget=param{target); *targets=( 1=> supportgmyhost.com,

2=> salesimyhoEt.com,

3=> legalNyhost.com);

if {exists($targets{$fomtarget})) {

$target=$targetsl$formtarget);

} else {

Starget=webmasteremyhost.com;

print $target;

Какой бы способ вы ни выбрали, не разрешайте передавать почтовые сообщения

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

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

Возможно, вы заметили, что не пытается установить, достоверен

ли адрес, введенный пользователем. На это есть причина: сие невозможно! Такой поворот дел может удивить вас.

Одна из "святых заповедей" разработки систем электронной почты в Internet -

знать, достоверен ли адрес получателя. На это есть короткая отповедь: это невозможно!

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

Стандартный подход - постараться избавиться от явно неверных адресов, но, к

сожалению, нет способа для утверждения, что данный адрес недействителен. Стандарт

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



шенно корректные с точки зрения стандарта адреса оказываются недействи-

тельными, а другие, нарушающие этот стандарт, - вполне действительны.

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

*§qz.az

clintp!sol2!westwoodedec.net

relay%me?host,com

"barneysfred"?flintstones.net

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

в Internet.

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

Единственный способ определить достоверность некоторого адреса электронной

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

просьбой ответить отправителю. Получив ответ, вы будете знать, что имеете дело с достоверным адресом электронной почты.

Резюме

На этом занятии вы узнали, как отправлять сообщения электронной почты из Web-страницы. Были рассмотрены две версии функции send mail (), которые можно использовать в Perl-программе для отправки почты. Нри этом вы постигли основы работы электронной почты в Internet и познакомились с базовыми правилами сетевого этикета.

Вопросы и ответы

Можно ли использовать информацию от броузера для определения адреса электронной почты посетителя?

Хотя такая возможность кажется замечательной - с ее помощью мы бы избавились от ошибок ввода адресов электронной почты, - она попросту невозможна. У броузера нет адреса электронной почты пользователя. Значение, возвращаемое функцией remote host модуж CGI, может в действительности не быть адресом, по которому пользователь получает электронную почту. Функция remote iiser (если вы используете безопасные Web-транзакции), скорее всего, не будет содержать полного электронного адреса пользователя. И помните, броузер вполне может быть "недобросовестным" по части информации такого рода, к тому же некоторые дополнительные модули для броузеров Netscape и Internet Explorer поступают именно таким образом.

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



Можно ерить адрес электронной почт1?

Можете попытаться. Например, в большипстве совремеппых адресов содержится символ @ (коммерческого at), и его можно использовать для проверки. Однако адреса на локальном компьютере {например, postmaster, root) не содержат символа S.

Я опробовав ограмму отправки электронной поч11 и получил в сообщении строку From nobody...?

Ах, да. Программа sendraail регистрирует идентификатор отправителя сообщения. В действительности "отправителем" является сам Web-сервер Web-сервер часто работает со специальным идентификатором пользователя (Ш) - nobody, Шо, httpd или (не дай Бог!) root - и именно этот адрес указывается в заголовке почтового сообщения. Ничего страшного. Если в качестве части заголовка вы обеспечите соответствующую строку From:, то именно эта строка и будет видна на экране у получателя.

Как к сообщению электронной почт1 присоединить файл?

Вам стоит заглянуть модули, находящиеся в CPAN.

Семинар

Контрольные вопросы

1 Какое действие выполняет строка Sfoo-Net: :SMTP->new( mailhost)?

(Если вы до сих пор не прочитали раздел, "Отправка почты не из системы UNIX", то, возможно, вам стоит сделать это сейчас.)

а) вызывает синтаксическую ошибку;

б) создает объект, именуемый $foo, который представляет подключение к почтовому SMTP-серверу;

в) включает в текущую программу модуль Net: :SHTP

2. Какой из приведенных ниже вариантов не является (потенциально) действительным адресом электронной почты?

а) foolbaribazlquux.

б) "

в) stuff%junk! "Wowzeris" !foo.com!blat.

Ответы

1. Правильный ответ - вариант б). Если в качестве ответа вы выбрали пункт а), то вы либо допустили опечатку, либо работаете с версией Perl 4. Вариант в) неверен, поскольку представляет собой описание действия оператора use Het:iSMTP.

2. Сложный вопрос. Все они являются потенциально допустимыми адресами электронной почты.



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 [ 108 ] 109 110 111 112 113 114 115 116 117 118 119 120 121 122