<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>http://wiki.qmailtoaster.org:80/index.php?action=history&amp;feed=atom&amp;title=Qmail-greyd</id>
	<title>Qmail-greyd - Revision history</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.qmailtoaster.org:80/index.php?action=history&amp;feed=atom&amp;title=Qmail-greyd"/>
	<link rel="alternate" type="text/html" href="http://wiki.qmailtoaster.org:80/index.php?title=Qmail-greyd&amp;action=history"/>
	<updated>2026-04-29T14:01:51Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.41.0</generator>
	<entry>
		<id>http://wiki.qmailtoaster.org:80/index.php?title=Qmail-greyd&amp;diff=814&amp;oldid=prev</id>
		<title>Ebroch at 17:01, 30 March 2024</title>
		<link rel="alternate" type="text/html" href="http://wiki.qmailtoaster.org:80/index.php?title=Qmail-greyd&amp;diff=814&amp;oldid=prev"/>
		<updated>2024-03-30T17:01:53Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 11:01, 30 March 2024&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot;&gt;Line 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Adding_greylisting_to_QMT]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Adding_greylisting_to_QMT&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;|Back&lt;/ins&gt;]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Ebroch</name></author>
	</entry>
	<entry>
		<id>http://wiki.qmailtoaster.org:80/index.php?title=Qmail-greyd&amp;diff=813&amp;oldid=prev</id>
		<title>Ebroch at 17:01, 30 March 2024</title>
		<link rel="alternate" type="text/html" href="http://wiki.qmailtoaster.org:80/index.php?title=Qmail-greyd&amp;diff=813&amp;oldid=prev"/>
		<updated>2024-03-30T17:01:33Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 11:01, 30 March 2024&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot;&gt;Line 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[Adding_greylisting_to_QMT]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;#!/usr/bin/python&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;#!/usr/bin/python&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Ebroch</name></author>
	</entry>
	<entry>
		<id>http://wiki.qmailtoaster.org:80/index.php?title=Qmail-greyd&amp;diff=812&amp;oldid=prev</id>
		<title>Ebroch at 17:00, 30 March 2024</title>
		<link rel="alternate" type="text/html" href="http://wiki.qmailtoaster.org:80/index.php?title=Qmail-greyd&amp;diff=812&amp;oldid=prev"/>
		<updated>2024-03-30T17:00:09Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 11:00, 30 March 2024&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot;&gt;Line 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;pre&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;#!/usr/bin/python&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;#!/usr/bin/python&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l164&quot;&gt;Line 164:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 165:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;# deliver valid email&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;# deliver valid email&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;run_next()&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;run_next()&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;/pre&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Ebroch</name></author>
	</entry>
	<entry>
		<id>http://wiki.qmailtoaster.org:80/index.php?title=Qmail-greyd&amp;diff=811&amp;oldid=prev</id>
		<title>Ebroch: Created page with &quot;#!/usr/bin/python  # Before running this script make sure to have done : # mkdir /var/qmail/grey # chown qmaild.nofiles /var/qmail/grey # test with env TCPREMOTEIP=&quot;127.0.0.1&quot; GREY=&quot;&quot; ./greyd /bin/bash -c env | grep RB # and do not forget to delete the folder and file created before going in production # Design similar to http://www.jonatkins.com/page/software/qgreylist  import os import sys import time  minute = 60 hour = 60*60 day = 60*60*24  # Configuration start  con...&quot;</title>
		<link rel="alternate" type="text/html" href="http://wiki.qmailtoaster.org:80/index.php?title=Qmail-greyd&amp;diff=811&amp;oldid=prev"/>
		<updated>2024-03-30T16:59:41Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;#!/usr/bin/python  # Before running this script make sure to have done : # mkdir /var/qmail/grey # chown qmaild.nofiles /var/qmail/grey # test with env TCPREMOTEIP=&amp;quot;127.0.0.1&amp;quot; GREY=&amp;quot;&amp;quot; ./greyd /bin/bash -c env | grep RB # and do not forget to delete the folder and file created before going in production # Design similar to http://www.jonatkins.com/page/software/qgreylist  import os import sys import time  minute = 60 hour = 60*60 day = 60*60*24  # Configuration start  con...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;#!/usr/bin/python&lt;br /&gt;
&lt;br /&gt;
# Before running this script make sure to have done :&lt;br /&gt;
# mkdir /var/qmail/grey&lt;br /&gt;
# chown qmaild.nofiles /var/qmail/grey&lt;br /&gt;
# test with env TCPREMOTEIP=&amp;quot;127.0.0.1&amp;quot; GREY=&amp;quot;&amp;quot; ./greyd /bin/bash -c env | grep RB&lt;br /&gt;
# and do not forget to delete the folder and file created before going in production&lt;br /&gt;
# Design similar to http://www.jonatkins.com/page/software/qgreylist&lt;br /&gt;
&lt;br /&gt;
import os&lt;br /&gt;
import sys&lt;br /&gt;
import time&lt;br /&gt;
&lt;br /&gt;
minute = 60&lt;br /&gt;
hour = 60*60&lt;br /&gt;
day = 60*60*24&lt;br /&gt;
&lt;br /&gt;
# Configuration start&lt;br /&gt;
&lt;br /&gt;
config = {}&lt;br /&gt;
config[&amp;#039;WAITING&amp;#039;] = 1*minute		# How long should a sender wait before being allowed&lt;br /&gt;
config[&amp;#039;LAST_SEEN&amp;#039;] = 32*day		# How long before we clean IP which have sent several time&lt;br /&gt;
config[&amp;#039;FIRST_SEEN&amp;#039;] = 5*day		# How long before we clean IP which have seen one time only&lt;br /&gt;
config[&amp;#039;CLEANUP&amp;#039;] = 20*minute		# How often we cleanup the IPS&lt;br /&gt;
config[&amp;#039;BASE&amp;#039;] = os.path.join(&amp;#039;/&amp;#039;,&amp;#039;var&amp;#039;,&amp;#039;qmail&amp;#039;,&amp;#039;grey&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
log_per_ip = True			# Log per IP (true) or per Class C (false)&lt;br /&gt;
&lt;br /&gt;
# Configuration end&lt;br /&gt;
&lt;br /&gt;
def log (*param):&lt;br /&gt;
	sys.stderr.write(&amp;#039;greyd: &amp;#039;)&lt;br /&gt;
	sys.stderr.write(*param)&lt;br /&gt;
	sys.stderr.write(&amp;#039;\n&amp;#039;)&lt;br /&gt;
	sys.stderr.flush()&lt;br /&gt;
&lt;br /&gt;
def out (code,*param):&lt;br /&gt;
	log(*param)&lt;br /&gt;
	sys.exit(code)&lt;br /&gt;
&lt;br /&gt;
def run_next ():&lt;br /&gt;
	if len(sys.argv) &amp;gt; 1:&lt;br /&gt;
		try:&lt;br /&gt;
			prog = sys.argv[1]&lt;br /&gt;
			param = sys.argv[1:]&lt;br /&gt;
			os.execve(prog,param,os.environ)&lt;br /&gt;
		except:&lt;br /&gt;
			out(1,&amp;quot;issue whish trying to exec %s&amp;quot; % prog)&lt;br /&gt;
	else:&lt;br /&gt;
		out(1,&amp;quot;can not execute the smtp application&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
def cleanup ():&lt;br /&gt;
	global config&lt;br /&gt;
	&lt;br /&gt;
	try:&lt;br /&gt;
		filename = os.path.join(config[&amp;#039;BASE&amp;#039;],&amp;#039;clean&amp;#039;)&lt;br /&gt;
		last_clean = os.path.getmtime(filename)&lt;br /&gt;
	except:&lt;br /&gt;
		try:&lt;br /&gt;
			open(filename,&amp;#039;w&amp;#039;).close()&lt;br /&gt;
		except:&lt;br /&gt;
			log(&amp;#039;can not create the timestamp file (%s) used for cleanup&amp;#039; % filename)&lt;br /&gt;
		return&lt;br /&gt;
&lt;br /&gt;
	try:&lt;br /&gt;
		now = time.time()&lt;br /&gt;
		if now - last_clean &amp;gt; config[&amp;#039;CLEANUP&amp;#039;]:&lt;br /&gt;
			log(&amp;#039;running cleanup&amp;#039;)&lt;br /&gt;
			open(filename,&amp;#039;w&amp;#039;).close()&lt;br /&gt;
			for root, dirs, files in os.walk(config[&amp;#039;BASE&amp;#039;], topdown=False):&lt;br /&gt;
				if not dirs:&lt;br /&gt;
					for file in  files:&lt;br /&gt;
						filename = os.path.join(root,file)&lt;br /&gt;
						#log(&amp;#039;checking %s&amp;#039; % filename)&lt;br /&gt;
						try:&lt;br /&gt;
							ctime = os.path.getctime(filename)&lt;br /&gt;
							mtime = os.path.getmtime(filename)&lt;br /&gt;
&lt;br /&gt;
							deltac = now - ctime&lt;br /&gt;
							deltam = now - mtime&lt;br /&gt;
						except:&lt;br /&gt;
							log(&amp;#039;%s must have been deleted by another process&amp;#039; % filename)&lt;br /&gt;
							continue&lt;br /&gt;
						try:&lt;br /&gt;
							# You sent us one mail 5 days ago, bye, bye&lt;br /&gt;
							if ctime == mtime :&lt;br /&gt;
								if deltac &amp;gt; config[&amp;#039;FIRST_SEEN&amp;#039;]:&lt;br /&gt;
									os.unlink(filename)&lt;br /&gt;
									log(&amp;#039;removed inactive one off sender %s&amp;#039; % filename)&lt;br /&gt;
							# You sent us several mails 32 days ago, bye, bye&lt;br /&gt;
							else:&lt;br /&gt;
								if deltam &amp;gt; config[&amp;#039;LAST_SEEN&amp;#039;]:&lt;br /&gt;
									os.unlink(filename)&lt;br /&gt;
									log(&amp;#039;removed inactive sender %s&amp;#039; % filename)&lt;br /&gt;
						except:&lt;br /&gt;
							log(&amp;#039;could not cleanup %s&amp;#039; % filename)&lt;br /&gt;
							continue&lt;br /&gt;
	except:&lt;br /&gt;
		log(&amp;#039;problem with cleanup&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
# Main&lt;br /&gt;
&lt;br /&gt;
# Get all environment variable&lt;br /&gt;
&lt;br /&gt;
remote_ip = os.environ.get(&amp;#039;TCPREMOTEIP&amp;#039;)&lt;br /&gt;
if remote_ip == None:&lt;br /&gt;
	# should never happen&lt;br /&gt;
	out(1,&amp;quot;Can not get TCPREMOTEIP from environment&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if os.environ.get(&amp;#039;GREY&amp;#039;) == None:&lt;br /&gt;
	run_next()&lt;br /&gt;
&lt;br /&gt;
if os.environ.get(&amp;#039;RELAYCLIENT&amp;#039;) != None:&lt;br /&gt;
	sys.stderr.write(&amp;#039;Both GREY and RELAYCLIENT set for the same IP : %s&amp;#039; % remote_ip)&lt;br /&gt;
	os.environ[&amp;#039;RBLSMTPD&amp;#039;] = &amp;#039;&amp;#039;&lt;br /&gt;
	run_next()&lt;br /&gt;
&lt;br /&gt;
# Build the name of the file to check&lt;br /&gt;
&lt;br /&gt;
ips = remote_ip.split(&amp;#039;.&amp;#039;)&lt;br /&gt;
foldername = config[&amp;#039;BASE&amp;#039;]&lt;br /&gt;
&lt;br /&gt;
foldername = os.path.join(foldername,ips[0],ips[1])&lt;br /&gt;
filename = os.path.join(foldername,ips[2])&lt;br /&gt;
&lt;br /&gt;
if log_per_ip:&lt;br /&gt;
	filename += &amp;quot;-&amp;quot; + ips[3]&lt;br /&gt;
&lt;br /&gt;
# Check time and perform according action&lt;br /&gt;
&lt;br /&gt;
try:&lt;br /&gt;
	now = time.time()&lt;br /&gt;
&lt;br /&gt;
	last_seen = os.path.getmtime(filename)&lt;br /&gt;
	first_seen = os.path.getctime(filename)&lt;br /&gt;
	&lt;br /&gt;
	delta_last = now - last_seen&lt;br /&gt;
	delta_first = now - first_seen&lt;br /&gt;
except:&lt;br /&gt;
	try:&lt;br /&gt;
		os.makedirs(foldername,0700)&lt;br /&gt;
	except:&lt;br /&gt;
		# The folder most likely already exist&lt;br /&gt;
		pass&lt;br /&gt;
	try:&lt;br /&gt;
		open(filename,&amp;#039;w&amp;#039;).close()&lt;br /&gt;
		os.environ[&amp;#039;RBLSMTPD&amp;#039;] = &amp;#039;greylisting, IP %s time -&amp;#039; % remote_ip&lt;br /&gt;
	except:&lt;br /&gt;
		log(&amp;#039;issue trying the initial touching of the file %s (or creating the folder)&amp;#039; % filename)&lt;br /&gt;
	cleanup()&lt;br /&gt;
	run_next()&lt;br /&gt;
&lt;br /&gt;
# if you never waited two minutes without sending&lt;br /&gt;
if delta_first &amp;lt; config[&amp;#039;WAITING&amp;#039;]:&lt;br /&gt;
	try:&lt;br /&gt;
		os.unlink(filename)&lt;br /&gt;
		open(filename,&amp;#039;w&amp;#039;).close()&lt;br /&gt;
		os.environ[&amp;#039;RBLSMTPD&amp;#039;] = &amp;#039;greylisting, IP %s time %d&amp;#039; % (remote_ip,int(delta_last))&lt;br /&gt;
	except:&lt;br /&gt;
		log(&amp;#039;issue with touching file %s&amp;#039; % filename)&lt;br /&gt;
	cleanup()&lt;br /&gt;
	run_next()&lt;br /&gt;
	&lt;br /&gt;
# deliver valid email&lt;br /&gt;
run_next()&lt;/div&gt;</summary>
		<author><name>Ebroch</name></author>
	</entry>
</feed>