Нээлттэй
Хаах

Php ашиглан имэйл илгээх. php Infernal inurl sendmail php ашиглан имэйл илгээх

Sendmail мэйл серверийг тохируулах (скриптээс захидал илгээх асуудлыг шийдвэрлэх)

Зарим тохиолдолд Sendmail мэйл сервер шуудан илгээдэггүй тул алдаа гарч ирдэг.

2-р сарын 28-ны 22:04:24 myhost sendmail: mATM4O8w58065806: Losing ./qfmATM4O8w58065806: savemail panic 2-р сарын 28 22:04:24 myhost sendmail: mATM4O8w56:SYER хаана ч хадгалж чадахгүй имэйл: reject: mATM4O8w56:SYR

Бүртгэлд мөн иймэрхүү алдаа байж болно:

Stat=Өгөгдлийн форматын алдаа

Асуудал нь ихэвчлэн серверийн хост нэр байхгүй эсвэл илгээх үед байхгүй имэйл хаягаас үүсдэг.

Ийм тохиолдолд та одоо байгаа шуудангийн хаягаа оруулах ёстой. ISPmanager дээр үүнийг "Администраторын цахим шуудан" талбарт WWW домэйны шинж чанаруудад бүртгүүлж болно.

Виртуал хостын тайлбарт Apache вэб серверийн тохиргоонд хаягийг зааж өгөхдөө:

Php_admin_value sendmail_path "/usr/sbin/sendmail -t -i -f [имэйлээр хамгаалагдсан]"

Хэрэв PHP CGI эсвэл FastCGI горимд ашиглагдаж байгаа бол оруулгыг ~/php-bin/php.ini файлд бичнэ.

Sendmail_path = "/usr/sbin/sendmail -t -i -f [имэйлээр хамгаалагдсан]"

Захидал илгээх үед илгээгчийн хаягийн үнэн зөв эсэхийг шалгахыг идэвхгүй болгох

Sendmail нь өгөгдмөл байдлаар Мессеж илгээх хөтөлбөрөөс (MSP) эхэлдэг. Энэ нь шуудангийн дарааллыг зохицуулах тусдаа процесс юм.

Үүнийг FreeBSD систем дээр идэвхгүй болгох талаар авч үзье

/etc/make.conf файлд submit.cf файлыг автоматаар үүсгэхийг идэвхгүй болгох мөрийг бичнэ үү.

SENDMAIL_SET_USER_ID=тийм

Үүний дараа та submit.cf файлыг устгаж, sendmail-ийн гүйцэтгэгдэх файлын эрхийг өөрчлөх хэрэгтэй (үүн дээр SGID-ийн оронд SUID бит тавих, өөрөөр хэлбэл эрхийг 2755-ийн оронд 4755 болгож тохируулах) Sendmail-г дахин эхлүүлэх хэрэгтэй.

Эдгээр функцүүдийн үйл ажиллагаанд php.ini дээрх тохиргоонууд нөлөөлдөг.

Мэйл тохиргооны сонголтууд
Нэр Өгөгдмөл Өөрчлөгдөх боломжтой Өөрчлөлтийн бүртгэл
mail.add_x_header "0" PHP_INI_PERDIR PHP 5.3.0 хувилбараас хойш ашиглах боломжтой.
mail.log NULL PHP_INI_PERDIR PHP 5.3.0 хувилбараас хойш ашиглах боломжтой. (PHP_INI_SYSTEM|PHP_INI_PERDIR)
mail.force_extra_parameters NULL PHP_INI_PERDIR PHP 5.0.0 хувилбараас хойш ашиглах боломжтой. (PHP_INI_SYSTEM|PHP_INI_PERDIR)
SMTP "localhost" PHP_INI_БҮГД
smtp_port "25" PHP_INI_БҮГД
илгээх NULL PHP_INI_БҮГД
sendmail_path "/usr/sbin/sendmail -t -i" PHP_INI_SYSTEM
PHP_INI_* горимуудын талаарх дэлгэрэнгүй мэдээлэл, тодорхойлолтыг үзнэ үү.

Энд тохиргооны удирдамжийн товч тайлбар байна.

Нэмэх X-PHP-Originating-ScriptҮүнд скриптийн UID, дараа нь файлын нэр орно.

Mail.log мөр

Бүгдийг бүртгэх бүртгэлийн файлын зам мэйл()дуудлага. Бүртгэлийн бүртгэлд скриптийн бүрэн зам, мөрийн дугаар, руухаяг ба гарчиг.

Mail.force_extra_parameters мөр

Заасан параметрүүдийн нэмэлтийг sendmail хоёртын файлд нэмэлт параметр болгон шилжүүлэхийг албадах. Эдгээр параметрүүд нь 5-р параметрийн утгыг үргэлж орлуулах болно мэйл(), аюулгүй горимд ч гэсэн.

SMTP мөр

Зөвхөн Windows үйлдлийн систем дээр ашиглагддаг: PHP нь SMTP серверийн хостын нэр эсвэл IP хаягийг ашиглан илгээсэн захидалд ашиглах ёстой. мэйл()функц.

Smtp_port int

Зөвхөн Windows-д ашиглагддаг: серверт холбогдох портын дугаар SMTPашиглан захидал илгээх үед тохируулах мэйл(); өгөгдмөл нь 25.

-аас илгээх мөр

Аль нь "Хэнээс:" Windows үйлдлийн систем дээр PHP-ээс илгээсэн захидалд шуудангийн хаягийг ашиглах ёстой. Энэ заавар нь мөн тогтоосон "Буцах зам:"толгой.

Sendmail_path мөр

Хаана шуудан илгээхпрограмыг олж болно, ихэвчлэн /usr/sbin/sendmail эсвэл /usr/lib/sendmail . тохируулахнь танд зориулж үүнийг олохыг хичээж, өгөгдмөл тохиргоог хийх боловч амжилтгүй болбол та энд тохируулж болно.

Ашиглахгүй байгаа системүүд шуудан илгээххэрэв байгаа бол тэдний захидлын системийн санал болгож буй илгээмжийн боодол/орлуулалтад энэ удирдамжийг тохируулах ёстой. Жишээлбэл, Qmail хэрэглэгчид үүнийг /var/qmail/bin/sendmail эсвэл /var/qmail/bin/qmail-inject гэж тохируулж болно.

qmail-injectзахидал зөв боловсруулах ямар ч сонголт шаарддаггүй.

Энэ заавар нь Windows дээр бас ажилладаг. Хэрэв тохируулсан бол smtp , smtp_port болон sendmail_from-г үл тоомсорлож, заасан тушаалыг гүйцэтгэнэ.

5 жилийн өмнө

Ubuntu 13.04 дээр бусад түгээлтийн талаар сайн мэдэхгүй байна.

Хэрэв та өгөгдмөл тайлбарыг зүгээр л арилгавал:

sendmail_path = "sendmail -t -i"

Таны mail() функцууд бүгд амжилтгүй болно. Учир нь та БҮРЭН PATH (жишээ нь /usr/sbin/sendmail -t -i) байрлуулах ёстой.

Баримт бичигт PHP нь илгээх шуудангийн зөв замыг олохын тулд хамгийн сайн арга гэж үздэг боловч энэ нь миний хувьд амжилтгүй болсон нь тодорхой байна.

Тиймээс, шуудангаа илгээхийн тулд үргэлж БҮТЭН ЗАМ-ыг оруулаарай, эс тэгвээс та гэнэтийн амжилтгүй үр дүнд хүрч болзошгүй.

Хоёрдахь тэмдэглэл болгон: -f параметрийг ХЭРЭГЖҮҮЛЭХИЙГ л хүсэж байгаа хүмүүс php.ini дээр дараахыг ашиглан хийж болно:

mail.force_extra_parameters = [имэйлээр хамгаалагдсан]

Та илгээсэн шуудангийн замыг тайлбартай үлдээж болно, энэ нь анхдагч тохиргоог ашигласан хэвээр байх болно (хэрэв хайвал тохируулах нь маш чухал UNIX -t -i сонголтуудын доор).

Гэхдээ одоо mail() функцын 5-р аргументтай байсан ч үүнийг өөрчлөх арга байхгүй. -f нь чухал, учир нь ТОХИРУУЛАГГҮЙ бол РНР скрипт аль хэрэглэгч дээр ажиллаж байгааг тохируулах бөгөөд та үүнийг хүсэхгүй байж магадгүй.

Мөн -f нь Return-Path: толгой хэсгийг тохируулдаг бөгөөд үүнийг Bounce хаяг болгон ашигладаг, хэрэв алдаа гарвал та тэдгээрийг боловсруулах боломжтой. Чи чи Return-Path: in mail() толгой хэсэгт ямар нэг шалтгаанаар тохируулж чадахгүй байна... та өмнө нь хийж болно. Одоо та -f сонголтыг ашиглах хэрэгтэй.

2 жилийн өмнө

Хэрэв хэн нэгэн PHP алдааны бүртгэлд энэ нууцлаг алдааны мессежийг хүлээн авбал:
"sh: -t: тушаал олдсонгүй"
PHP 5.4 хувилбарыг шинэчилсний дараа энэ нь танд тохирсон шийдэл байж магадгүй юм.

Би PHP-г 5.4-ээс 5.6 болгон шинэчилсэн бөгөөд бидний бүх mail() функц гэнэт эвдэрч, ямар ч ашигтай алдаа бүртгэлгүй.

ini файл; Хэрэв та ini_set()-г ашиглан sendmail хоёртын файл руу шууд очих замыг зааж өгвөл одоо үүнийг үл тоомсорлодог.

Тиймээс, оронд нь php.ini дээр "sendmail_path" гэж зааж өгөөрэй. Энэ бол бидний бүх mail() функцийг зассан.

Энэ бяцхан тэмдэглэл намайг алдааг олж засварлаж, судлахад зарцуулсан шигээ хэн нэгний цагийг хэмнэнэ гэж найдаж байна. Баяртай!

3 жилийн өмнө

Буцах замыг тохируулах:

Буцах замын толгой хэсэг нь smtp-ийн хэсэг биш учраас ажиллахгүй.

On *nix -f-г шуудангийн команд дээр тохируулж болно
хувилбараар
Зарим MTA нь эхний толгойн мөрөнд mbox маягийн "From" толгойг хүлээн авдаг
Тайлбар: "From"-ын дараа хоёр цэг байхгүй, толгойн эхний мөр байх ёстой
эсвэл та буцах замын толгойг тайлбарлахын тулд MTA-г дахин тохируулах боломжтой

F бол хамгийн найдвартай арга боловч бүрхүүлээс зугтах асуудлаас болж бусад командын мөрийн сонголтыг хийх боломжгүй гэсэн үг юм.

Мөн цахим шуудангийн форматын шаардлагууд нь цонх болон бусад бүх зүйлд өөр байдгийг анхаарна уу. sendmail зөвхөн \n мөрийн төгсгөлийг хүлээж байна

Би дотоод вэб сервер тохируулах болгондоо Sendmail-д зориулсан stub-ийн тухай асуулттай тулгардаг.

Windows-д зориулсан гайхалтай шийдэл байна: Windows-д зориулсан хуурамч илгээмж(sendmail.exe) http://glob.com.au/sendmail/
Энэ шийдлийн талаар Хабре дээр нийтлэл байна: Windows-д зориулсан PHP мэйл http://habrahabr.ru/post/26518/
Windows-д зориулсан өөр нэг шийдэл: Мэйл серверийн хэрэгслийг турших http://www.toolheap.com/test-mail-server-tool/
Линукс хэрэглэгчдэд зориулсан нийтлэл бас байна: Linux-д зориулсан Sendmail stub http://habrahabr.ru/post/49665/

Би хувьдаа цэвэр PHP дээрх шийдэл нь илүү их таалагдсан бөгөөд үүнийг цаашид хэлэлцэх болно.

Давуу тал:

  • Гуравдагч талын үйлчилгээ байхгүй
  • PHP суулгасан үйлдлийн системд зориулсан платформ хоорондын шийдэл
  • Хамгийн бага stub файлын хэмжээ
  • Бүх stub логикийг PHP дээр засварлах боломжтой
  • Зурвасыг файлд хадгалж байна

Сул талуудаас:

  • Бодит шуудангийн хайрцаг руу дамжуулах боломжгүй

Аргумент ба боломжуудын жагсаалт:

  • --захирал<Путь к папке> - Файлын хавтас
  • --файл<имя файла> - Мессеж бүрийг тодорхой хуваалцсан файлд хадгал
  • --түрүүвч- Хуваалцсан файлын эхэнд шинэ зурвас нэмнэ үү
  • --нээлттэй- Мессеж файлыг Notepad дээр автоматаар нээх

PHP.INI файлын параметрүүд:

;SMTP = localhost ;smtp_port = 25 ;sendmail_from = [имэйлээр хамгаалагдсан] sendmail_path = "php.exe C:sendmail.php --дир C:mail --нээлттэй"

Хэрэв php.exe-д хүрэх замыг PATH-д заасан бол PHP.INI-д үүнийг зааж өгөх шаардлагагүй, эс бөгөөс php.exe-г өөрчлөхийг зөвлөж байна.<Путь к папке с PHP>php.exe

Sendmail_path = "C:serverbinphpphp.exe C:sendmail.php --dir C:mail --open"

Линукс дээр та эхлээд файлыг ажиллуулах боломжтой болгохоо мартуузай, тэр даруй файл руу орох замыг зааж өгч болно. chmod 755 sendmail.php

Sendmail_path = "/home/someuser/sendmail.php --dir /tmp/mail"

sendmail.php скрипт өөрөө:

#!/usr/local/bin/php

Хэрэв энэ нь танд хэрэгтэй бол би баяртай байх болно.

Би саяхан гэрийн сервер тохируулсан бөгөөд би тэнд захидал илгээхийг шалгах шаардлагатай болсон. Гэхдээ энд асуудал байна: захидал илгээх хуудсыг хүсэх үед 500 алдаа гарч ирэв.

Асуудал

Би юу болоод байгааг харж эхлэв. Php-fpm бүртгэлд сонирхолтой зүйл байхгүй; nginx бүртгэлээс та php-fpm upstream нь хугацаа хэтэрсэний улмаас гацаж байгааг харж болно.

2013/04/18 15:28:01 6928#0: *1409 дээд урсгалын хугацаа дууссан (110: Холболтын хугацаа хэтэрсэн), дээд урсгалаас хариултын толгойг уншиж байхад үйлчлүүлэгч: xx.xx.xx.xx, сервер: , хүсэлт: "POST /page.php HTTP/1.1", дээд тал нь: "fastcgi://127.0.0.1:9010", хост: "site.ru", лавлагаа: "http://site.ru"

Тэгээд дараа нь syslog-г үзэх санаа толгойд орж ирэв. Тэнд би сонирхолтой мөрүүдийг харсан:

9 сарын 18:53:20 mega sm-msp-queue: Миний шаардлага хангаагүй хостын нэр (мега) тодорхойгүй; Дахин оролдохоор унтаж байна 9-р сарын 9 18:54:20 мега sm-msp-дараалал: өөрийн домэйн нэрийг (мега) хангах боломжгүй -- богино нэр ашиглан

Тийм ээ, би sendmail-ийн чиглэлд нүгэл үйлдэж эхэлсэн. Би үүнийг дараах тушаалаар дахин эхлүүлэхийг оролдож байна:

Sudo үйлчилгээ sendmail дахин эхлүүлнэ

мөн би өөрийн таамаглалыг баталж байна.

Andrey@mega:/home/andrey# sudoservice sendmail дахин эхлүүлэх sudo: xyz.xyz хостыг шийдвэрлэх боломжгүй * Мэйл Тээврийн Агентийг (MTA) дахин эхлүүлж байна sendmail andrey@mega:/home/andrey#

Шийдэл

Асуудал нь серверийн нэр байсан. Би серверийн нэрийг ингэж (цэгтэй) тохируулсны дараа бүх зүйл байх ёстой шигээ ажилласан.

127.0.0.1 localhost localhost.localdomain mega mega.foobar

Баярлалаа!

Хэрэв энэ нийтлэл танд тусалсан бол эсвэл та миний судалгаа, блогийг дэмжихийг хүсч байвал үүнийг хийх хамгийн сайн арга бол:

mail() php функцийг танилцуулж, и-мэйл илгээхэд ашиглах энгийн жишээ. Аль нь дээр вэ, эсвэл Sendmail vs mail.

PHP mail() функц нь танд заасан имэйл хаяг руу имэйл илгээх боломжийг олгодог.

Синтакс:

Боол шуудан(мөр $ to,мөр $сэдэв,мөр $ мессеж[, мөр $additional_headers[, мөр $нэмэлт_параметрүүд]]);

Сонголтууд:

  • руу- RFC 2822 форматын дагуу захидал хүлээн авагчийн имэйл хаяг. Жишээлбэл:
  • сэдэв- RFC 2047 форматын дагуу илгээсэн захидлын сэдэв
  • Захиа- илгээсэн захидлын агуулга. Мөр бүр 70 тэмдэгтээс хэтрэхгүй байх ёстой бөгөөд шинэ мөрийн тэмдэгтээр төгсөх ёстой (\n).

    Зөвхөн Windows: PHP SMTP сервер рүү шууд хандах үед мөрийн эхэнд байгаа цэг арилна. Энэ нюанстай тэмцэхийн тулд та шугамын эхэнд давхар цэг ашиглах хэрэгтэй.

    $мессеж = str_replace("\n.", "\n..", $мессеж);

  • нэмэлт_толгой(заавал биш) – үсгийн толгойн дараа нэмэгдэх мөр. Ихэвчлэн нэмэлт гарчиг (From, Cc болон Bcc) нэмэхэд ашигладаг. Мөрүүдийг CRLF (\r\n)-ээр тусгаарлах ёстой.
  • нэмэлт_параметрүүд(заавал биш) - захидал илгээхэд зориулагдсан програмын ашигладаг нэмэлт параметрүүд.

Буцах: ҮНЭНзахидал амжилттай илгээсэн бол эсвэл ХУДАЛХэрвээ биш бол. Хэрэв захидал амжилттай илгээх дараалалд орсон бол энэ нь хүлээн авагчид хүрнэ гэсэн үг биш гэдгийг тэмдэглэх нь зүйтэй.

Одоо бид онолыг ойлгосон тул дадлага хийж эхлэх боломжтой. Гэхдээ эхлээд би танд бидний ажлыг ихээхэн хөнгөвчлөх хэд хэдэн ашигтай функцийг өгөхийг хүсч байна.

Жишээ: php функц MIME base64 кодчилол, кодчилолыг харгалзан үзнэ

mime_base64 функц($string, $charset="windows-1251") ( "=?" буцах . $charset . "?B?" . base64_encode(trim($string)) . "?="; )

Захиа илгээх үед гарч ирдэг бэрхшээлүүдийн нэг бол үсгийн толгой үүсэх явдал юм. Ялангуяа кирилл үсгээр бичсэн толгой хэсэг, илгээгч, хүлээн авагчийн нэрийг хүлээн авагчийн цахим шуудангийн үйлчлүүлэгч гажуудсан хэлбэрээр таних боломжтой. Энэ асуудлаас зайлсхийхийн тулд та байтуудын дарааллыг хэвлэх боломжтой ASCII тэмдэгтүүдийн дараалал болгон хувиргадаг MIME base64 кодчилолыг ашиглаж болно.

Функц is_email($string) ( буцах preg_match("/^()+([\.a-zA-Z0-9_-])*@()+(\.+)*\.((2,6)) $/", $string);)

Эдгээрийг бас цэгцэлсэн. Одоо энэ тэмдэглэлийг бичсэнийхээ төлөө.

Жишээ: mail() php функцийг ашиглан имэйл илгээх

$charset = "windows-1251"; $from = mime_base64("Илгээгчийн нэр", $charset) . " "; $to = mime_base64("Хүлээн авагчийн нэр", $charset) ". "; $subject = mime_base64("Илгээж буй мессежийн сэдэв", $charset); $message = "Илгээж буй мессежийн агуулга."; $message = wordwrap($message, 70); $headers = "Хүүнээс: " . $from . " \r\n" . "Хариу бичих: " . $from . "\r\n" . "X-Mailer: PHP/" . phpversion(). "\r\n" . MIME хувилбар: 1.0" . "\r\n" . "Агуулгын төрөл: текст/энгийн; charset = "". $ тэмдэгтийн багц. """; хэрэв (мэйл($ to, $subject, $мессеж, $толгой)) ( echo "

Захиа илгээсэн.

"; ) өөрөөр ( цуурай "

Алдаа гарсан байна.

"; }

Би янз бүрийн нарийн ширийн зүйлийг аль хэдийн анхаарч үзсэн тул сэтгэгдэл бичих шаардлагагүй гэж бодож байна. RFC толгойн багцын сонголтууд өөр байж болох ч локал сервер дээр би дараахь зүйлийг авсан.

X-Sendmail-Cmdline: sendmail.pl -t -i Хэнд: =?windows-1251?B?yOz/IO/u6/P36PLl6/w=?= Гарчиг: =?windows-1251?B?0uXs4CDu8u/w4OLr/+Xs7uPuIO/o8fzs4A==?= Эх сурвалж: =?windows-1251?B?yOz/IO7y7/Dg4ujy5ev8?= Хариулах: =?windows-1251?B?yOz/IO7y7/Dg4ujy5ev8?= X-Mailer: PHP/5.3.3 MIME-хувилбар: 1.0 Агуулгын төрөл: текст/энгийн; charset = "windows-1251"

Sendmail vs php mail()

Эцэст нь, жижиг боловсролын хөтөлбөр. Sendmail нь шуудангийн серверүүдийн (MTA) нэг бөгөөд mail() php функц нь SMTP холболтоор имэйл илгээх процессыг зүгээр л хэрэгжүүлдэг. PHP функцийг ашиглах нь тохиромжтой боловч оновчтой шийдлээс хол байгаа нь ойлгомжтой. Ихэвчлэн mail() нь том хэмжээний шуудан илгээдэггүй тохиолдолд ашиглагддаг.