메일 서버 설정 · 5 min read · Feb 14, 2026
Exim, MySQL, Cyrus-Imapd, Horde 웹메일을 이용한 메일 서버 설정 - Centos 5.1 - 페이지 2
구성
아파치 구성
- 가상 호스팅을 활성화하고 기본 가상 호스트를 생성합니다. /etc/httpd/conf/httpd.conf를 편집하고 끝에 추가합니다.
NameVirtualHost *:80ServerAdmin [email protected] - horde 웹메일을 위한 가상 호스트를 생성합니다. 위의 내용 아래에 추가합니다.
Servername mail.home.topdog-software.com DocumentRoot /usr/share/horde ErrorLog logs/mail-error_log CustomLog logs/mail-access_log common - horde 보안 설정을 활성화합니다. /etc/httpd/conf.d/horde.conf 파일을 편집하고 아래와 같이 설정합니다.
#Alias /horde /usr/share/hordeOptions +FollowSymLinks php_admin_flag safe_mode off php_admin_flag magic_quotes_runtime off php_flag session.use_trans_sid off php_flag session.auto_start off php_admin_flag file_uploads on #php_admin_flag allow_url_fopen on php_value post_max_size 20M php_value upload_max_filesize 10M php_admin_value open_basedir "/usr/share/horde:/usr/share/horde/config:/usr/share/pear:/tmp" php_admin_flag register_globals off Order Deny,Allow Deny from all Order Deny,Allow Deny from all - PHP 메모리 한도를 증가시킵니다. /etc/php.ini를 편집하고 아래와 같이 변경합니다.
memory_limit = 64M - SSL에서 horde를 활성화합니다. /etc/httpd/conf.d/ssl.conf를 편집하고 기본 가상 호스트의
default:443> 태그 사이에 다음을 추가합니다. Servername mail.home.topdog-software.com:443 DocumentRoot /usr/share/horde
Exim 구성
- MTA를 exim으로 전환합니다.
system-switch-mail (select exim)안티바이러스 / Sanesecurity 검사
- Exim (/etc/exim/exim.conf)을 구성하여 clamav를 사용하여 수신 메일을 스캔하고 바이러스에 감염된 이메일 및 이미지 및 PDF 스팸을 SMTP 시간에 거부합니다.
av_scanner = clamd:/var/run/clamav/clamd.sock
RBL
- acl_check_rcpt 아래에 RBL을 구성합니다:
drop message = REJECTED because $sender_host_address is in a black list spamhaus.org dnslists = zen.spamhaus.org drop message = REJECTED because $sender_host_address is in a black list at $dnslist_domain\n$dnslist_text dnslists = bl.spamcop.net drop message = REJECTED because $sender_host_address is in a black list at $dnslist_domain\n$dnslist_text dnslists = dnsbl.sorbs.net
안티 스팸
- 리버스 DNS가 없는 서버에서 메시지를 거부하려면 acl_check_rcpt 아래에 추가합니다. 예외 목록이 있으며, 여기에는 acl이 적용되지 않아야 하는 도메인을 추가할 수 있으며, 발신자가 유효한지 확인하기 위해 발신 주소로 테스트 메시지를 전달하려고 시도합니다.
drop message = REJECTED - We don't accept messages from hosts without reverse DNS log_message = No reverse DNS domains = ! lsearch;/etc/exim/checks_exempt_hosts !verify = reverse_host_lookup !verify = sender/callout=2m,defer_ok !condition = ${if eq{$sender_verify_failure}{} } - HELO/EHLO를 제공하지 않는 클라이언트에서 메시지를 거부하려면 acl_check_rcpt에 다음을 추가합니다:
drop message = REFUSED - no HELO/EHLO greeting log_message = remote host did not present greeting condition = ${if def:sender_helo_name {false}{true}} - 서버에 대한 연결 속도를 제한할 수 있습니다. acl_check_connect에 다음을 추가하여 수행합니다(사이트에 맞게 조정하려면 exim 문서를 읽어보세요).
deny ratelimit = 250 / 15m / strict message = You can only send $sender_rate per $sender_rate_period log_message = RATE: $sender_rate/$sender_rate_period (max $sender_rate_limit) accept - 악성 스팸 봇이 시스템을 망치지 않도록 합니다.
smtp_accept_max_nonmail = 30 smtp_max_unknown_commands = 1 - 파이프라인 광고를 하지 마십시오.
pipelining_advertise_hosts = - Spamassassin 검사를 활성화합니다.
spamd_address = /var/run/spamassassin/spamd.sock - SMTP 시간에 점수가 6 이상인 모든 메시지를 거부합니다. (acl_check_data)
accept condition = ${if >={$message_size}{100000} {1}} add_header = X-Spam-Note: SpamAssassin run bypassed due to message size warn spam = nobody/defer_ok add_header = X-Spam-Flag: YES accept condition = ${if !def:spam_score_int {1}} add_header = X-Spam-Note: SpamAssassin invocation failed warn add_header = X-Spam-Score: $spam_score ($spam_bar)\n\# X-Spam-Report: $spam_report drop condition = ${if >{$spam_score_int}{60} {1}} message = Your message scored $spam_score SpamAssassin point. Report follows:\n\$spam_report
메일 라우팅
- Mysql 데이터베이스에 대한 액세스를 활성화합니다.
hide mysql_servers = localhost/horde/horde/hordepassword - 로컬 배달 라우터를 수정하여 cyrus로 배달하되 배달 전에 사용자 이메일 주소를 확인합니다 (exim.conf의 라우터 섹션에서).
localuser: driver = accept local_parts = ${lookup mysql {SELECT REPLACE(user_uid,'${quote_mysql:@$domain}','') \ as user FROM horde_users WHERE user_uid='${quote_mysql:$local_part@$domain}'}{$value}} transport = local_delivery cannot_route_message = Unknown user - lmtp 소켓을 통해 cyrus로 배달하기 위한 전송을 생성합니다.
local_delivery: driver = lmtp socket = /var/lib/imap/socket/lmtp batch_max = 50 user = cyrus
SMTP 인증
- /etc/exim/exim.conf의 인증 섹션에 다음을 추가합니다.
plain: driver = plaintext public_name = PLAIN server_prompts = : server_set_id = $2 server_condition = ${if saslauthd{{$2}{$3}{pop}}{1}{0}} server_advertise_condition = true login: driver = plaintext public_name = LOGIN server_prompts = "Username:: : Password::" server_condition = ${if saslauthd{{$1}{$2}{pop}}{1}{0}} server_set_id = $1 server_advertise_condition = true
전체 샘플 구성
전체 구성 파일을 여기에서 다운로드합니다.
Mysql 구성
- TCP 네트워킹을 비활성화합니다. /etc/my.cnf를 편집하고 mysqld 섹션에 다음을 추가합니다.
skip-networking - 루트 비밀번호를 설정합니다. /usr/bin/mysqladmin -u root password ‘new-password’
/usr/bin/mysqladmin -u root -h your_host_name password ‘new-password’ -p
Horde 구성
- SQL 파일을 편집하고 horde 사용자에 대한 mysql 비밀번호를 변경합니다. cp /usr/share/horde/scripts/sql/create.mysql.sql .
vi create.mysql.sqlREPLACE INTO user (host, user, password) VALUES ( 'localhost', 'horde', -- 중요: 이 비밀번호를 변경하세요! PASSWORD('hordepassword') ); - 사용자를 생성하고 horde 데이터베이스를 채웁니다.
mysql -p < create.mysql.sql - turba(주소록)를 위한 테이블을 생성합니다.
mysql -p horde < /usr/share/horde/turba/scripts/sql/turba_objects.mysql.sql - kronolith(일정 관리)를 위한 테이블을 생성합니다.
mysql -p horde < /usr/share/horde/kronolith/scripts/sql/kronolith.mysql.sql
Horde 구성
- horde 기본 구성을 생성합니다. /usr/share/horde/config/conf.php
- Horde 기본 설정을 수정하여 로그인 시 웹메일을 기본 애플리케이션으로 설정합니다. /usr/share/horde/config/prefs.php 파일을 편집하고 $prefs[‘initial_application’]을 아래와 같이 수정합니다. ``` $_prefs[‘initial_application’] = array( ‘value’ => ‘imp’, ‘locked’ => true, ‘shared’ => true, ‘type’ => ‘select’, ‘desc’ => sprintf((“What application should %s display after login?”), $GLOBALS[‘registry’]->get(‘name’)) ); ```
- Horde가 웹 서버의 기본 루트 내에서 작동하도록 합니다. /usr/share/horde/config/registry.php를 편집하고 $this->applications[‘horde’]를 아래와 같이 수정합니다.
$this->applications['horde'] = array( 'fileroot' => dirname(__FILE__) . '/..', 'webroot' => '', 'initial_page' => 'login.php', 'name' => _("Horde"), 'status' => 'active', 'templates' => dirname(__FILE__) . '/../templates', 'provides' => 'horde' );
새 게시물을 받은 편지함에서 받기
스팸은 없습니다. 언제든지 구독 해지 가능합니다.