qmail에서는 파이프(|) 문자를 사용하여 메일을 프로그램으로 전달할 수 있습니다. 필터 프로그램을 실행한 후 결과를 전달하려면 다음과 같은 구조를 사용합니다:
- 기본 구조:
- | /path/to/filter/program &forwarding_address
- 구체적인 예시:
- | /usr/local/bin/spam_filter &user@example.com
이 구조에서 일어나는 과정은 다음과 같습니다:
- 메일이 도착하면 qmail은 이를 spam_filter 프로그램으로 파이프합니다.
- spam_filter 프로그램이 메일을 처리합니다.
- spam_filter의 출력이 user@example.com으로 전달됩니다.
좀 더 복잡한 시나리오를 위해 다음과 같은 방식도 사용할 수 있습니다:
- 조건부 전달:이 경우, condition_check 프로그램이 먼저 실행되고, 그 결과가 forward_if_clean 프로그램으로 전달됩니다. forward_if_clean 프로그램은 조건에 따라 메일을 user@example.com으로 전달하거나 로컬 Maildir에 저장할 수 있습니다.
- | /usr/local/bin/condition_check |/usr/local/bin/forward_if_clean &user@example.com ./Maildir/
- Python 스크립트 사용:Python 스크립트를 사용하여 더 복잡한 필터링 로직을 구현할 수 있습니다.
- | /usr/bin/python3 /path/to/your/filter_script.py &user@example.com
- Golang 프로그램 사용:Golang으로 작성된 프로그램을 사용하여 고성능 필터링을 수행할 수 있습니다.
- | /path/to/your/golang/filter_program &user@example.com
주의사항:
- 필터 프로그램은 표준 입력(stdin)으로 메일을 받고, 표준 출력(stdout)으로 처리된 메일을 출력해야 합니다.
- 필터 프로그램에서 오류가 발생하면 메일이 바운스될 수 있으므로, 오류 처리에 주의해야 합니다.
- 필터 프로그램의 실행 권한이 적절히 설정되어 있어야 합니다.
이러한 방식으로 qmail의 .qmail 파일을 사용하여 메일에 대해 사용자 정의 필터링을 수행하고, 그 결과를 원하는 대로 전달할 수 있습니다. Python이나 Golang을 사용하여 복잡한 필터링 로직을 구현할 수 있어 매우 유연한 시스템을 구축할 수 있습니다.
환경변수
.qmail 파일로 처리되는 메일에는 여러 환경변수가 함께 전달됩니다. 이 환경변수들은 메일 처리 과정에서 유용한 정보를 제공합니다. 주요 환경변수들은 다음과 같습니다:
- SENDER: 발신자의 이메일 주소
- RECIPIENT: 수신자의 이메일 주소
- HOST: 메일을 받는 호스트의 이름
- HOME: 사용자의 홈 디렉토리 경로
- USER: 메일을 받는 사용자의 이름
- DTLINE: 메일이 전송된 날짜와 시간 정보
- LOCAL: 이메일 주소의 로컬 부분 (@ 앞부분)
- EXT: 이메일 주소의 확장 부분 (있는 경우)
- HOST: 이메일 주소의 도메인 부분
- DOMAIN: 메일 서버의 도메인 이름
- MAILHOST: 메일을 처리하는 서버의 호스트 이름
- MAILER: 사용 중인 메일러 프로그램 (일반적으로 "qmail")
- REMOTEHOSTNAME: 발신 메일 서버의 호스트 이름
- REMOTEIP: 발신 메일 서버의 IP 주소
- RPLINE: Received: 헤더 라인 정보
- UFLINE: From: 헤더 라인 정보
- RTOLINE: To: 헤더 라인 정보
- NEWSENDER: 전달된 메시지의 새로운 발신자 주소
- TCPREMOTEIP: TCP 연결의 원격 IP 주소
- TCPREMOTEHOST: TCP 연결의 원격 호스트 이름
- TCPREMOTEINFO: TCP 연결의 원격 사용자 정보 (있는 경우)
- AUTHUSER: 인증된 사용자 이름 (SMTP AUTH 사용 시)
- AUTHSENDER: 인증된 발신자 주소 (SMTP AUTH 사용 시)
- SPFRESULT: SPF (Sender Policy Framework) 검사 결과
- RELAYCLIENT: 릴레이 클라이언트 여부
- QMAILQUEUE: 사용자 정의 큐 프로그램 경로
- QMAILHOME: qmail 설치 디렉토리
- QMAILNAME: qmail 사용자 이름
- QMAILHOST: qmail 호스트 이름
- QMAILBASE: qmail 기본 디렉토리
- QMAIL_REJECT_CODE: 거부 응답 코드 (설정된 경우)
- QMAIL_BOUNCE_MSG: 반송 메시지 (설정된 경우)
- SPAMFILTER: 스팸 필터 프로그램 경로 (설정된 경우)
- VIRUSFILTER: 바이러스 필터 프로그램 경로 (설정된 경우)
- QMAILADMIN: qmail 관리자 이메일 주소
- DEFAULT
qmail에서 매우 중요한 역할을 합니다. 이 변수는 .qmail 파일의 기본 전달 주소를 지정합니다.- 용도: 메일을 기본적으로 전달할 주소를 지정합니다.
- 설정 방법: 일반적으로 /var/qmail/control/defaultdelivery 파일에서 설정됩니다.
- 예시 값: "./Maildir/" (로컬 Maildir로 배달) 또는 "|/usr/bin/procmail" (procmail로 전달)
- PWD
현재 작업 디렉토리를 나타냅니다. 이는 qmail 특정이 아닌 일반적인 UNIX/Linux 환경 변수입니다.- 용도: 스크립트나 프로그램이 실행되는 현재 디렉토리를 알려줍니다.
- 예시 값: "/home/user" 또는 "/var/qmail/alias"
이러한 환경변수들을 활용하면 메일 처리 스크립트에서 더 세밀한 제어와 필터링이 가능합니다. 예를 들어, 특정 발신자나 도메인에서 온 메일에 대해 다른 처리를 할 수 있습니다.
Python 스크립트에서 이 환경변수들을 사용하려면 os.environ 딕셔너리를 통해 접근할 수 있습니다. 예를 들어:
import os
sender = os.environ.get('SENDER', '')
recipient = os.environ.get('RECIPIENT', '')
remote_ip = os.environ.get('REMOTEIP', '')
# 이 정보를 사용하여 메일 처리 로직 구현
이러한 환경변수들을 활용하면 더 강력하고 유연한 메일 필터링 및 처리 시스템을 구축할 수 있습니다.
예시
먼저, 간단한 스팸 필터 Python 스크립트를 만들어보겠습니다:
#!/usr/bin/env python3
import sys
import re
def is_spam(email_content):
# 스팸으로 간주할 키워드 목록
spam_keywords = ['viagra', 'buy now', 'free offer', 'limited time', 'click here']
# 이메일 내용을 소문자로 변환
email_lower = email_content.lower()
# 키워드 체크
for keyword in spam_keywords:
if keyword in email_lower:
return True
# 의심스러운 URL 패턴 체크
suspicious_urls = re.findall(r'https?://(?:[\w-]+\.)+[\w-]+(?:/[\w-./?%&=]*)?', email_lower)
if len(suspicious_urls) > 5: # 5개 이상의 URL이 있으면 스팸으로 간주
return True
return False
def main():
email_content = sys.stdin.read()
if is_spam(email_content):
# 스팸으로 판단되면 빈 메시지 출력 (메일 차단)
print("Subject: [SPAM] Original subject")
print()
print("This message has been identified as spam and its content has been removed.")
else:
# 스팸이 아니면 원본 메시지 그대로 출력
print(email_content)
if __name__ == "__main__":
main()
이 스크립트는 다음과 같이 동작합니다:
- 이메일 내용을 표준 입력으로 받습니다.
- 미리 정의된 스팸 키워드와 의심스러운 URL 패턴을 체크합니다.
- 스팸으로 판단되면 내용을 제거하고 제목에 [SPAM] 태그를 붙입니다.
- 스팸이 아니면 원본 메시지를 그대로 출력합니다.
이제 이 스크립트를 .qmail 파일과 연동하는 방법은 다음과 같습니다:
- 스크립트를 적절한 위치에 저장합니다. 예: /home/user/spam_filter.py
- 스크립트에 실행 권한을 부여합니다:
- chmod +x /home/user/spam_filter.py
- .qmail 파일을 다음과 같이 설정합니다:이 설정은 모든 수신 메일을 spam_filter.py로 전달한 후, 그 결과를 user@example.com으로 전달합니다.
- | /home/user/spam_filter.py &user@example.com
- 로컬 복사본도 유지하고 싶다면, 다음과 같이 설정할 수 있습니다:
- | /home/user/spam_filter.py &user@example.com ./Maildir/
이 설정으로, 모든 수신 메일은 스팸 필터를 거치게 되며, 스팸으로 판단된 메일은 내용이 제거된 채 전달됩니다.
'Cook Mail' 카테고리의 다른 글
tcp.smtp.cdb 사용 방법 (0) | 2024.08.03 |
---|---|
DKIM 및 SPF (0) | 2024.08.03 |
qmail-newu 역할 (0) | 2024.08.03 |
qmail-pop3d 데몬 역할 (0) | 2024.08.03 |
qmail-tcpto 역할 (0) | 2024.08.03 |