Pythontr

husonet | Tarih: 28.12.2012

Mail, EPosta Server Kurulumu Postfix 2.6 versiyonu

Mail server nasıl kurulur? Yazımızı Okuyun.

Merhaba,

Bu yazımızda linux sistemler üzerine mail server kurulumunu anlatacağım.

Test Ortamı...
1-) Virtual Box
2-) İşletim Sistemi : Linux
3-) Dağıtım: Debian Squeeze
4-) Veritabanı: Mysql
5-) Web Sunucu Apache php
6-) DNS server bind
7-) Mail server postfix
8-) Örnek domain

Modem den ve sunucudan açılacak portlar Türk Telekomdan da ayriyetten 25 portu açtırılacak.
a-) DNS için - 53
b-) SMTP için - 25
c-) SMTP Türkiyeden bağlantı için 587
d-) Pop 3 Gelen mailleri çekmek için 110
e-) Web Arayüzü erişimi için 80

Kurulum
Debian Squeeze, Bind kurulumlarını tamamladığınızı varsayıyoruz tamamlamadıysanız bu kurulumlar sitemizde mevcuttur.

Postfix Sunucu
Kuruluma başlamadan önce güncellemelerimiz varsa alalım.
aptitude update && aptitude full-upgrade

Kurulacak Paketler
aptitude install apache2 libapache2-mod-php5 php5-cli php5-common php5-cgi
aptitude install mysql-server phpmyadmin
aptitude install postfix-mysql postfix-tls postfix
aptitude install libsasl2 libsasl2-dev libsasl2-modules-sql
aptitude install spamassassin
aptitude install amavisd-new
aptitude install clamav clamav-daemon lha arj
aptitude install unrar zoo nomarch lzop
aptitude install libsasl2-modules libsasl2-modules-gssapi-heimdal
aptitude install courier-authdaemon courier-authmysql courier-imap courier-imap-ssl courier-pop-ssl courier-pop courier-authlib-mysql
touch /var/lib/amavis/whitelist_sender
chown amavis:amavis /var/lib/amavis/whitelist_sender
touch /var/lib/amavis/blacklist_sender
chown amavis:amavis /var/lib/amavis/blacklist_sender

Mysql: Domain Bilgileri ve Kullanıcı Mail bilgilerini Tutmak için. Avantajı ise kullanıcıların db den direkt eklenip silinmesi için. Web arayüzünün hazırlanmasını daha kolaylaştıracaktır.
Postfix: Mail server
Courier Imap: Imap ve pop3 server
Cyrus Sasl: SMTP Auth yapilabilmesi icin gerekli program.
Amavisd-new: Spam ve virüs kontrolü
Clamav: Virus programı.
Spamassassin: Spam kontrolü yapan program.

Database İşlemleri
# Yeni bir database olsun
CREATE DATABASE  `mail_sunucu` DEFAULT CHARACTER SET utf8 COLLATE utf8_turkish_ci;


# Tablolar
CREATE EXISTS `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`address` varchar(128) COLLATE utf8_turkish_ci NOT NULL DEFAULT '',
`crypt` varchar(128) COLLATE utf8_turkish_ci NOT NULL DEFAULT '',
`clear` varchar(128) COLLATE utf8_turkish_ci NOT NULL DEFAULT '',
`name` varchar(128) COLLATE utf8_turkish_ci NOT NULL DEFAULT '',
`uid` smallint(5) unsigned NOT NULL DEFAULT '1000',
`gid` smallint(5) unsigned NOT NULL DEFAULT '1000',
`home` varchar(128) COLLATE utf8_turkish_ci NOT NULL DEFAULT '/',
`domain` varchar(128) COLLATE utf8_turkish_ci NOT NULL DEFAULT '',
`maildir` varchar(255) COLLATE utf8_turkish_ci NOT NULL DEFAULT '',
`imapok` tinyint(3) unsigned NOT NULL DEFAULT '1',
`bool1` tinyint(3) unsigned NOT NULL DEFAULT '1',
`bool2` tinyint(3) unsigned NOT NULL DEFAULT '1',
`quota` varchar(100) COLLATE utf8_turkish_ci NOT NULL DEFAULT '5000',
`SILINDI` varchar(1) COLLATE utf8_turkish_ci NOT NULL DEFAULT 'F',
PRIMARY KEY (`id`),
UNIQUE KEY `address` (`address`),
UNIQUE KEY `id` (`id`),
KEY `id_2` (`id`),
KEY `address_2` (`address`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_turkish_ci AUTO_INCREMENT=1;

CREATE TABLE `virtual` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`address` varchar(255) COLLATE utf8_turkish_ci NOT NULL DEFAULT '',
`goto` text COLLATE utf8_turkish_ci NOT NULL,
`SILINDI` varchar(1) COLLATE utf8_turkish_ci NOT NULL DEFAULT 'F',
PRIMARY KEY (`id`),
UNIQUE KEY `ADDRESS` (`address`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_turkish_ci AUTO_INCREMENT=1 ;

CREATE TABLE `transport` (
`domain` varchar(128) NOT NULL default '',
`transport` varchar(128) NOT NULL default 'virtual:',
UNIQUE KEY `domain` (`domain`)
) ENGINE=MyISAM;

INSERT INTO `users` (`id`, `address`, `crypt`, `clear`, `name`, `uid`, `gid`, `home`, `domain`, `maildir`, `imapok`, `bool1`, `bool2`, `quota`, `SILINDI`) VALUES
('1', 'huseyin@example.com', encrypt('123456'), '123456', 'Huseyin', 5000, 5000, '/var/spool/postfix/virtual', 'example.com', 'example.com/huseyin/', 1, 1, 1, '51200000', 'F');

INSERT INTO `virtual` (`id`, `address`, `goto`, `SILINDI`) VALUES
('1', 'root@example.com', 'huseyin@example.com', 'F'),
('2', '@example.com', 'huseyin@example.com', 'F');

INSERT INTO `transport` (`domain`, `transport`) VALUES
('example.com', 'virtual:');


Transport Tablosu: Bu tablo gelen epostaların domain bilgilerini tutar. Burada o domain’e ait epostaların virtual mi yoksa sistem üzerinde mi tutulacağı belirlenir.
Transport Tablosu Alanları
domain: Host edilecek domain adi. “virtual” ve “local” olarak host edecekleriniz dahil.
transport: Host edilecek domain tipi. Virtual domainler için “virtual:”, local kullanıcılar için “local:” yazılabilir.

Virtual Tablosu: Bir e-posta adresine gelen e postaların başka bir eposta adrese yada adreslere yönlendirilmesi bu tablodan yapılır. Eposta adresleri arasına “,” konarak bu işlem yapılabilir.
Virtual Tablosu Alanları
address: Gelen mail adresi
goto: Üstteki mail adresinden gelen maillerin yönlendirileceği adres.

Users Tablosu: Kullanıcıların yer aldığı tablodur.
Users Tablosu Alanları
id: Kullanıcı Adı örnek user@xxx.com
address: Kullanıcı e-mail adresi. user@xxx.com şeklinde
crypt: Şifre kısmının şifreli (crypted) edilmiş hali. Şifrenin bu şekilde saklanmasını istemiyorsanız boş bırakın. Bu alana MYSQL'den veri girerken querynizi encrypt fonksiyonuyla gönderin. encrypt(‘password’) gibi.
clear: Şifrenin yalın hali
name: Kullanicinin ismi. Postfix icin gerekli degil. Courier icin kullanacagiz.
uid: virtual uid
gid: virtual gid Farklı mail adresi içn için tek gid kullanmalıyız.
home: Mail klasorü “/var/spool/postfix/virtual” olabilir.
domain: Kullanıcı domain adı.
maildir: Kullanıcı maillerinin saklanacağı klasör. Burada tam yolu kullanmalıyız. örnek. (“example.com/huseyin/” seklinde)
imapok: Courier imap ile kendi hesabına ulaşımı sağlar. 1 yada 0 değeri alır 1 aktifdir 0 pasif.
bool1: 1 yada 0 biz 1 veriyoruz
bool2: 1 yada 0 biz 1 veriyoruz
quota: Kotayı verir.

Postfix Ayarları
vim /etc/postfix/main.cf
# See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for
# information on enabling SSL in the smtp client.
#myhostname = boran
myhostname = mail.otomobilkasko.com
mydomain = otomobilkasko.com
myorigin = $mydomain
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
#mydestination = boran, localhost.localdomain, , localhost
mydestination = $myhostname, localhost.BORAN, localhost.localdomain, localhost
unknown_local_recipient_reject_code = 550
relayhost =
relay_domains = mysql:/etc/postfix/config/relay_domains.cf
home_mailbox = Maildir/
#mynetworks = 127.0.0.0/8 192.168.2.0/24
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
#proxy_interfaces = 85.105.196.73
mailbox_command = procmail -a "$EXTENSION"
#mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
transport_maps = mysql:/etc/postfix/config/transport.cf
virtual_mailbox_maps = mysql:/etc/postfix/config/mysql_virt.cf
virtual_mailbox_limit = 51200000
virtual_minimum_uid = 100
virtual_transport = virtual
virtual_create_maildirsize = yes
virtual_mailbox_extended = yes
virtual_mailbox_limit_maps = mysql:/etc/postfix/config/mysql_virt_limit.cf
virtual_mailbox_limit_override = yes
virtual_maildir_limit_message = Uzgunuz e posta kutunuz dolmustur.
virtual_overquota_bounce = yes
# Yonlendirme yapilan mailler cift cift gitmemesi icin no diyoruz
enable_original_recipient = No
# Burada sistemdeki postfix kullanicisinin uid'inden kucuk bir sayı verilmelidir
virtual_uid_maps = mysql:/etc/postfix/config/uids.cf
virtual_gid_maps = mysql:/etc/postfix/config/gids.cf
virtual_mailbox_base=/var/spool/postfix/virtual
mydestination = $mydomain, $myhostname, $transport_maps
virtual_maps = mysql:/etc/postfix/config/virtual.cf
smtpd_sender_restrictions = reject_unknown_sender_domain
unverified_recipient_reject_code = 550
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination, reject_unknown_recipient_domain, reject_unverified_recipient
### SASL ###
broken_sasl_auth_clients = yes
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain = $myhostname
content_filter = smtp-amavis:[localhost]:10024


vim /etc/postfix/master.cf
smtp inet n - n - - smtpd
587 inet n - n - - smtpd

smtp-amavis unix - - n - 2 lmtp
-o lmtp_data_done_timeout=1200
-o lmtp_send_xforward_command=yes
-o disable_dns_lookups=yes
127.0.0.1:10025 inet n - n - - smtpd
-o content_filter=
-o local_recipient_maps=
-o smtpd_helo_restrictions=
-o smtpd_client_restrictions=
-o smtpd_sender_restrictions=
-o smtpd_recipient_restrictions=permit_mynetworks,reject
-o mynetworks=127.0.0.0/8

cyrus unix - n n - - pipe
user=cyrus argv=/cyrus/bin/deliver -e -r ${sender} -m ${extension} ${user}


mkdir /etc/postfix/config/

vim /etc/postfix/config/transport.cf
user=root
password=root
dbname=mail_sunucu
table=transport
select_field=transport
where_field=domain
hosts=127.0.0.1


vim /etc/postfix/config/mysql_virt.cf
user=root
password=root
dbname=mail_sunucu
table=users
select_field=maildir
where_field=address
hosts=127.0.0.1


vim /etc/postfix/config/uids.cf
user=root
password=root
dbname=mail_sunucu
table=users
select_field=uid
where_field=address
hosts=127.0.0.1


vim /etc/postfix/config/gids.cf
user=root
password=root
dbname=mail_sunucu
table=users
select_field=gid
where_field=address
hosts=127.0.0.1


vim /etc/postfix/config/virtual.cf
user=root
password=root
dbname=mail_sunucu
table=virtual
select_field=goto
where_field=address
additional_conditions = and SILINDI = 'F'
hosts=127.0.0.1


vim /etc/postfix/config/mysql_virt_limit.cf
user = root
password = root
dbname = mail_sunucu
table = users
select_field = quota
where_field = address
hosts = 127.0.0.1


vim /etc/postfix/config/relay_domains.cf
user = root
password = root
hosts = 127.0.0.1
dbname = mail_sunucu
# query = SELECT domain FROM domain WHERE domain='%s' and backupmx = true
query = SELECT domain FROM transport WHERE domain='%s'


IMAP Ayarları
vim /etc/courier/authmysqlrc
MYSQL_SERVER localhost #your mysql server
MYSQL_USERNAME uname
MYSQL_PASSWORD passwd
MYSQL_SOCKET /tmp/mysql.sock #necessary if you are on localhost
MYSQL_DATABASE maildb
MYSQL_USER_TABLE users
MYSQL_CRYPT_PWFIELD crypt
MYSQL_CLEAR_PWFIELD clear
MYSQL_UID_FIELD uid
MYSQL_GID_FIELD gid
#MYSQL_LOGIN_FIELD id
MYSQL_LOGIN_FIELD address
MYSQL_HOME_FIELD home
MYSQL_NAME_FIELD name
MYSQL_MAILDIR_FIELD maildir
MYSQL_WHERE_CLAUSE imapok=1 AND bool1=1 AND bool2=1 AND SILINDI='F'


vim /etc/courier/authdaemonrc
authmodulelist="authpam authmysql"


Cyrus Sasl
vim /etc/postfix/sasl/smtpd.conf
pwcheck_method: auxprop
auxprop_plugin: sql
sql_engine: mysql
sasl_mech_list: login plain cram-md5 digest-md5
mech_list: plain login cram-md5
sql_user: root
sql_passwd: root
sql_hostnames: 127.0.0.1
sql_database: mail_sunucu
sql_select: select clear from users where address='%u@%r'


Mail Box için klasör oluşturma
cd /var/spool/postfix
mkdir virtual
chown postfix:postfix virtual
cd virtual
mkdir example.com
chown postfix:postfix example.com
chmod 0775 example.com
cd example.com
mkdir huseyin
chmod 0770 huseyin
chown 5000:5000 huseyin


telnet test
telnet localhost 25
ehlo example.com
250-my-new-mailserver
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN

mail from:<steve@example.com>
250 2.1.0 Ok

rcpt to:<john@example.com>
250 2.1.5 Ok

data

354 End data with <CR><LF>.<CR><LF>

Hi John,

just wanted to drop you a note.
.

250 2.0.0 Ok: queued as A9D64379C4

quit


Spamassassin Servisini açalım.
vim /etc/default/spamassassin
ENABLED=1
CRON=2


Bu yazı eski versiyon üzerinde yazıldığı için yazımızın güncel hali için tıklayınız. /makale.py?tid=224