0025-smtp-relay 작업.
chloe.ai.kr 댓글 알림이나 시스템 메일 발송용으로 SMTP 릴레이를 따로 구성했다.
처음에는 Postfix만 띄우는 정도였고, 이후 DKIM까지 붙였다.
docker/docker-compose.yml
version: '3.8'
services:
smtp-server:
image: mwader/postfix-relay:latest
container_name: smtp-server
restart: unless-stopped
ports:
- "25:25"
environment:
POSTFIX_myhostname: ${HOSTNAME:-smtp.yeonghoon.kim}
POSTFIX_mydomain: ${MAIL_DOMAIN:-chloe.ai.kr}
OPENDKIM_DOMAINS: ${MAIL_DOMAIN:-chloe.ai.kr}
OPENDKIM_RequireSafeKeys: "no"
OPENDKIM_KEYSIZE: ${DKIM_KEYSIZE:-1024}
POSTFIX_message_size_limit: ${MESSAGE_SIZE_LIMIT:-52428800}
volumes:
- mail-queue:/var/spool/postfix
- dkim-keys:/etc/opendkim/keys
- ../config/opendkim.conf:/etc/opendkim.conf:ro
- ../logs:/var/log
networks:
- mail
labels:
- "project=0025-smtp-relay"
- "service=smtp"
networks:
mail:
driver: bridge
volumes:
mail-queue:
driver: local
dkim-keys:
driver: local
DKIM 키는 1024비트로 잡았다.
2048비트로 만들면 DNS TXT 레코드가 너무 길어져서 등록이 애매했다.
scripts/setup-dkim.sh
DOMAIN=${1:-chloe.ai.kr}
SELECTOR=${2:-mail}
PUBLIC_KEY=$(docker exec smtp-server cat /etc/opendkim/keys/$DOMAIN/$SELECTOR.txt 2>/dev/null || echo "")
echo "$PUBLIC_KEY"
echo " 호스트: $SELECTOR._domainkey.$DOMAIN"
echo " dig TXT $SELECTOR._domainkey.$DOMAIN"
DNS 쪽에서 확인한 것.
SPF
chloe.ai.kr TXT "v=spf1 ip4:<서버 IP> ~all"
DMARC
_dmarc.chloe.ai.kr TXT "v=DMARC1; p=none; rua=mailto:[email protected]"
DKIM
mail._domainkey.chloe.ai.kr TXT "v=DKIM1; ..."
rDNS
dig +short -x <서버 IP>
HELO랑 rDNS가 안 맞아서 이것도 수정했다.
docker exec smtp-server postconf -e "myhostname = mail.yeonghoon.kim"
docker exec smtp-server postfix reload
Mail-Tester 점수는 처음에 8.6/10 정도였다.
Date / Message-ID 헤더가 빠져서 감점.
from email.utils import formatdate, make_msgid
msg['Date'] = formatdate(localtime=True)
msg['Message-ID'] = make_msgid(domain="chloe.ai.kr")
이거 넣고 10/10.
테스트 발송은 스크립트로 처리.
./scripts/send-test-mail.sh <수신자>
댓글 0
| 번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
|---|---|---|---|---|
| 공지 | 2025 일본 여행 계획 | 김영훈 | 2024.10.10 | 4119 |
| 공지 | 현금, 저축, 투자, 지출, 예산, 보험 내역(2024-05-30) | 김영훈 | 2024.03.10 | 3752 |
| 297 | DGX Spark LLM 벤치마크 | 김영훈 | 2026.02.11 | 132 |
| 296 | GPU 모니터링 대시보드 구축 | 김영훈 | 2026.02.11 | 150 |
| 295 | Docker Ollama 트러블슈팅 | 김영훈 | 2026.02.11 | 128 |
| 294 | 원격 LLM 챗봇 테스트 | 김영훈 | 2026.02.11 | 140 |
| 293 | DGX Ollama 구축 | 김영훈 | 2026.02.11 | 183 |
| 292 | OpenClaw cron regression 대응 | 김영훈 | 2026.02.08 | 186 |
| 291 | WAF honeypot 설정 | 김영훈 | 2026.02.07 | 104 |
| » | smtp-relay 설정 | 김영훈 | 2026.02.06 | 195 |
| 289 | openclaw 구축 작업 노트 [2] | 김영훈 | 2026.02.01 | 341 |
| 288 | Traefik 설정 | 김영훈 | 2026.01.28 | 353 |
| 287 | GitLab CI/CD 테스트 | 김영훈 | 2026.01.28 | 216 |
| 286 | OpenVPN 구축 | 김영훈 | 2026.01.28 | 143 |
| 285 | ollama-chatbot 테스트 메모 | 김영훈 | 2026.01.27 | 355 |
| 284 | monitoring 설정 | 김영훈 | 2026.01.23 | 130 |
| 283 | 임시 파킹 페이지 | 김영훈 | 2026.01.20 | 308 |
| 282 | infra-base 기본 서버 설정 메모 | 김영훈 | 2026.01.20 | 171 |
| 281 | [바이브코딩 - 클로드] kospiAlarm 작업 메모 | 김영훈 | 2025.10.29 | 109 |
| 280 | [바이브코딩 - 클로드] fullstack_template 작업 메모 | 김영훈 | 2025.10.18 | 243 |
| 279 | [바이브코딩 - 클로드] reminder_android 작업 메모 | 김영훈 | 2025.10.17 | 85 |
| 278 | [바이브코딩 - 클로드] bingbingsubway 작업 메모 | 김영훈 | 2025.10.12 | 165 |