Cook Mail

.qmail 사용 방법

앤써니킴 2024. 8. 3. 14:44
728x90

qmail에서는 파이프(|) 문자를 사용하여 메일을 프로그램으로 전달할 수 있습니다. 필터 프로그램을 실행한 후 결과를 전달하려면 다음과 같은 구조를 사용합니다:

  1. 기본 구조:
  2. | /path/to/filter/program &forwarding_address
  3. 구체적인 예시:
  4. | /usr/local/bin/spam_filter &user@example.com

이 구조에서 일어나는 과정은 다음과 같습니다:

  1. 메일이 도착하면 qmail은 이를 spam_filter 프로그램으로 파이프합니다.
  2. spam_filter 프로그램이 메일을 처리합니다.
  3. spam_filter의 출력이 user@example.com으로 전달됩니다.

좀 더 복잡한 시나리오를 위해 다음과 같은 방식도 사용할 수 있습니다:

  1. 조건부 전달:이 경우, condition_check 프로그램이 먼저 실행되고, 그 결과가 forward_if_clean 프로그램으로 전달됩니다. forward_if_clean 프로그램은 조건에 따라 메일을 user@example.com으로 전달하거나 로컬 Maildir에 저장할 수 있습니다.
  2. | /usr/local/bin/condition_check |/usr/local/bin/forward_if_clean &user@example.com ./Maildir/
  3. Python 스크립트 사용:Python 스크립트를 사용하여 더 복잡한 필터링 로직을 구현할 수 있습니다.
  4. | /usr/bin/python3 /path/to/your/filter_script.py &user@example.com
  5. Golang 프로그램 사용:Golang으로 작성된 프로그램을 사용하여 고성능 필터링을 수행할 수 있습니다.
  6. | /path/to/your/golang/filter_program &user@example.com

주의사항:

  • 필터 프로그램은 표준 입력(stdin)으로 메일을 받고, 표준 출력(stdout)으로 처리된 메일을 출력해야 합니다.
  • 필터 프로그램에서 오류가 발생하면 메일이 바운스될 수 있으므로, 오류 처리에 주의해야 합니다.
  • 필터 프로그램의 실행 권한이 적절히 설정되어 있어야 합니다.

이러한 방식으로 qmail의 .qmail 파일을 사용하여 메일에 대해 사용자 정의 필터링을 수행하고, 그 결과를 원하는 대로 전달할 수 있습니다. Python이나 Golang을 사용하여 복잡한 필터링 로직을 구현할 수 있어 매우 유연한 시스템을 구축할 수 있습니다.

환경변수

.qmail 파일로 처리되는 메일에는 여러 환경변수가 함께 전달됩니다. 이 환경변수들은 메일 처리 과정에서 유용한 정보를 제공합니다. 주요 환경변수들은 다음과 같습니다:

  1. SENDER: 발신자의 이메일 주소
  2. RECIPIENT: 수신자의 이메일 주소
  3. HOST: 메일을 받는 호스트의 이름
  4. HOME: 사용자의 홈 디렉토리 경로
  5. USER: 메일을 받는 사용자의 이름
  6. DTLINE: 메일이 전송된 날짜와 시간 정보
  7. LOCAL: 이메일 주소의 로컬 부분 (@ 앞부분)
  8. EXT: 이메일 주소의 확장 부분 (있는 경우)
  9. HOST: 이메일 주소의 도메인 부분
  10. DOMAIN: 메일 서버의 도메인 이름
  11. MAILHOST: 메일을 처리하는 서버의 호스트 이름
  12. MAILER: 사용 중인 메일러 프로그램 (일반적으로 "qmail")
  13. REMOTEHOSTNAME: 발신 메일 서버의 호스트 이름
  14. REMOTEIP: 발신 메일 서버의 IP 주소
  15. RPLINE: Received: 헤더 라인 정보
  16. UFLINE: From: 헤더 라인 정보
  17. RTOLINE: To: 헤더 라인 정보
  18. NEWSENDER: 전달된 메시지의 새로운 발신자 주소
  19. TCPREMOTEIP: TCP 연결의 원격 IP 주소
  20. TCPREMOTEHOST: TCP 연결의 원격 호스트 이름
  21. TCPREMOTEINFO: TCP 연결의 원격 사용자 정보 (있는 경우)
  22. AUTHUSER: 인증된 사용자 이름 (SMTP AUTH 사용 시)
  23. AUTHSENDER: 인증된 발신자 주소 (SMTP AUTH 사용 시)
  24. SPFRESULT: SPF (Sender Policy Framework) 검사 결과
  25. RELAYCLIENT: 릴레이 클라이언트 여부
  26. QMAILQUEUE: 사용자 정의 큐 프로그램 경로
  27. QMAILHOME: qmail 설치 디렉토리
  28. QMAILNAME: qmail 사용자 이름
  29. QMAILHOST: qmail 호스트 이름
  30. QMAILBASE: qmail 기본 디렉토리
  31. QMAIL_REJECT_CODE: 거부 응답 코드 (설정된 경우)
  32. QMAIL_BOUNCE_MSG: 반송 메시지 (설정된 경우)
  33. SPAMFILTER: 스팸 필터 프로그램 경로 (설정된 경우)
  34. VIRUSFILTER: 바이러스 필터 프로그램 경로 (설정된 경우)
  35. QMAILADMIN: qmail 관리자 이메일 주소
  36. DEFAULT
    qmail에서 매우 중요한 역할을 합니다. 이 변수는 .qmail 파일의 기본 전달 주소를 지정합니다.
    • 용도: 메일을 기본적으로 전달할 주소를 지정합니다.
    • 설정 방법: 일반적으로 /var/qmail/control/defaultdelivery 파일에서 설정됩니다.
    • 예시 값: "./Maildir/" (로컬 Maildir로 배달) 또는 "|/usr/bin/procmail" (procmail로 전달)
  37. 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()

이 스크립트는 다음과 같이 동작합니다:

  1. 이메일 내용을 표준 입력으로 받습니다.
  2. 미리 정의된 스팸 키워드와 의심스러운 URL 패턴을 체크합니다.
  3. 스팸으로 판단되면 내용을 제거하고 제목에 [SPAM] 태그를 붙입니다.
  4. 스팸이 아니면 원본 메시지를 그대로 출력합니다.

이제 이 스크립트를 .qmail 파일과 연동하는 방법은 다음과 같습니다:

  1. 스크립트를 적절한 위치에 저장합니다. 예: /home/user/spam_filter.py
  2. 스크립트에 실행 권한을 부여합니다:
  3. chmod +x /home/user/spam_filter.py
  4. .qmail 파일을 다음과 같이 설정합니다:이 설정은 모든 수신 메일을 spam_filter.py로 전달한 후, 그 결과를 user@example.com으로 전달합니다.
  5. | /home/user/spam_filter.py &user@example.com
  6. 로컬 복사본도 유지하고 싶다면, 다음과 같이 설정할 수 있습니다:
  7. | /home/user/spam_filter.py &user@example.com ./Maildir/

이 설정으로, 모든 수신 메일은 스팸 필터를 거치게 되며, 스팸으로 판단된 메일은 내용이 제거된 채 전달됩니다.

728x90

'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