To see how this is used return to this tutorial index.
-- Mysql commands to create a database, table and function to implement grey listing with exim.
-- This variant collects more information about the mail connection being tested.
-- Author: Alain Williams <addw@phcomp.co.uk> January 2010
-- SCCS: @(#)greylist-collect-info.database.function.setup.mysql 1.2 10/10/12 17:39:38
-- To use this a different GREYLIST_DEFER macro is needed within the exim config file - since is passes in the destination domain:
-- GREYLIST_DEFER = SELECT greylist_defer('${quote_mysql:$sender_address_domain}', '${quote_mysql:$domain}', '${quote_mysql:$sender_host_address}')
-- Create the database:
CREATE DATABASE exim_db;
-- Create a user that exim will use to connect to the database.
-- Change at least the password on the following line:
GRANT ALL ON exim_db.* TO exim_user@localhost IDENTIFIED BY 'code419';
FLUSH privileges;
USE exim_db;
-- This table contains one row for each machine that attempts to send mail on behalf
-- of a particular sender (or From) domain.
-- If a domain sends mail from several servers you will find several entries for that domain.
CREATE TABLE greylist
(
sender_host_ip VARCHAR(40) NOT NULL, -- long enough for an IPv6 address
to_domain VARCHAR(256) NOT NULL, -- max length domain name; RFC 1034 & RFC 2181
from_domain VARCHAR(256) NOT NULL, -- max length domain name; RFC 1034 & RFC 2181
first_received DATETIME NOT NULL, -- when first got an email
last_received DATETIME NOT NULL, -- when last got an email from the IP from the domain
rcpt_count INT NOT NULL, -- number of attempted emails
UNIQUE (from_domain, sender_host_ip, to_domain)
);
DELIMITER !!
-- Remove any previous version:
DROP FUNCTION IF EXISTS greylist_defer !!
-- Return 'yes' if to defer, if 'no' to not defer, ie accept the mail.
CREATE FUNCTION greylist_defer(sender_domain TEXT, dest_domain TEXT, sender_ip TEXT) RETURNS TEXT
NOT DETERMINISTIC
MODIFIES SQL DATA
COMMENT "Return 'yes' if mail is to be deferred as greylisted"
BEGIN
DECLARE first DATETIME; -- When first received email from this source
-- newAddr gets set to 1 if we have a new address combination
DECLARE newAddr INT DEFAULT 0;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET newAddr = 1;
-- Have we already got something ?
SELECT first_received INTO first FROM greylist
WHERE from_domain = sender_domain AND sender_host_ip = sender_ip AND to_domain = dest_domain;
IF newAddr = 1
THEN -- This was not in the table, insert a new row and return 1
INSERT INTO greylist (sender_host_ip, to_domain, from_domain, first_received, last_received, rcpt_count)
VALUES (sender_ip, dest_domain, sender_domain, NOW(), NOW(), 1);
RETURN 'yes'; -- return Defer
ELSE -- It was in the table, update the last_received column
UPDATE greylist SET last_received = NOW(), rcpt_count = rcpt_count + 1
WHERE from_domain = sender_domain AND sender_host_ip = sender_ip AND to_domain = dest_domain;
-- If we first received email long enough ago return 'no' to say 'no defer'.
-- Change the number '10' below for a different time after first receipt of incoming mail
IF DATE_ADD(first, INTERVAL 10 MINUTE) < NOW()
THEN RETURN 'no'; -- return accept
ELSE RETURN 'yes'; -- return Defer
END IF;
END IF;
END
!!
-- If you wish to view the function, you can enter this to a mysql command line client:
-- show create function greylist_defer\G
Return to this tutorial index.