In urmatoarele randuri am sa incerc sa prezint cum am facut setup la un server de e-mail folosind Exim si Courier-Imap. Distributia de linux folosita a fost CentOS 4.4 dar sunt sigur ca totul merge si pe Red Hat, Fedora etc.
Imi cer scuze pentru eventualele greseli de ortografie, se mai intampla.
Serverul de e-mail tine datele legate de utilizatori si domeniile pentru care raspunde intr-o baza de date MySQL. Mi s-a parut mai simplu folosirea MySQL.
Ce am folosit:
MTA = Exim 4.x
IMAP & POP3 = Courier-Imap
POP/IMAP before SMTP = antirelayd (se gaseste pe serverele cu Cpanel).
MySQL = MySQL 5.x Tine baza de date cu useri si domeniile acestora.
MySQL l-am instalat tot din surse.Am folosit ./configure --prefix=/home/mysql pentru acest setup. De ce /home, nu ma intrebati :) INSTALARE EXIMExim l-am instalat folosind sursele pentru a asigura suportul MySQL.
Nu m-am complicat cu rpm-uri desi poate sa para mai usor cu ele.
Sursele pentru Exim se pot lua de la
http://www.exim.org/Versiunea disponibila de exim gasita a fost exim-4.66.
Dezarhivare:
tar -xvzf exim-4.66.tar.gz
Intram in directorul unde am dezarhivat exim (cd exim-4.66).
Trebuie sa cream un fisier Makefile pentru a compila exim.
Astfel, dupa ce intram in directorul cu sursele:
Copiem scr/EDITME in Local/Makefile (cp src/EDITME Local/Makefile) si editam fisierul dupa preferinte.
Variabilele din fisierul Local/Makefile dupa modificari au fost:
##################################################
# The Exim mail transport agent #
##################################################
.......
.......
BIN_DIRECTORY=/usr/exim/bin
CONFIGURE_FILE=/etc/exim/exim.conf
EXIM_USER=mailnull
SPOOL_DIRECTORY=/var/spool/exim
ROUTER_ACCEPT=yes
ROUTER_DNSLOOKUP=yes
ROUTER_IPLITERAL=yes
ROUTER_MANUALROUTE=yes
ROUTER_QUERYPROGRAM=yes
ROUTER_REDIRECT=yes
TRANSPORT_APPENDFILE=yes
TRANSPORT_AUTOREPLY=yes
TRANSPORT_PIPE=yes
TRANSPORT_SMTP=yes
SUPPORT_MAILDIR=yes
LOOKUP_DBM=yes
LOOKUP_LSEARCH=yes
LOOKUP_MYSQL=yes
#Atentie urmatoarele variabile (LOOKUP_LIBS si LOOKUP_INCLUDE) trebuie schimbate si in functie de locul unde am instalat mysql
LOOKUP_LIBS=-L/home/mysql/lib/mysql -lmysqlclient -lwrap
LOOKUP_INCLUDE=-I /home/mysql/include/mysql
FIXED_NEVER_USERS=root
AUTH_CRAM_MD5=yes
AUTH_PLAINTEXT=yes
HEADERS_CHARSET="ISO-8859-1"
LOG_FILE_PATH=/var/log/exim_%slog
SYSLOG_LOG_PID=yes
EXICYCLOG_MAX=10
COMPRESS_COMMAND=/usr/bin/gzip
COMPRESS_SUFFIX=gz
ZCAT_COMMAND=/usr/bin/zcat
USE_TCP_WRAPPERS=yes
SYSTEM_ALIASES_FILE=/etc/aliases
TMPDIR="/tmp"Acestea sunt toate variabilele configurate, restul le-am lasat sau le-am comentat in functie de nevoi.
Make si make installDe obicei pot aparea erori mai ales daca LOOKUP_LIBS si LOOKUP_INCLUDE nu sunt setate corect sau db4-devel nu este instalat.
De exemplu pentru eroarea dbstuff.h:103:16: db.h: No such file or directory
inseamna ca db4-devel nu este instalat. In centOS sau fedora se rezolva simplu: yum install db4-devel. La fel si in celelalte distributii ce au managere de pachete.
Pentru erori des intalnite avem urmatorul link:
http://www.exim.org/exim-html-4.00/doc/html/FAQ_1.htmlDaca ceva nu functioneaza corect la compilare ca rog sa cereti ajutor aici pe forum.
Make se executa simplu prin comanda: make
Daca make se executa fara erori (mesajul de final e ">>> exim binary built") atunci se poate executa si: make install
Baza de date MySQLInainte de pornirea Exim trebuie creata baza de date:
create database mailserver;
grant select,insert,update,delete on mailserver.* to mail@localhost identified by 'parola';
flush privileges;'parola' trebuie schimbata cu o parola dorita
'mailserver', numele bazei de date se poate schimba in functie de preferinte.
'mail@localhost', userul prin care exim poate accesa MySQL se poate schimba dupa preferinte. Ex: eximmail@localhost
Adaugam in baza de date tabela pentru utilizatori:
Inainte de adaugare trebuie verificat daca avem userul mailnull(sau alt user definit in Makefile atunci cand am compilat exim) adaugat.
Aceasta verificare se face simplu prin: cat /etc/passwd | grep mailnull
Ar trebui sa intoarca ceva asemanator: mailnull:x:47:47::/var/spool/mqueue:/sbin/nologin
Daca nu avem acest user definit il adaugam simplu prin comenzile:
groupadd mailnull
useradd -g mailnull -d /dev/null -s /sbin/nologin mailnullNu uitam sa memoram uid si gid ale mailnull, in cazul meu: 47 si 47 pentru a le adauga corect la crearea tabelei pentru utilizatori
use mailserver;
CREATE TABLE users (
id char(128) DEFAULT '' NOT NULL,
crypt char(128) DEFAULT '' NOT NULL,
clear char(128) DEFAULT '' NOT NULL,
name char(128) DEFAULT '' NOT NULL,
uid int(10) unsigned DEFAULT '47' NOT NULL,
gid int(10) unsigned DEFAULT '47' NOT NULL,
home char(255) DEFAULT '' NOT NULL,
maildir char(255) DEFAULT '' NOT NULL,
quota char(255) DEFAULT '' NOT NULL,
KEY id (id(128))
);
Trebuie sa mai adaugam o tabela in baza de date ce tine domeniile pentru care serverul exim raspunde (domeniile locale sau cele ce au MX-urile catre serverul nostru)
use mailserver;
CREATE TABLE domains (
userid char(128) NOT NULL default '',
KEY userid (userid)
);
Continuam cu configurarea Exim:
Trebuie sa cream fisierele unde exim isi tine logurile (altfel nu porneste), in cazul meu /var/log/. Aceste fisiere se creaza in functie de setarile din Makefile. Daca aceste setari sunt ca cele facute de mine atunci:
touch /var/log/exim_mainlog
touch /var/log/exim_rejectlog
touch /var/log/exim_paniclog
chown mailnull:mailnull /var/log/exim_mainlog
chown mailnull:mailnull /var/log/exim_rejectlog
chown mailnull:mailnull /var/log/exim_paniclogPentru o pornire/oprire mai simpla a Exim adaugam si un fisier in init.d
touch /var/log/exim
chmod +x /var/log/exim
Asa arata fisierul de pe serverul meu:
#!/bin/bash
#
# exim This shell script takes care of starting and stopping exim
#
# chkconfig: 2345 80 30
# description: Exim is a Mail Transport Agent, which is the program \
# that moves mail from one machine to another.
# processname: exim
# config: /etc/exim/exim.conf
# pidfile: /var/run/exim.pid
# Source function library.
. /etc/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Source exim configuration.
if [ -f /etc/sysconfig/exim ] ; then
. /etc/sysconfig/exim
else
DAEMON=yes
QUEUE=1h
fi
# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0
[ -f /usr/exim/bin/exim ] || exit 0
start() {
# Start daemons.
echo -n $"Starting $0: "
daemon /usr/exim/bin/exim $([ "$DAEMON" = yes ] && echo -bd) \
$([ -n "$QUEUE" ] && echo -q$QUEUE)
RETVAL=$?
echo
[ $RETVAL = 0 ] && touch /var/lock/subsys/exim
}
stop() {
# Stop daemons.
echo -n $"Shutting down $0: "
daemon /usr/exim/bin/exim $([ "$DAEMON" = yes ] && echo -bd) \
$([ -n "$QUEUE" ] && echo -q$QUEUE)
RETVAL=$?
echo
[ $RETVAL = 0 ] && touch /var/lock/subsys/exim
}
stop() {
# Stop daemons.
echo -n $"Shutting down $0: "
killproc exim
RETVAL=$?
echo
[ $RETVAL = 0 ] && rm -f /var/lock/subsys/exim
}
restart() {
stop
start
}
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
reload)
restart
;;
condrestart)
[ -f /var/lock/subsys/exim ] && {
stop
[ -x /bin/chown ] && /bin/chown mailnull.mailnull -R /var/spool/exim
start
} || {
[ -x /bin/chown ] && /bin/chown mailnull.mailnull -R /var/spool/exim
}
;;
status)
status exim
;;
*)
echo $"Usage: $0 {start|stop|restart|reload|status|condrestart}"
exit 1
esac
exit $RETVAL
Dupa crearea acestui fisier testem pornirea/oprirea exim:
/etc/init.d/exim start
/etc/init.d/exim stopDaca totul merge ok inseamna ca avem un server Exim functional (mai putin partea de comunicare cu MySQL din exim.conf ce urmeaza mai jos si unde Exim stie pentru ce domenii raspunde si unde sa trimita mailurile)
Se adauga la inceputul fisierului de configurare:
hide mysql_servers = localhost/mailserver/mail/parola
domainlist local_domains = mysql;SELECT userid FROM domains WHERE userid='$domain';
# si se comenteaza mai jos linia: domainlist local_domains = @ pentru a nu primi erori
Se adauga inainte de TRANSPORTS CONFIGURATION la sfarsitul ROUTERS CONFIGURATION
virtual_user:
driver = redirect
allow_fail
allow_defer
data = ${lookup mysql{ SELECT maildir FROM users \
WHERE id='${quote_mysql:${local_part}@${domain}}' }}
directory_transport = address_directory Se daduga la TRANSPORTS CONFIGURATION address_directory inainter de address_reply:
address_directory:
driver = appendfile
maildir_format
delivery_date_add
envelope_to_add
return_path_add
Oprim si pornim Exim pentru a observa eventualele erori in configurare.
Daca totul e ok trecem mai departe:
Ne alegem un director unde se vor tine mailurile pentru utilizatori, in cazul meu am ales /usr/local/vmail il cream si dam drepturile necesare pentru ca exim sa poata scrie in el:
mkdir /usr/local/vmail
chown mailnull:mailnull /usr/local/vmailApoi adaugam in baza de date un domeniu virtual pentru teste si un user:
use mailserver;
INSERT INTO domains (userid) VALUES ("exemplu.ro");
INSERT INTO users (id, crypt, clear, name, home, maildir) VALUES (
"test@exemplu.ro", "Y28Ytt3paf5m2", "test", "Test",
"/usr/local/vmail/examplu.ro/test",
"/usr/local/vmail/examplu.ro/test/Maildir/");
Ce saracie mai e si Y28Ytt3paf5m2 ?
Pai e parola "test" criptata. Pentru a obtine o criptare a unei parola avem scriptul perl urmator:
#!/usr/bin/perl
if( $#ARGV != 0 )
{
print "usage: ./script parola\n";
exit 1;
}
my $salt = join '', ('.', '/', 0..9,'A'..'Z', 'a'..'z')[rand 64, rand 64];
print crypt($ARGV[0], $salt) ."\n";Testam configurarile facute:
telnet 127.0.0.1 25
HELO TEST
MAIL FROM:<
cineva@yahoo.com>
RCPT TO:<
test@exemplu.ro>
DATA
text
.
QUIT
MAIL FROM la setarile default ale Exim trebuie sa fie un domeniu valid, altfel testul esueaza.
Totul merge OK daca nu intalnim nici o eroare

Dupa acest test observam cum exim a creat automat subdirectorul exemplu.ro din /usr/local/vmail si celelalte subdirectoare unde tine mailurile exact asa cum i-am zis in baza de date.
Eh, avem un Exim ready to go. So far so good !
INSTALARE Courier-Imap Mailuri primim pe server, dar utilizatorii nostri dragi cum le citesc ?
Aici ne ajuta Courier-Imap, server IMAP si POP3.
La instalarea Courier-Imap (NU Courier ci Courier-Imap) avem nevoie si de Courier-authlib, librarii care ajuta la autentificari etc. Trebuie sa fim atenti astfel incat la compilare(da, ii facem compilare si la asta) sa avem creat authmysqlclient.so pentru folosirea autentificarii prim MySQL.
Luam pentru inceput courier-authlib si instalam:
cd /usr/local/src
wget http://prdownloads.sourceforge.net/courier/courier-authlib-0.59.1.tar.bz2
bzip2 -d courier-authlib-0.59.1.tar.bz2
tar -xf courier-authlib-0.59.1.tar
Din pacate courier-authlib nu ne lasa sa-l compilam sub root asa ca
su user
cd /usr/local/src/courier-authlib-0.59.1
./configure --with-mysql-libs=/home/mysql/lib/mysql --with-mysql-includes=/home/mysql/include/mysql --with-redhat
make# make install si make install-configure le rulam sub root !
Nu uitati, 'user' e un user existent, daca nu avem unul, il cream, --with-redhat sau altceva se adauga in functie de ce detecteaza fisierul de configurare, astfel nici o grija daca intalnim o eroare prima data.Citim ce scrie si ne conformam.
Default, pentru CentOS avem /var/lib/mysql/ iar fisierele pentru include in /usr/include/mysql/. Eu avand o instalare custom de mysql am folosit /home/mysql.
Rulam make install si make install-configure
Dupa, ar trebui sa avem fisierul /usr/local/etc/authlib/authmysqlrc creat.
In acest fisier, configuram accesul la baza noastra de date:
MYSQL_SERVER localhost
MYSQL_USERNAME mail
MYSQL_PASSWORD parola
MYSQL_DATABASE mailserver
MYSQL_USER_TABLE users
MYSQL_CRYPT_PWFIELD crypt
MYSQL_LOGIN_FIELD id
MYSQL_HOME_FIELD home
MYSQL_NAME_FIELD name
Trecem la instalarea courier-imap
cd /usr/local/src
wget http://prdownloads.sourceforge.net/courier/courier-imap-4.1.2.tar.bz2
bzip2 -d courier-imap-4.1.2.tar.bz2
tar -xf courier-imap-4.1.2.tar
cd courier-imap-4.1.2
Din nou trebuie sa compilam sub un alt user decat root.
su user
cd /usr/local/src/courier-imap-4.1.2
./configure --with-redhat
make
Iesim de sub user si instalam ca si root cu: make install && make install-configure.
Dupa instalare pornim serverele:
/usr/local/sbin/authdaemond start
/usr/lib/courier-imap/libexec/imapd.rc start
/usr/lib/courier-imap/libexec/pop3d.rc startTestam functionarea cat de cat corecta printr-un telnet la ip-ul serverului pe portul 110 si/sau imap
si logarea la server. Daca totul e OK inseamna ca suntem sefi si avem un server de mail functional.
Daca nu, cel mai simplu e sa verificam /var/log/maillog de obicei, fisierul unde serverul pop3/imap isi tine logurile.
Eh, adaugam un user pentru un domeniu care cel putin are MX-urile catre noul nostru server de mail si testam cu Outlook sau Thunderbird sau alt client pop3 imap functionalitatea serverului nostru.
Daca totul e ok suntem sefi. Mai avem de implementat autentificarea pentru ca nu vrem ca oricine stie macar un domeniu de pe server sa trimita mailuri.
Unul dintre cele mai simple moduri e sa copeim scriptul perl, antirelayd de pe un server cu Cpanel. Acest fisier verifica /var/log/maillog si de indata ce un user se autentifica ii daduga adresa IP in fisierul /etc/relayhosts fisier ce trebuie creat daca nu exista si date drepturile necesare.
Pornim antirelayd sa nu-l uitam si trecem mai departe la configurarea Exim pentru a lasa trimiterea de mailuri de pe aceste IP-uri din /etc/relayhosts.
Pentru acest lucru adaugam in exim.conf urmatoarele:
Modificam relay_from_hosts astfel incat sa avem:
hostlist relay_from_hosts = net-lsearch;/etc/relayhosts : localhost
Si uite asa avem un server de mail aproximativ asemanator cu cel de pe serverele cu Cpanel cu exceptia faptului ca la Cpanel nu se foloseste MySQL de exemplu si alte cateva diferente minore.
Cum rezolvam cu spam-ul ?
Pai luam o pushca si pushcam tot ce misca pentru inceput, numai dupa, merita sa postez tot in acest topic cateva metode cel putin de baza.
Am sa continui cu: Optimizari Exim si Courier-IMAP, instalare si configurare MailScanner plus altele.
SA LAMURIM: ORICE MESAJ NESOLICITAT E SPAM.
NU EXISTA: "Daca acest mail a ajuns din gresala bla bla".
NU AM SOLICITAT ACEL MAIL NICI DIN GRESALA, DECI E SPAM.
CEI CARE FAC SPAM SUNT NISTE CERSETORI SI OAMENI DE NIMIC, DIN MOMENT CE NU SUNT IN STARE SA-SI VANDA PRODUSUL DE 2 LEI ALTCUMVA.Astept completari, sugestii si alte comentarii cu mare placere. Nimeni nu e perfect
