로컬 개발 시스템에서 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.