|
CREATE DATABASE exim4; use exim4; CREATE TABLE exim_greylist ( id bigint(20) NOT NULL auto_increment, relay_ip varchar(80) default NULL, sender varchar(255) default NULL, recipient varchar(255) default NULL, block_expires datetime NOT NULL default '0000-00-00 00:00:00', record_expires datetime NOT NULL default '9999-12-31 23:59:59', create_time datetime NOT NULL default '0000-00-00 00:00:00', type enum('AUTO','MANUAL') NOT NULL default 'MANUAL', passcount bigint(20) NOT NULL default '0', blockcount bigint(20) NOT NULL default '0', PRIMARY KEY (id) ); CREATE TABLE exim_greylist_log ( id bigint(20) NOT NULL auto_increment, listid bigint(20) NOT NULL, timestamp datetime NOT NULL default '0000-00-00 00:00:00', kind enum('deferred', 'accepted') NOT NULL, PRIMARY KEY (id) );
# Eğer başka veritabanları da kullanıyorsanız, bu veritabanına erişimi # mysql_servers = localhost/exim4/kullanıcı/parola şeklinde sağlayabilirsiniz. # seçenekler # bunlar, xxx olarak mysql'in DATE_ADD(..,INTERVAL xxx) deyiminde # geçerli olacak şekilde belirtilmelidir, örneğin çoğul olarak # "2 HOUR" yerine "2 HOURS" belirtilirse geçersiz olacaktır. GREYLIST_INITIAL_DELAY = 1 HOUR GREYLIST_INITIAL_LIFETIME = 4 HOUR GREYLIST_WHITE_LIFETIME = 36 DAY GREYLIST_BOUNCE_LIFETIME = 0 HOUR # tablo isimlerini değiştirebilirsiniz GREYLIST_TABLE=exim_greylist GREYLIST_LOG_TABLE=exim_greylist_log # grilistelemeyi (geçici olarak) iptal etmek için bu satırı açıklama # haline getirin GREYLIST_ENABLED= # günlük kayıtlarını etkinleştirmek için bu satırın başındaki # işaretini # kaldırın #GREYLIST_LOG_ENABLED= # bundan sonrasında normalde bir düzenleme yapılmamalıdır .ifdef GREYLIST_ENABLED # veritabanı makroları GREYLIST_TEST = SELECT CASE \ WHEN now() > block_expires THEN "accepted" \ ELSE "deferred" \ END AS result, id \ FROM GREYLIST_TABLE \ WHERE (now() < record_expires) \ AND (sender = '${quote_mysql:$sender_address}' \ OR (type='MANUAL' \ AND ( sender IS NULL \ OR sender = '${quote_mysql:@$sender_address_domain}' \ ) \ ) \ ) \ AND (recipient = '${quote_mysql:$local_part@$domain}' \ OR (type = 'MANUAL' \ AND ( recipient IS NULL \ OR recipient = '${quote_mysql:$local_part@}' \ OR recipient = '${quote_mysql:@$domain}' \ ) \ ) \ ) \ AND (relay_ip = '${quote_mysql:$sender_host_address}' \ OR (type='MANUAL' \ AND ( relay_ip IS NULL \ OR relay_ip = \ substring('${quote_mysql:$sender_host_address}',1,length(relay_ip)) \ ) \ ) \ ) \ ORDER BY result DESC LIMIT 1 GREYLIST_ADD = INSERT INTO GREYLIST_TABLE \ (relay_ip, sender, recipient, block_expires, \ record_expires, create_time, type) \ VALUES ( '${quote_mysql:$sender_host_address}', \ '${quote_mysql:$sender_address}', \ '${quote_mysql:$local_part@$domain}', \ DATE_ADD(now(), INTERVAL GREYLIST_INITIAL_DELAY), \ DATE_ADD(now(), INTERVAL GREYLIST_INITIAL_LIFETIME), \ now(), \ 'AUTO' \ ) GREYLIST_DEFER_HIT = UPDATE GREYLIST_TABLE \ SET blockcount=blockcount+1 \ WHERE id = $acl_m9 GREYLIST_OK_COUNT = UPDATE GREYLIST_TABLE \ SET passcount=passcount+1 \ WHERE id = $acl_m9 GREYLIST_OK_NEWTIME = UPDATE GREYLIST_TABLE \ SET record_expires = DATE_ADD(now(), \ INTERVAL GREYLIST_WHITE_LIFETIME) \ WHERE id = $acl_m9 AND type='AUTO' GREYLIST_OK_BOUNCE = UPDATE GREYLIST_TABLE \ SET record_expires = DATE_ADD(now(), \ INTERVAL GREYLIST_BOUNCE_LIFETIME) \ WHERE id = $acl_m9 AND type='AUTO' GREYLIST_LOG = INSERT INTO GREYLIST_LOG_TABLE \ (listid, timestamp, kind) \ VALUES ($acl_m9, now(), '$acl_m8') .endif
.ifdef GREYLIST_ENABLED # Bu acl ya deny ya da accept döndürecek. # acl = greylist_acl'yi ber deger ile kullandığımızdan, # bir accept, kuralı DOĞRU yapacak, dolayısıyla bir erteleme olacak; # bir deny ise kuralı YANLIŞ yapacak, dolayısıyla erteleme olmayacak. greylist_acl: # Normal teslimatlar için griliste sınanacak. # Griliste sınanıp, acl_m8'e "accepted", "deferred" veya "unknown" # ve acl_m9'a kayıt numarası döndürülecek. warn set acl_m8 = ${lookup mysql{GREYLIST_TEST}{$value}{result=unknown}} # Burada acl_m8 = "result=x id=y" set acl_m9 = ${extract{id}{$acl_m8}{$value}{-1}} # Artık acl_m9 kayıt numarasını (veya -1) içerecek. set acl_m8 = ${extract{result}{$acl_m8}{$value}{unknown}} # acl_m8 unknown/deferred/accepted içerecek. # Bu üçlüyü bilmiyorsak, ileti ekleyeceğiz yoksa erteleyeceğiz accept # yukarıdaki sınama unknown (henüz kayıt yok) döndürmüşse condition = ${if eq{$acl_m8}{unknown}{1}} # ayrıca bir kayıt ekleyeceğiz condition = ${lookup mysql{GREYLIST_ADD}{yes}{no}} # Şimdi günlük kaydı yapacağız, sonucun önemi yok. # Üçlüyü bilmiyorsak bir günlük girdisine gerek yok çünkü # yukarıda oluşturma sırasında dolaylı olarak yapıldı. # .ifdef GREYLIST_LOG_ENABLED warn condition = ${lookup mysql{GREYLIST_LOG}} .endif # Üçlü hala engelleniyor mu bakalım accept # Yukarıdaki sınama deferred döndünmüşse ertele condition = ${if eq{$acl_m8}{deferred}{1}} # ve kayda geçir condition = ${lookup mysql{GREYLIST_DEFER_HIT}{yes}{yes}} # Bakılan kayıtları saymak için bir warn deyimi kullanıyoruz. warn condition = ${lookup mysql{GREYLIST_OK_COUNT}} # Özdevinimli kayıtlarda zaman aşımını belirlemek için bir # warn deyimi kullanıyoruz. Ancak, posta boş göndericili değilse # zamanaşımı uygulanacak, aksi takdirde zamanaşımı uygulanmayacak. # warn !senders = : postmaster@* condition = ${lookup mysql{GREYLIST_OK_NEWTIME}} warn senders = : postmaster@* condition = ${lookup mysql{GREYLIST_OK_BOUNCE}} deny .endif
.ifdef GREYLIST_ENABLED defer !senders = : postmaster@* acl = greylist_acl message = greylisted - try again later .endif
.ifdef GREYLIST_ENABLED defer senders = : postmaster@* acl = greylist_acl message = greylisted - try again later .endif
|