Chức năng php mail () chậm trên máy phát triển cục bộ


21

Bối cảnh: Nếu bạn đã thiết lập một máy chủ apache cục bộ cho mục đích phát triển, bạn có thể gặp phải vấn đề trong đó sendmail mất nhiều thời gian (ít nhất một phút) để gửi email. Điều này cực kỳ bực bội nếu bạn đang cố gắng gỡ lỗi một vấn đề với một email bạn đã tạo.

Có một số bài viết diễn đàn trên internet thảo luận về vấn đề này. Tuy nhiên, không có chủ đề nào mô tả những gì cần làm chi tiết cho kiến ​​thức hạn chế của tôi. Dưới đây là các bước làm việc cho tôi:

1) tìm tên máy chủ của bạn (trong trường hợp bạn quên nó) bằng lệnh này:

:~$ cat /hosts/hostname

myhostname

2) chỉnh sửa tập tin /etc/hostsvà đảm bảo dòng đầu tiên như sau:

127.0.0.1 localhost.localdomain localhost myhostname

3) chỉnh sửa tệp cấu hình sendmail ( /etc/mail/sendmail.cftrong Ubuntu) và Bỏ dòng#O HostsFile=/etc/hosts

4) Khởi động lại máy tính. Máy tính sẽ khởi động nhanh hơn nhiều bây giờ và chức năng mail () sẽ trả về gần như ngay lập tức. TUY NHIÊN, các email sẽ không thực sự được gửi trừ khi bạn làm theo bước 5.

5) Bạn mới phải sử dụng tùy chọn sendmail '-f' bất cứ khi nào sử dụng chức năng thư. Ví dụ:

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

Câu hỏi của tôi cho các máy chủ đồng nghiệp của tôi là:

Những thay đổi nào khác có thể được thực hiện để tôi không phải sử dụng tùy chọn sendmail -f? Mặc dù không khó để thêm tùy chọn -f, nhưng đó là một vấn đề khi CMS của bạn (chẳng hạn như Drupal) không sử dụng tùy chọn -f khi gửi thư. Bạn sẽ cần phải hack một mô-đun lõi để thêm tùy chọn này.


1
trên hệ thống Ubuntu của tôi, lệnh làcat /etc/hostname
zbest

Câu trả lời:


6

Vâng tôi biết rằng đây không phải là những gì bạn đang hỏi, nhưng tại sao bạn không thử Postfix hoặc Exim? Cả hai đều có sẵn cho Ubuntu (Postfix thậm chí là mta mặc định trên các hệ thống Ubuntu) và cả hai đều cung cấp lệnh 'sendmail' tương thích hoạt động rất tốt. IMHO sendmail là loại ngày và bạn sẽ có cơ hội hỗ trợ tốt hơn với MTA hiện đại hơn.


Ngay cả khi có hệ thống thư tốt hơn sendmail, vấn đề vẫn là duy trì một máy chủ phát triển phản ánh máy chủ sản xuất. sendmail là tác nhân thư mặc định cho php.
Michael B

1
Bạn có nghĩa là sendmail phần mềm hoặc sendmail nhị phân? Bởi vì Exim và Postfix cũng có sendmailtệp nhị phân chấp nhận các tùy chọn giống như sendmail gốc, cho các vấn đề tương thích.
coredump

Tôi không phải là người hâm mộ Exim từ kinh nghiệm trong quá khứ, nhưng đã cho Postfix thử và giải quyết các vấn đề chúng tôi xảy ra với Sendmail ngay lập tức!
quickshiftin

2

Điều này làm việc cho tôi:

  • Cài đặt hậu tố

Xem hướng dẫn tại đây về cách thực hiện việc này tại đây: https://help.ubfox.com/community/Postfix (Nó có thể đã được cài đặt và nhị phân 'sendmail' thực sự có thể là bí danh cho hậu tố)

  • Làm theo hướng dẫn tại đây:

http://lenss.nl/2009/01/making-php-mail-work-on-ubfox- phiên-postfix /

mkfifo /var/spool/postfix/public/pickup

Tìm sendmailquá trình

ps aux | grep mail

Giết nó

kill <thepid>

Khởi động lại postfix

/etc/init.d/postfix restart

Tôi nghĩ bạn chỉ có thể đặt tham số 'myorigin' cho bất kỳ tên miền hoạt động nào, chẳng hạn như tên miền bạn sở hữu.


Hoàn hảo! Đã làm điều này SAU làm tôi lo lắng trong hai giờ. =)
Hannes Schneidermayer

1

Điều này có thể hoặc không có thể là một giải pháp cho bạn: add mail.force_extra_parameters = "-fsender@somewhere.com"to your php.ini tập tin. Nó làm cho PHP tự động nối thêm -fsender@somewhere.com làm tham số thứ năm cho hàm mail () của PHP.

Đó là một giá trị được mã hóa cứng và chỉ áp dụng trong php.ini, vì vậy nó sẽ không linh hoạt, nhưng có lẽ phù hợp với bạn trong trường hợp phát triển của bạn?


0

Bằng cách xem lưu lượng truy cập mạng (suy nghĩ tcpdump) hoặc bằng cách chạy stracetrên các quy trình sendmail hoặc apache của bạn, bạn sẽ có thể biết được lý do tại sao sự chậm trễ đó lại ở đó để bạn có thể khắc phục sự cố gốc.

Thông thường sự chậm trễ trong phạm vi đó là do lỗi tra cứu DNS, nhưng bạn sẽ không biết cho đến khi bạn nhìn. Trừ khi bạn khắc phục vấn đề tiềm ẩn, nó có thể sẽ trở thành một vấn đề cho dù bạn cố gắng giải quyết vấn đề như thế nào.


1
Sự chậm trễ đã được gây ra bởi tên máy chủ là một từ duy nhất chứ không phải là FQDN (tên miền đủ điều kiện). Bằng cách trỏ sendmail đến / etc / hosts và có localhost.domain làm tên miền đầu tiên (là FQDN), không có độ trễ. Điều này đã được sửa trong các bước 1-4. Vấn đề còn lại là phải sử dụng '-f' - vẫn là một cải tiến lớn về việc phải chờ 2 phút để gửi thư.
Michael B

0

Tôi chưa bao giờ gặp phải vấn đề khi sử dụng mail () trong PHP mà không phải là vấn đề trên MTA.

Trong tệp php.ini của bạn, nó sẽ hiển thị lệnh nào nó chạy để gửi email (mặc định: "sendmail -t -i"). Hãy thử gửi email từ dòng lệnh bằng cách này - Tôi sẽ đặt cược chậm.

Những điều thông thường cần kiểm tra là liệu máy chủ DNS có được cấu hình đúng trên máy không (và có thể giải quyết tất cả các địa chỉ được định cấu hình trong MTA) và nếu chuyển tiếp thông minh được định cấu hình thì tên đó có thể phân giải thành địa chỉ mà hệ thống có thể kết nối.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.