]>
Commit | Line | Data |
---|---|---|
1 | #!/usr/bin/env python3 | |
2 | import Milter | |
3 | import argparse | |
4 | from email.header import decode_header | |
5 | from email.utils import parseaddr | |
6 | ||
7 | class CheckMilter(Milter.Base): | |
8 | def __init__(self): | |
9 | self.envelope_from = None | |
10 | self.header_from = None | |
11 | ||
12 | @Milter.noreply | |
13 | def connect(self, IPname, family, hostaddr): | |
14 | return Milter.CONTINUE | |
15 | ||
16 | def hello(self, heloname): | |
17 | return Milter.CONTINUE | |
18 | ||
19 | def envfrom(self, mailfrom, *args): | |
20 | self.envelope_from = parseaddr(mailfrom)[1] | |
21 | return Milter.CONTINUE | |
22 | ||
23 | @Milter.noreply | |
24 | def envrcpt(self, to, *str): | |
25 | return Milter.CONTINUE | |
26 | ||
27 | @Milter.noreply | |
28 | def header(self, name, hval): | |
29 | if name.lower() == "from": | |
30 | self.header_from = parseaddr(decode_header(hval)[-1][0])[1] | |
31 | return Milter.CONTINUE | |
32 | ||
33 | def eoh(self): | |
34 | if self.header_from is not None and self.header_from != "" and self.header_from != self.envelope_from: | |
35 | self.setreply("553", xcode="5.7.1", msg="<%s>: From header rejected: not matching envelope From %s" | |
36 | % (self.header_from, self.envelope_from)) | |
37 | return Milter.REJECT | |
38 | ||
39 | return Milter.CONTINUE | |
40 | ||
41 | @Milter.noreply | |
42 | def body(self, chunk): | |
43 | return Milter.CONTINUE | |
44 | ||
45 | def eom(self): | |
46 | return Milter.ACCEPT | |
47 | ||
48 | def close(self): | |
49 | return Milter.CONTINUE | |
50 | ||
51 | def abort(self): | |
52 | return Milter.CONTINUE | |
53 | ||
54 | if __name__ == "__main__": | |
55 | parser = argparse.ArgumentParser() | |
56 | parser.add_argument("--socket", "-s", type=str, help="socket to listen to") | |
57 | config = parser.parse_args() | |
58 | ||
59 | Milter.factory = CheckMilter | |
60 | Milter.runmilter("check_from", config.socket, timeout=300) |