php mail () ฟังก์ชั่นช้าลงอย่างเจ็บปวดบนเครื่องพัฒนาท้องถิ่น


21

พื้นหลัง: หากคุณตั้งค่าเซิร์ฟเวอร์ apache ในระบบเพื่อการพัฒนาคุณอาจพบปัญหาที่ sendmail ใช้เวลานาน (อย่างน้อยหนึ่งนาที) ในการส่งอีเมล สิ่งนี้น่าผิดหวังอย่างยิ่งหากคุณพยายามแก้ไขข้อบกพร่องของอีเมลที่คุณสร้างขึ้น

มีโพสต์ฟอรัมหลายแห่งบนอินเทอร์เน็ตที่กล่าวถึงปัญหานี้ อย่างไรก็ตามไม่มีชุดรูปแบบที่อธิบายสิ่งที่ต้องทำในรายละเอียดเพียงพอสำหรับความรู้ที่ จำกัด ของฉัน นี่คือขั้นตอนที่เหมาะกับฉัน:

1) ค้นหาชื่อโฮสต์ของคุณ (ในกรณีที่คุณลืม) โดยใช้คำสั่งนี้:

:~$ cat /hosts/hostname

myhostname

2) แก้ไขไฟล์/etc/hostsและตรวจสอบให้แน่ใจว่าบรรทัดแรกมีดังต่อไปนี้:

127.0.0.1 localhost.localdomain localhost myhostname

3) แก้ไขไฟล์การตั้งค่า sendmail ( /etc/mail/sendmail.cfใน Ubuntu) และยกเลิกหมายเหตุบรรทัด#O HostsFile=/etc/hosts

4) รีสตาร์ทคอมพิวเตอร์ คอมพิวเตอร์ควรบูทเร็วขึ้นมากในขณะนี้และฟังก์ชั่น mail () จะกลับมาเกือบจะในทันที อย่างไรก็ตามอีเมลจะไม่ถูกส่งเว้นแต่ว่าคุณทำตามขั้นตอนที่ 5

5) คุณต้องใหม่ใช้ตัวเลือก sendmail '-f' ทุกครั้งที่ใช้ฟังก์ชั่นจดหมาย ตัวอย่างเช่น:

mail('recipient@somewhere.com', 'the subject', 'the message', null, '-fsender@somewhere.com');

คำถามของฉันสำหรับเพื่อนสมาชิกเซิร์ฟเวอร์คือ:

สามารถทำการเปลี่ยนแปลงอะไรเพิ่มเติมเพื่อที่ฉันไม่ต้องใช้ตัวเลือก sendmail -f? แม้ว่าจะไม่ยากในการเพิ่มตัวเลือก -f แต่เป็นปัญหาเมื่อ CMS ของคุณ (เช่น Drupal) ไม่ได้ใช้ตัวเลือก -f เมื่อส่งจดหมาย คุณจะต้องแฮ็คโมดูลหลักเพื่อเพิ่มตัวเลือกนี้


1
บนระบบ Ubuntu ของฉันคำสั่งคือcat /etc/hostname
zkent

คำตอบ:


6

ฉันรู้ว่านี่ไม่ใช่สิ่งที่คุณถาม แต่ทำไมคุณไม่ลอง Postfix หรือ Exim พวกเขาทั้งสองมีให้สำหรับ Ubuntu (Postfix เป็นแม้แต่ค่าเริ่มต้น mta บนระบบ Ubuntu) และพวกเขาทั้งคู่ให้คำสั่ง 'sendmail' ที่ใช้งานร่วมกันได้ซึ่งทำงานได้ดีมาก IMHO sendmail นั้นเก่าและคุณจะได้รับโอกาสในการสนับสนุนที่ดีขึ้นด้วย MTA ที่ทันสมัยกว่า


แม้ว่าจะมีระบบเมลที่ดีกว่า sendmail แต่ปัญหาก็คือเซิร์ฟเวอร์การพัฒนาที่ทำมิเรอร์เซิร์ฟเวอร์การผลิต sendmail เป็นตัวแทนจดหมายเริ่มต้นสำหรับ php
Michael B

1
คุณหมายถึง sendmail ซอฟต์แวร์หรือ sendmail ไบนารี่? เนื่องจาก Exim และ Postfix มีsendmailไบนารีที่ยอมรับตัวเลือกเดียวกันกับ sendmail ดั้งเดิมเพื่อความเข้ากันได้
coredump

ฉันไม่ได้เป็นแฟนของเอ็กซิมมากนักจากประสบการณ์ที่ผ่านมา แต่ให้ลองใช้ Postfix และแก้ไขปัญหาที่เกิดขึ้นกับ Sendmail ทันที!
quickshiftin

2

สิ่งนี้ใช้ได้กับฉัน:

  • ติดตั้ง postfix

ดูคำแนะนำที่นี่เกี่ยวกับวิธีการทำสิ่งนี้ที่นี่: https://help.ubuntu.com/community/Postfix (อาจได้รับการติดตั้งแล้วและไบนารี 'sendmail' อาจเป็นนามแฝงสำหรับ postfix)

  • ทำตามคำแนะนำที่นี่:

http://lenss.nl/2009/01/making-php-mail-work-on-ubuntu-through-postfix/

mkfifo /var/spool/postfix/public/pickup

ค้นหาsendmailกระบวนการ

ps aux | grep mail

ฆ่ามัน

kill <thepid>

เริ่มต้นใหม่ postfix

/etc/init.d/postfix restart

ฉันคิดว่าคุณสามารถตั้งค่าพารามิเตอร์ 'myorigin' เป็นชื่อโดเมนที่ใช้งานอยู่เช่นชื่อโดเมนที่คุณเป็นเจ้าของ


ที่สมบูรณ์แบบ! สิ่งนี้ทำให้เกิดภัยพิบัติรอบสองชั่วโมงหรือไม่ =)
Hannes Schneidermayer

1

นี้อาจหรือไม่อาจจะแก้ปัญหาได้สำหรับคุณ: เพิ่มmail.force_extra_parameters = "-fsender@somewhere.com"ที่คุณphp.iniไฟล์ ทำให้ PHP ผนวก-fsender@somewhere.comโดยอัตโนมัติเป็นพารามิเตอร์ตัวที่ห้าในฟังก์ชัน mail () ของ PHP

นั่นเป็นค่า hardcoded และใช้ได้เฉพาะใน php.ini ดังนั้นมันจะไม่ยืดหยุ่นมาก แต่อาจเหมาะกับคุณในกรณีของการพัฒนาของคุณ?


0

ด้วยการดูปริมาณข้อมูลเครือข่าย (คิดtcpdump) หรือโดยใช้straceกระบวนการ sendmail หรือ apache ของคุณคุณควรจะได้รับทราบว่าเหตุใดจึงมีความล่าช้าดังกล่าวเพื่อให้คุณสามารถแก้ไขปัญหารากได้

โดยปกติแล้วความล่าช้าในช่วงนั้นเกิดจากความล้มเหลวในการค้นหา DNS แต่คุณจะไม่รู้จนกว่าคุณจะมอง ถ้าคุณไม่แก้ไขปัญหาพื้นฐานมันอาจจะกลายเป็นปัญหาไม่ว่าคุณจะพยายามแก้ไขมันอย่างไร


1
ความล่าช้าเกิดจากชื่อโฮสต์เป็นคำเดียวแทนที่จะเป็น FQDN (ชื่อโดเมนแบบเต็ม) โดยการชี้ sendmail ไปที่ / etc / hosts และให้ localhost.domain เป็นชื่อโดเมนแรก (ซึ่งเป็น FQDN) จะไม่มีความล่าช้า สิ่งนี้ได้รับการแก้ไขในขั้นตอนที่ 1-4 ปัญหาที่เหลือคือการใช้ '-f' - ยังคงเป็นการปรับปรุงที่สำคัญในการรอ 2 นาทีในการส่งจดหมาย
Michael B

0

ฉันไม่เคยเจอปัญหาในการใช้ mail () ใน PHP ที่ไม่ได้เกิดจากปัญหาของ MTA

ในไฟล์ php.ini ของคุณมันจะแสดงคำสั่งที่มันทำงานเพื่อส่งอีเมล (ค่าเริ่มต้น: "sendmail -t -i") ลองส่งอีเมลจากบรรทัดคำสั่งโดยใช้สิ่งนี้ - ฉันจะเดิมพันช้า

สิ่งที่ควรตรวจสอบคือเซิร์ฟเวอร์ DNS ถูกกำหนดค่าอย่างถูกต้องบนเครื่อง (และสามารถแก้ไขที่อยู่ทั้งหมดที่กำหนดค่าใน MTA) และหากมีการกำหนดค่าการถ่ายทอดสมาร์ทชื่อนั้นจะสามารถแก้ไขชื่อที่อยู่ที่ระบบสามารถเชื่อมต่อได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.