1. create tables:

1.1. PostgreSQL:

CREATE TABLE graylist (
  "ok"        BOOLEAN                  NOT NULL DEFAULT false,
  "ip"        INET                     NOT NULL,
  "from"      TEXT                     NOT NULL,
  "to"        TEXT                     NOT NULL,
  "ts_entry"  TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(),
  "ts_latest" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(),
  "ts_ok"     TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(),
  "count"     BIGINT                   NOT NULL DEFAULT 1,
  UNIQUE ("ip", "from", "to"),
  PRIMARY KEY ("ip", "from", "to")
);

CREATE TABLE blackwhitelist (
  "ok"   BOOLEAN NOT NULL DEFAULT false,
  "ip"   INET    NOT NULL,
  "from" TEXT    NOT NULL,
  "to"   TEXT    NOT NULL,
  UNIQUE ("ip", "from", "to"),
  PRIMARY KEY ("ip", "from", "to")
);

CREATE TABLE mailcount (
  "count"    BIGINT                   NOT NULL DEFAULT 1,
  "ts_entry" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now()
);

CREATE INDEX mailcount_ts_entry_idx ON mailcount(ts_entry);

1.2. MySQL:

CREATE TABLE graylist (
  ok        BOOL            NOT NULL DEFAULT 0,
  ip        VARCHAR(39)     NOT NULL,
  src       LONGTEXT        NOT NULL,
  dst       LONGTEXT        NOT NULL,
  ts_entry  DATETIME        NOT NULL,
  ts_latest DATETIME        NOT NULL,
  ts_ok     DATETIME        NOT NULL,
  count     BIGINT UNSIGNED NOT NULL DEFAULT 1,
  UNIQUE (ip, src(128), dst(128)),
  PRIMARY KEY (ip, src(128), dst(128))
);

CREATE TABLE blackwhitelist (
  ok   BOOL      NOT NULL DEFAULT 0,
  src  LONGTEXT  NOT NULL,
  dst  LONGTEXT  NOT NULL,
  UNIQUE (src(128), dst(128)),
  PRIMARY KEY (src(128), dst(128))
);

CREATE TABLE mailcount (
  count     BIGINT UNSIGNED NOT NULL DEFAULT 1,
  ts_entry  DATETIME        NOT NULL
);

CREATE INDEX graylist_ok_idx ON graylist(ok);
CREATE INDEX graylist_ts_entry_idx ON graylist(ts_entry);
CREATE INDEX graylist_ts_latest_idx ON graylist(ts_latest);
CREATE INDEX graylist_ts_ok_idx ON graylist(ts_ok);
CREATE INDEX mailcount_ts_entry_idx ON mailcount(ts_entry);


2. adjust main.cf:

2.1 if you want graylisting:

smtpd_recipient_restrictions =
	check_policy_service unix:/var/run/graypold.sock

2.2. if you want mailcounting:

smtpd_end_of_data_restrictions =
	check_policy_service unix:/var/run/graypold.sock


3. overwrite default settings (see /usr/local/lib/graypol.pl) in
   /usr/local/etc/graypol.conf


4. create cronjobs:

* * * * * /usr/local/libexec/graycron.pl permit
*/5 * * * * /usr/local/libexec/graycron.pl graph
0 * * * * /usr/local/libexec/graycron.pl clean
0 0 * * * /usr/local/libexec/graycron.pl scrub


5. start graypold.pl, use either one of the supplied RC scripts or call
   /usr/local/sbin/graypol.pl directly


6. restart postfix
