로컬 개발 시스템에서 PHP mail () 함수가 고통스럽게 느려짐


21

배경 : 개발 목적으로 로컬 아파치 서버를 설정 한 경우 sendmail이 이메일을 보내는 데 시간이 오래 (최소 1 분) 걸리는 문제가 발생할 수 있습니다. 생성 한 이메일로 문제를 디버깅하려고하면 매우 실망 스럽습니다.

인터넷에는이 문제에 대해 토론하는 몇 ​​개의 포럼 게시물이 있습니다. 그러나 주제 중 어느 것도 내 제한된 지식에 대해 충분히 자세하게 무엇을 해야하는지 설명하지 않았습니다. 나를 위해 일한 단계는 다음과 같습니다.

1) 다음 명령을 사용하여 호스트 이름을 찾으십시오 (잊어 버린 경우).

:~$ cat /hosts/hostname

myhostname

2) 파일을 편집하고 /etc/hosts첫 번째 줄이 다음과 같은지 확인하십시오.

127.0.0.1 localhost.localdomain localhost myhostname

3) sendmail 구성 파일을 편집하고 ( /etc/mail/sendmail.cf우분투에서) 줄 주석 처리를 제거하십시오#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 옵션을 추가하기는 어렵지 않지만 Drupal과 같은 CMS가 메일을 보낼 때 -f 옵션을 사용하지 않는 경우 문제가됩니다. 이 옵션을 추가하려면 핵심 모듈을 해킹해야합니다.


1
내 우분투 시스템에서 명령은cat /etc/hostname
— zkent

답변:


6

글쎄, 이것이 당신이 요구하는 것이 아니라 왜 Postfix 또는 Exim을 시도하지 않습니까? 둘 다 우분투에서 사용할 수 있으며 (Postfix는 심지어 우분투 시스템에서 기본 mta 임), 둘 다 잘 작동하는 호환 가능한 'sendmail'명령을 제공합니다. IMHO sendmail은 구식이며 최신 MTA로 더 나은 지원을받을 수 있습니다.


sendmail보다 더 나은 메일 시스템이 있더라도 프로덕션 서버를 미러링하는 개발 서버가 문제가됩니다. sendmail은 PHP의 기본 메일 에이전트입니다.
— Michael B

1
소프트웨어를 sendmail로 보내거나 바이너리를 sendmail로 보내시겠습니까? Exim과 Postfix에는 sendmail호환성 문제로 인해 원래 sendmail과 동일한 옵션을 허용 하는 바이너리가 있습니다.
— coredump

나는 과거의 경험에서 Exim을 좋아하지는 않지만 Postfix에 시도하고 Sendmail에서 즉시 발생하는 문제를 해결했습니다!
— quickshiftin

2

이것은 나를 위해 일했다 :

  • 접미사 설치

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'매개 변수를 소유 한 도메인 이름과 같은 활성 도메인 이름으로 설정할 수 있다고 생각합니다.


완전한! 2 시간 동안 나를 괴롭힌 후 =)
— Hannes Schneidermayer

1

추가 :이 또는 당신을위한 해결책이 될하지 않을 수도 있습니다 mail.force_extra_parameters = "-fsender@somewhere.com"귀하에 의 php.ini 파일을. PHP는 자동으로 -fsender@somewhere.com 을 PHP의 mail () 함수에 다섯 번째 매개 변수로 추가 합니다.

그것은 하드 코딩 된 값이며 php.ini에만 적용 가능하므로 매우 유연하지는 않지만 개발 사례에서 효과가 있습니까?


0

네트워크 트래픽 (생각 tcpdump)을 보거나 stracesendmail 또는 아파치 프로세스 를 실행 하여 근본 문제를 해결할 수 있도록 지연이 발생 하는 이유 를 알 수 있어야합니다.

일반적으로이 범위의 지연은 DNS 조회 실패로 인한 것이지만, 볼 때까지 알 수 없습니다. 근본적인 문제를 해결하지 않으면 문제 해결 방법에 관계없이 문제가 될 수 있습니다.


1
호스트 이름이 FQDN (정규화 된 도메인 이름)이 아닌 단일 단어이기 때문에 지연이 발생했습니다. sendmail을 / etc / hosts로 지정하고 localhost.domain을 첫 번째 도메인 이름 (FQDN)으로 지정하면 지연이 없습니다. 1-4 단계에서 수정되었습니다. 나머지 문제는 '-f'를 사용해야합니다. 메일을 보내기 위해 2 분 동안 기다려야하는 부분이 여전히 개선되었습니다.
— Michael B

0

PHP에서 mail ()을 사용하여 MTA에 문제가 발생하지 않은 문제를 본 적이 없습니다.

php.ini 파일에는 이메일을 보내기 위해 어떤 명령이 실행되는지 표시됩니다 (기본값 : "sendmail -t -i"). 이것을 사용하여 커맨드 라인에서 이메일을 보내보십시오-느리게 걸겠습니다.

일반적으로 확인해야 할 사항은 DNS 서버가 시스템에 올바르게 구성되어 있는지 (MTA에 구성된 모든 주소를 확인할 수 있는지) 스마트 릴레이가 구성된 경우 이름을 시스템이 연결할 수있는 주소로 확인할 수 있다는 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.