/var/mail과 /var/spool/mail이 뭔지 확인/var/mail이 아닌 GCP의 큐 서비스에 전송되도록 하는 것/var/mail로 전달되어야 함/var/mail과 /var/spool/mail의 차이?/var/spool/mail은 /var/mail의 심볼릭 링크/var/spool/mail은 spooling 개념에서 온 디렉토리라고 함/var/mail)에 저장mbox 방식을 사용smtpd, qmqpd 서버를 통해 네트워크 메일 유입cleanup 서버로 메일 전달sendmail 명령 등을 통해 로컬 메일이 제출postdrop 명령에 의해 maildrop 큐에 저장pickup 서버가 큐에 있는 로컬 메일을 가져와 무결성 검사 수행cleanup 서버로 메일 전달local 전송 에이전트가 전달한 메일bounce 서버가 발신자에게 반송하는 메일cleanup 서버로 직접 전달cleanup 서버From: 헤더, 기타 메시지 헤더 추가, 주소 변환qmgrsmtp, lmtp, local, virtual, pipe 등의 다양한 전달 에이전트에게 전달trivial-rewriteqmgr이 전달 에이전트에게 요청을 보내기 전 trivial-rewrite가 각 수신자 주소가 로컬인지, 원격인지에 따라 분류 및 처리smtp: 네트워크를 통해 다른 SMTP 서버로 메일 전달lmtp: smtp와 유사, 다른 서버로 메일 전달virtual: UNIX 스타일 메일박스, qmail 스타일 maildir에만 메일 전달local: UNIX 스타일 메일 박스, qmail 스타일 maildir, sendmail 스타일 aliases, .forward 파일 등을 처리 가능local은 훅을 가지고 있어 메일박스 전달을 외부 명령이나 다른 postfix 전달 에이전트에게 위임하는 설정이 가능/var/mail 메일박스에 전달하는 것이 아닌 사용자 정의 스크립트, 프로그램에 메일을 전달하고자 할 때 중요pipelocal은 기본 설정에서 전통적인 /var/mail 메일박스로 메일을 전달local의 훅 설정을 통해 외부 프로그램으로 메일 전달 및 처리 가능pipe가 외부 프로그램과의 통신을 핵심적으로 담당home_mailbox: local 사용자 홈 디렉토리 내의 메일박스 경로 지정mail_spool_directory: local UNIX 스타일 메일박스가 보관되는 디렉토리 지정mailbox_command: local 전송 에이전트가 메일박스 전송에 사용할 외부 명령을 지정(전역적)mailbox_command_maps가 존재(지역적, 수신자별 선택 가능)mailbox_transport: local 전송 에이전트가 사용할 메시지 전송 방식을 지정(전역적)mailbox_transport_maps가 존재(지역적, 수신자별 선택 가능)mailbox_size_limit: 메일박스 크기 제한mailbox 관련 파라미터는 local 전달 에이전트와 관련있는 파라미터pipe는 메일박스를 관리하기보다는 메일을 외부 프로그램에 파이프하는 역할이기 때문에 mailbox 관련 파라미터와 무관함qmgr가 다양한 전달 에이전트에게 전달 요청이 가능하기 때문local이 직접, 간접적으로 pipe를 호출 가능https://www.postfix.org/local.8.html
aliases: 별칭 데이터 베이스 사용.forward 파일mailbox_transport_maps, mailbox_transportmailbox_command_maps, mailbox_commandhome_mailbox: 사용자 홈 디렉토리에 메일 저장mail_spool_directory: UNIX 스타일 메일박스(/var/mail/user, /var/spool/mail/user)에 메일 저장fallback_transport_maps, fallback_transportluser_relayhttps://www.postfix.org/pipe.8.html
hash:/etc/postfix/map)hash, regexp 등의 단순한 구조부터 mysql, mongodb 등의 외부 데이터베이스까지 지원hash 테이블을 사용해 메일 라우팅을 설정할 예정# /etc/postfix/transport
root local:
daemon local:
postmaster local:
* gcppipe:
postmap /etc/postfix/transport로 적용 필요# /etc/postfix/main.cf
transport_maps = hash:/etc/postfix/transport
transport_maps는 수신과 발신 메일 모두에 적용됨gcppipe로 메일이 전달되어서는 안됨gcppipe로 전달, gcppipe가 스크립트를 실행해 메일을 pub/sub으로 전송transport_maps을 검사gcppipe로 전달gcppipe으로 전달# /etc/postfix/transport
root local:
daemon local:
postmaster local:
# /etc/postfix/main.cf
local_transport = gcppipe:
transport_maps = hash:/etc/postfix/transport
transport_maps을 검사transport_maps에 명시되지 않은 계정은 smtp를 사용해 전송transport_maps을 검사local_transport에 명시된 gcppipe로 재전달gcppipe의 스크립트 실행https://velog.io/@mjttong/postfix-pipe-스크립트-작성하기
# /etc/postfix/master.cf
# service type private unpriv chroot wakeup maxproc command + args
gcppipe unix - n n - - pipe
flags=FqX user=nobody argv=/usr/local/bin/gcppipe_script.go ${sender} ${recipient}
-는 디폴트 값 사용-: 필요할 때 알아서 실행-: master.cf에 정의된 기본 값 사용dig 명령어를 통해 MX 레코드와 A 레코드가 제대로 설정되어 있는지 확인했다.Sep 02 09:08:49 mail postfix/smtpd[78508]: fatal: no SASL authentication mechanisms
smtpd_sasl_auth_enable = yes로 오버라이딩 설정을 해야 한다.smtpd_sasl_auth_enable = yes로 smtp, submission 등의 모든 통신에 있어 sasl을 요구하게 되어 메일 수신을 못하고 있는 상황이다.smtpd_sasl_auth_enable를 주석 처리하고, master.cf의 submission에서만 설정했다.smtpd_client_restrictions = permit_mynetworks, reject
smtpd_client_restrictions 설정 시 mynetworks에서 지정된 서버만 접근을 허용한다.smtpd_client_restrictions = permit_mynetworks,
permit_sasl_authenticated,
reject_unknown_client_hostname
Command output: 2025/09/02 10:14:57 Failed to publish message to pubsub: rpc error: code = PermissionDenied desc = Request had insufficient authentication scopes. error details: name = ErrorInfo reason = ACCESS_TOKEN_SCOPE_INSUFFICIENT domain = googleapis.com metadata = map[method:google.pubsub.v1.Publisher.Publish service:pubsub.googleapis.com]
gcloud compute instances set-service-account [instance-name] --scopes=pubsub --zone=[zone]