Шаг 1
Форматы
Отправка почты из скриптов на PHP - вещь, которая очень часто встречается в веб-приложениях. К сожалению, как показывает практика, большинство разработчиков используют эту функцию неправильно, допуская в своих скриптах одни и те же ошибки. В результате оказывается, что письмо получателю пришло в неверной кодировке, просто не дошло, или вообще неумело написанная форма отправки сообщения была использована для рассылки спама.
Сейчас мы научимся правильно работать с почтой, что бы избежать таких казусов.
Начнем с простого, с форматов.
Формат почтового сообщения описан в нескольких стандартизирующих документах, основными из которых являются
RFC 822 и
RFC 2045 Чтобы Ваши письма всегда и корректно доходили до адресата, нужно придерживаться этих стандартов.
Вот только сразу освоить их весьма непросто. Поэтому сейчас мы покажем основные моменты, которые позволят избежать неприятностей при любовной (или деловой) переписке. А дальше Вы сможете сами настраивать свои скрипты, соблюдая протокол.
И так, посмотрим, что же там внутри, из чего состоит почтовое сообщение. Если открыть в редакторе файл какого нибудь письма, то можно увидеть примерно следующее:
X-Sendmail-Cmdline: sendmail.pl -t -i -firbis@mail.ru To: my_mail@mail.ru Subject: =?utf-8?b?VGVzdA==?= Date: Mon, 22 Mar 2010 07:16:18 +0300 From: irbis@mail.ru <irbis@mail.ru> Message-ID: <2f7fc368dc6a25b3808a845b4f35375f@test.den> X-Mailer: IRB_Mailer 0.2 (www.irbis-team.com) MIME-Version: 1.0 Content-type: multipart/mixed; boundary="==12692745794ba797d2a5c2f" Your post client does not support specification MIME 1.0 For correct display of the letter you should replace the post program. --==12692745794ba797d2a5c2f Content-type: multipart/alternative; boundary="==12692745804ba797d2a5c92" --==12692745804ba797d2a5c92 Content-type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 0JLQvtGCINGC0LDQutC+0LUg0LLQvtGCINC/0LjRgdGM0LzQvg0K --==12692745804ba797d2a5c92 Content-type: text/html; charset="utf-8" Content-Transfer-Encoding: base64 PGgxIHN0eWxlPSJjb2xvcjpibHVlIj7QktC+0YIg0YLQsNC60L7QtSDQstC+0YIg0L/QuNGB0YzQ vNC+PC9oMT4= --==12692745804ba797d2a5c92-- --==12692745794ba797d2a5c2f Content-type: image/gif; name="=?utf-8?b?ZmlsZQ==?=.gif" Content-disposition: attachment; filename="=?utf-8?b?ZmlsZQ==?=.gif" Content-Transfer-Encoding: base64 R0lGODlh1gBEAPcAAP///7KysgBA/5OewEdu4Kirt52lu1581hVN9nOKzR9U8Spb7WuE0VR2246b wSRX8ARD/ayutZ+murCxs6OpuB1T8gJB/g1I+qWqt2mD0gZE/KqtthtR8ztm5j9o5K6vtJujvDlk 55Wfv1h42RlQ9AhF+3yPyoiXxBdP9QpH+oyawnGIzi5e62B+1ShZ7kNr4lZ32pmivVp62ICSyE1y 3RNM91J03Cxc7EFq42WA1FBz3XeMy5ehvktw3n6QySJV8Vx71z1n5YKTx2+HzzJg6XmOyklv3w9J +aGnuYSUxjBf6iZY72J/1IqZw5CdwGeC00Vs4TZj54aWxTRi6BFL+HWLzG2G0N1Qvvn5XmXRuOHO Bi0X1gnYyjV0cHG/KH0Kyxm/nAVMUgEhyM168Cm/m9UolpGDJh24Fjnop6XaeCF3hm0S20lKynUx DLGLu73Z91n1REX9BkFRug1elGn5ohUOldFXKF3vlHlmyOUzJ2Ev7K3d6olMArU+Q/Fnvf145Jm7 FoX+U4GRtE0RfanDVFVDeRE82532rLl0pCXdV6H3u+14ucnelvWb6TFU8j3ohNkRdsVPTcHhuo2U 3ukdVZXIllEwg93N0vkSIGXWnuHPeS3k+gkBrDVJ03FQHn0nzRn4xgXxBgFC0c3n7CkISNWdQZE0 ZB11ejlBH6UfkCG4qW0fY0mzZXVG1LFcBb02sVlubUXilEGy+w0L3GmC0RXDzdFIwl3sF3n/heW4 v2Gwz60qpon157WTwPF4a/0VJZl0zYUjC4EyPk3+36mMlVU4jxFt4Z0zH7lNOCWiwaG4b+0FeMnH VvUwbDGlFD3FHNkKS8W0fcHCnI3BLOkmOJX92VGhBd1KBPkrGmXbKeHQDS2xjAkq1jUeq3HhxH1E jBkxSgWWAAFjG81U9ilRXdUSApHlch0yOzmaD6VkjCH5LW0smEkcinVbUbEtQL2TZ1nnLkXHp0ET vg24cGkLqRV4W9E5bV3pN3mY/OU9fWExVK13TomelrXoMvGJSv2yoiH5BAEAAAAALAAAAADWAEQA AAj/AAMIHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypMmTKFOqXMmypcuX MGPKnEmzps2bOHPq3Mmzp8+fQIMKHUq0qNGjSJMqXaoRgwMHGJjaVGGkqhEdBDFY3cq1B4MiURNy HWsECIMkERJG4GoAoYEeVATIlTuFwQSpMRPMFYCAoIG9gAMLmCICoeDDVIAgxAC4sMEWh+UqcGzR QBK8FfXO7Tvwb2TBGi4b/Cw4xN2CjPdSHqiDtAAqDiyqSIyZoma5nAV6dr2XStuCvAErRt244G3S KNJOTKBBwPDaEY/nDrA7uNwXo63P/T0w9dzVEeIG/8cqEcjc59AfSverfW/Yge3l9iCumiAD7SmU P8yxF336hut1BpgCDxRooAKCZQDcXiFsZWBg0wXgnVyrTQHYFEWIYNkLgTEQUWvn/QdRgLoB9h5B IrgAWAgLfneQAQjuxUNWxQk0QXNzzVeQeXvh8GF/Iqq313TVCXBiVjhK1iKFCKkAmGgCTSgAZdXl Z9AEKOyFwo8hBgngkOy5lxAOe2mw5JQJZTlXAjTWJ5CTc7mAEIhzcSmXf14iRCJ1JiYE2V5nrlbQ DXux2V2NAZygJUJJ9NkQDw5wmONTguoGhAsPuKBDpQcV0YOBU+gAZUEiPOXAjAIlEMIDN7Sgn0Az rP+q6ZEX7VkkrQPdByhBiBqk4lyjSkmZCICpcBAGGTDAwAkOvKrQr4JFGMCfgBnhLIoxBuYCdwNl KycGhGr5WwQdAJbCqLWCKaCYCFErgJm8unmQeHJxK+yhWnJKEbQQFkSnttcGwEMKnyFwpLcRPCCY AhFMEAJo3Fpkq6MHkTmXAoEyumibLg6k5l5GRLxvZNMdJ5gRBylMmo8EeSupYDm4u6JGE7NrkAEE z9VBxgaJgACQHDM50MuA3cBAwA/xC1hu4bl2QkFFBHditvQKVrVguEpU81y4GqC0h/HO1SBXKs+V wpH3DgTnYRq8oC9DSqs7LWAauPAxXQVZuJcCmAb/VkTLgrmQbWAoxG1oupuFOdcLW3XwwOByaXBk fIfj2/FAen+Gg8gMtWDE4C5URV4AP8cZlq7bDRQBYGALXHULgA/pGH8dvgnY6BLLzWd8uAvUXg7H 9kpdkpGdO9G//hE7lwbc9rCXggI1KvaOe+EOubE2Xo3yQBbLxTLiuCluHQq0aqeBDtemTZD0rqHb EPLUz7X9unKx2FkGIVAxQ0HsCzB/AKAryMPkFYAM7GUKGdlacFDAufgoAG3CE4gD7oaYrCUEfgQZ oFz+VhCqOURRc/keAIE2EOfNZUsEiVqcEqi7IpGmB1mLjwBccJooRVAgEWjB1QKDO6eY6odQEQgG /7u1F5GVay5I80v3BCDCwVUuAP+y30D6JyeMKPAzRrBgAFbElSmUbS+tk9ANVZeAzAWGCvox2fOE SELf2ayEBCyIAXIQrh7FTi7o+tf/ErWXKoKPL+ITQA6UpcG5cNAwccQhjy4WNDQxxABAKB1g9peq yEBviAFYnXbcB0kK2pGIlxPIIgXQO+XJxY+5Sxz95PIeNb5tjAEw4eXU15AMEI+UA1HjXC7ZRim5 5pCZNIJrmhjHUSavjyxUZYne+C8BJAeRoZQjYKAnxkQuZG31y6Ul2dilZVrncBGIm2CImTqCGJNU yLRiCykmoav1Dj7W9NhedFTNjkWgCBkwwg0wlv+QI8rlAdo8DC+7ubtvwjEwCgCCCr13RwFE7Jwo SucficTOAIzyXbiCZQD49b20FYlzAqGdkiopUG7eqZHKSqlKU/qbIiXmNyC8TkMf2sYAmHKGyQzf Ko2EmpzN5Z1bjKdABtdRRBHvifbZW0ATZFLnEGQCgKnhQgx4whPF1H8zjd9JI7pCdSqzoKw0SDPP lp1oFqRqo1Pf4KQoVom+r6Z3A6lBCvnE/v1vcDQlqE3dmpl1vjFKt4Qdzw5yVafaUF5Ec+hBJiBJ AezsIRDFXKEMotAj8Stix7lrEbVq2IHcFJV9/eqtDiLMIUk1qGaNEgWhpD6T3eBaF8WTQkbZu1H/ srWgKOjBae4mKKJptpwDiaxAPptTQO60a347k1lWygAdXE0D+lGfC6eAqkw2UwDYc8gosUOQwmbX okodKhj9Qjxy1ouzx+zqRAOZtULiNGztYSst3SuZAgkGhQ+h6lxa0IIqMrY3sQnADG4n2apGSWls xSt60aneVOrUm2E9CDaF5sb4BKtXE3YN8EYEmuAi1JPcaSYKWuDcwNwgq+asKXG9+mCw8hQhSvuf DE/cSEEtETlJRMhN96IcDOwwMNwd7vhQ7GG9rni9x01I/zAKT+34hj7RxIAnQRNgiEzgx9zRZW+O ZEbAuIBf71Fwio3MV9v4lWsKgdxz2qMAkdEym0qQC4zxJnJRuVQZvIj5rm5+TL5/UXKEwBWlisu8 nDNHWE9LOw1vqPCAECQgYG9W5C0XJ1eGRODGVKhuqhp7SpBOcEVpWShWxRtoPG/Vs4TOk1pmoAOr 6CABWnzICVrdg0cvltVVAcKdD3LPXL9N1cAOtrCHTexiG/vYyE62spfN7GY7+9nQjra0p03talv7 2tjOtra3ze1u7yQgADs= --==12692745794ba797d2a5c2f-- |
Страшно? ))) Не бойтесь, все очень просто.
Если Вы сохраните этот листинг с расширением
.eml и откроете с помощью какого нибудь почтового клиента
Outlook Express к примеру, то увидите содержимое письма. Именно в таком формате клиент для отправки почты подготавливает сообщение, а затем отправляет его получателю. Задача нашего скрипта - добиться точно такого же формата.
Как видно из приведенного выше примера, электронное письмо содержит две части: в одной (верхней) размещаются заголовки, а в другой (нижней) собствено текст письма. Отделены эти части друг от друга пустой строкой.
Заголовки состоят из строк, в которых содержится тема письма (Subject), имя и адрес отправителя (From), получателя (To) и другая информация.
Особенно необходимо подчеркнуть, что, согласно стандартам, в заголовках ни при каких обстоятельствах не должны содержаться русские буквы (вернее любые не латинские).
Письмо может быть двух видов - простой текст и текст с разметкой html. Кроме того, письмо может содержать вложенные файлы.
В php есть специальная функция, которая помогает отправить почтовое сообщение. Это функция
mail(), о которой в следующем разделе.