메일 서버 설정 · 3 min read · Oct 06, 2025
가상 도메인 및 사용자와 함께하는 전체 메일 서버 솔루션 (Debian Etch, Postfix, Mysql, Dovecot, DSpam, ClamAV, Postgrey, RBL) - 페이지 4
B. 가상 사용자 및 도메인을 위한 Postfix 설정
메일 교환기가 가상 사용자 및 도메인으로 메일을 전달하지 않더라도, 유효/무효 목적지에 따라 거부할 것입니다. 따라서 mx 서버가 SQL 서버에 연결하여 목적지를 확인할 수 있어야 합니다. postconf에 정보를 입력하세요:
# postconf -e 'virtual_alias_domains ='
# postconf -e 'virtual_alias_maps = proxy:mysql:$config_directory/mysql_virtual_alias_maps.cf'
# postconf -e 'virtual_mailbox_domains = proxy:mysql:$config_directory/mysql_virtual_domains_maps.cf'
# postconf -e 'virtual_mailbox_maps = proxy:mysql:$config_directory/mysql_virtual_mailbox_maps.cf'
# postconf -e 'virtual_mailbox_base = /vmail'
# postconf -e 'virtual_minimum_uid = 150'
# postconf -e 'virtual_uid_maps = static:150'
# postconf -e 'virtual_gid_maps = static:8'
# postconf -e 'virtual_create_maildirsize = yes'
# postconf -e 'virtual_mailbox_extended = yes'
# postconf -e 'virtual_mailbox_limit_maps = proxy:mysql:/etc/postfix/mysql_virtual_mailbox_limit_maps.cf'
# postconf -e 'virtual_mailbox_limit_override = yes'
# postconf -e 'virtual_maildir_limit_message = "연결하려는 사용자가 할당량을 초과했습니다."
# postconf -e 'virtual_overquota_bounce = yes'
# postconf -e 'transport_maps = proxy:mysql:/etc/postfix/mysql_virtual_transports.cf'여기에는 몇 가지 ‘주의사항’이 있습니다. 이 구성은 가상 사용자 메일박스를 /vmail에 호스팅합니다. 다른 위치에 메일박스를 저장해야 하는 경우, virtual_mailbox_base 줄을 적절히 변경하세요.
virtual_minimum_uid 및 virtual_uid_maps는 사용자 ID 150을 가리킵니다. 이 사용자 ID는 특별히 생성된 “가상 메일” 사용자입니다. 표준 “메일” 그룹을 사용하며, 기본 (Debian) gid는 8입니다. 다음과 같이 사용자 및 디렉토리를 생성할 수 있습니다:
# useradd -r -u 150 -g mail -d /var/vmail -s /sbin/nologin -c "가상 메일박스" vmail
# mkdir /var/vmail
# chmod 770 /var/vmail/
# chown vmail:mail /var/vmail/이제 NFS 클라이언트 도구를 설치해야 합니다:
# apt-get install nfs-common portmap그런 다음 디렉토리를 NFS 공유에 마운트해야 합니다. 간단한 테스트를 위해 다음을 실행하세요:
# mount files-1.internal.example.com:/vmail /vmail이제 files-1에서 /vmail 공유에 접근할 수 있어야 합니다. 파일을 작성해 보세요 (작동하지 않아야 합니다!):
# cd /vmail
# touch tmpNOTE: 읽기 전용 오류가 발생해야 합니다!
모든 것이 작동한다고 가정하면, NFS를 마운트 해제하세요:
# cd /
umount /vmail그런 다음 /etc/fstab에 다음을 추가하여 마운트를 영구적으로 만드세요:
[...]
files-1.internal.example.com:/vmail /vmail nfs ro,rsize=4096,hard,intr,tcp,noatime,nodev,async 0 0파일 시스템을 마지막으로 한 번 더 마운트하세요:
# mount /vmail… 이제 준비가 완료되었습니다!
C. Postfix MySQL 구성
Postfix는 MySQL 지원으로 설치되었지만, 그렇다고 해서 이미 우리의 데이터베이스를 사용하는 방법을 알고 있는 것은 아닙니다. 데이터베이스의 각 테이블 유형에 대한 다양한 SQL 쿼리 정보를 제공해야 합니다. 이 정보는 main.cf 파일에 정의된 MySQL 파일에 저장됩니다. 다음 파일에서 마지막 줄은 전체 쿼리가 포함된 단일 주석(#로 시작)입니다. 최신 버전의 Postfix는 다른 문 대신 이를 사용할 수 있습니다. 최신 버전을 사용하는 경우, 다른 모든 줄을 주석 처리하고 쿼리 문을 주석 해제하세요.
/etc/postfix/mysql_virtual_alias_maps.cfuser = vmail_user
password = vmail_user_password
hosts = sql-1.internal.example.com
dbname = virtual_mail
table = alias
select_field = goto
where_field = address
additional_conditions = and active = '1'
#query = SELECT goto FROM alias WHERE address='%s' AND active = '1'/etc/postfix/mysql_virtual_domains_maps.cfuser = vmail_user
password = vmail_user_password
hosts = sql-1.internal.example.com
dbname = virtual_mail
table = domain
select_field = domain
where_field = domain
additional_conditions = and backupmx = ‘0? and active = ‘1?
#query = SELECT domain FROM domain WHERE domain=’%s’ AND backupmx = ‘0? AND active = ‘1?/etc/postfix/mysql_virtual_mailbox_limit_maps.cfuser = vmail_user
password = vmail_user_password
hosts = sql-1.internal.example.com
dbname = virtual_mail
table = mailbox
select_field = quota
where_field = username
additional_conditions = and active = ‘1?
#query = SELECT quota FROM mailbox WHERE username=’%s’ AND active = ‘1?/etc/postfix/mysql_virtual_mailbox_maps.cfuser = vmail_user
password = vmail_user_password
hosts = sql-1.internal.example.com
dbname = virtual_mail
table = mailbox
select_field = CONCAT(domain,’/',maildir)
where_field = username
additional_conditions = and active = ‘1?
#query = SELECT CONCAT(domain,’/',maildir) FROM mailbox WHERE username=’%s’ AND active = ‘1?/etc/postfix/mysql_virtual_transports.cfuser = vmail_user
password = vmail_user_password
hosts = sql-1.internal.example.com
dbname = virtual_mail
table = domain
select_field = transport
where_field = domain
additional_conditions = and active = ‘1?
#query = SELECT transport FROM domain WHERE domain=’%s’ AND active = ‘1?새 게시물을 받은 편지함에서 받기
스팸은 없습니다. 언제든지 구독 해지 가능합니다.