PHP가 대상으로 직접 이동하는 대신 로컬 Postfix SMTP를 통과하도록 하려면 어떻게 해야 합니까?

PHP가 대상으로 직접 이동하는 대신 로컬 Postfix SMTP를 통과하도록 하려면 어떻게 해야 합니까?

사용자가 요청을 보낼 수 있는 양식이 있는 웹사이트가 있습니다. 또한 사이트는 미리 정의된 이메일을 고객에게 보냅니다. 양식에 스팸이 들어오고 있고(놀랍게도) 특정 이메일을 사용할 때 [email protected]대상이 이메일이 유효하지 않다고 (적어도 한 번) 알려주었기 때문에 이메일이 나가는 것을 막으려고 노력하고 있습니다.

+-----------------+
| Webform         |
+------+----------+
       |
       v
+-----------------+
| PHP             |
+------+-------+--+
       |       |
       |       +-----------------+
       |                         |
       | send form data to us    | send thank you note
       v                         v
+----------------------+  +--------------------+
| [email protected]  |  | [email protected] |
+----------------------+  +--------------------+

최소한 오른쪽의 이메일( 로 보낸 이메일 [email protected])을 차단하고 싶습니다.

이를 위해 bad_recipients정규식 목록이 포함된 파일이 있습니다.

/.*hack.*@example.com/ REJECT
...

이것은 내 컴퓨터에서는 잘 작동하지만 로컬 PHP 스크립트에서는 모든 이메일이 통과됩니다.

+---------------------------+           +---------------------------+
|                           |           |                           |
|  +---------------------+  |           |  +---------------------+  |
|  |                     |  |  SMTP     |  |                     |  |
|  | My Computer Postfix +--|-----------|->| Server Postfix      +--|---> destination
|  |                     |  |           |  |                     |  |
|  +---------------------+  |           |  +---------------------+  |
|             ^             |           |             ^             |
|             | What here?  |           |             | What here?  |
|  +----------+----------+  |           |  +----------+----------+  |
|  |                     |  |           |  |                     |  |
|  | My Computer Tool    |  |           |  | PHP Website         |  |
|  |                     |  |           |  |                     |  |
|  +---------------------+  |           |  +---------------------+  |
|                           |           |                           |
+---------------------------+           +---------------------------+

노트:여기에 뭐가 있지?— 내 생각에 이것은 다음을 사용하여 수행된 것 같습니다 sendmail.postdrop. 확인 할수 있어요?

제 생각에는PHP 웹사이트지역적이다서버 접미사사용하지 마세요메일 전송 프로토콜. 대신에 다음 을 사용합니다 sendmail.메일 전송 프로토콜보호:

smtpd_recipient_restrictions=check_recipient_access regexp:/etc/postfix/bad_recipients, ...

그러나 PHP는 분명히 SMTP용으로 설정되어 있습니다.

[mail function]
; For Win32 only.
; http://php.net/smtp
SMTP = localhost
; http://php.net/smtp-port
smtp_port = 25

Win32가 아니기 때문에 해당 설정이 무시되지 않는 한 이러한 매개변수는 Linux에서 완전히 무시됩니까? (온라인 중우분투.)

이메일을 보내더라도 Postfix가 수신자 목록을 확인하도록 강제하는 방법이 있습니까 sendmail?

잠재력과 관련된 또 다른 질문sendmail질문. 하지만 대답은 이메일이 통과되도록 허용하면서도 수신자의 이메일 주소를 확인하는 대신 (내가 아는 한) 발신자를 완전히 차단하는 것입니다.

수신자를 항상 차단하는 방법을 알고 있나요?

답변1

예, PHP 구성의 SMTP 서버 및 포트 설정은 Windows 버전의 PHP에만 적용됩니다. Linux(및 기타 Unix 계열 시스템)에서 PHP는 /usr/sbin/sendmail명령을 직접 사용하여 메일을 보냅니다.

올바르게 가정한 대로 메일은 SMTP를 통해 들어오지 않고 Postfix 대기열에 직접 삽입되므로 smtpd_recipient_restrictions적용되지 않습니다.

기본적으로 네 가지 옵션이 있습니다.

  1. 원하지 않는 주소로 메일을 웹 양식으로 직접 보내는 것을 차단합니다. (메일 서버가 아님)
  2. 쓰기(또는 온라인에서 찾기)이리그러면 필요한 메일 필터링이 수행되고 non_smtpd_miltersPostfix 구성의 설정을 통해 호출됩니다.
  3. mail()PHP 코드에서 간단한 함수를 사용하는 대신 다음을 사용하세요.PHP 메일러도서관에서 이메일을 보냅니다. PHPMailer는 SMTP를 통해 메일을 보내도록 구성할 수 있습니다.
  4. /usr/sbin/sendmail파일을 다음으로 바꾸십시오 .래퍼 스크립트-t그러면 제공된 수신자 주소를 확인하고 "잘못된" 주소를 제거합니다(수신자 주소를 명령줄에서 지정하거나 인수를 사용할 경우 sendmail메시지 헤더에서 지정할 수 있으므로 이는 약간 까다롭습니다 ). 그런 다음 "real ”을 호출합니다. sendmail 바이너리를 사용하려면 다른 이름으로 이름을 바꿔야 합니다. /usr/sbin/sendmail그대로 두고 sendmail_pathPHP 구성에서 스크립트를 가리키는 매개변수를 사용할 수도 있습니다 . 다음과 같은 것을 설치할 수도 있다고 생각합니다.메일 전송 프로토콜sendmail_path매개변수가 이를 가리키도록 설정하면 함수 mail()가 SMTP를 통해 메일을 보내게 됩니다.

관련 정보