source: foomailer/foomail.py@ 405

Last change on this file since 405 was 405, checked in by Rick van der Zwet, 4 years ago

foomailer: Revamp argument style to reduce code-size.

While here re-do argument formatting to better fit my requirements

  • Property svn:executable set to *
  • Property svn:keywords set to Id
File size: 4.7 KB
Line 
1#!/usr/bin/env python
2#
3# Rick van der Zwet <rick@vanderzwet.net>
4#
5#
6import argparse
7import mimetypes
8import os
9import random
10import re
11import smtplib
12import socket
13import string
14import sys
15import textwrap
16import time
17
18from time import gmtime,strftime
19from email.mime.multipart import MIMEMultipart
20from email.mime.base import MIMEBase
21from email.mime.text import MIMEText
22from email.utils import COMMASPACE, formatdate
23from email import encoders
24
25__svnversion__ = "$Id: foomail.py 405 2020-06-03 11:53:43Z rick $"
26__author__ = "Rick van der Zwet"
27
28
29default_subject = strftime('Test email send at %a, %d %b %Y %T %z', gmtime())
30
31parser = argparse.ArgumentParser(
32 description=textwrap.dedent('''
33 Sent test emails for mailserver verification and debugging
34
35 Author : %s
36 Version: %s
37 ''' % (__author__, __svnversion__)),
38 formatter_class=argparse.RawDescriptionHelpFormatter)
39parser.add_argument('--from', '-f', dest='sender', required=True)
40parser.add_argument('--recipient', '-r', required=True)
41parser.add_argument('--server', '-s', required=True)
42parser.add_argument('--cc', help='Carbon Copy header')
43parser.add_argument('--file', action='append', help='Attachments to sent')
44parser.add_argument('--hostname', default=socket.gethostname(), help='EHLO/HELO hostname to present')
45parser.add_argument('--message', help='Alternative message text of body')
46parser.add_argument('--subject', default=default_subject, help='Alternative Subject header')
47parser.add_argument('--spam', action='store_true', help='Include X-Spam testing headers')
48parser.add_argument('--port', type=int, default=25, help='SMTP port used for connection')
49parser.add_argument('--reply-to', help='Set Reply-To: header')
50parser.add_argument('--to', help='Alternative To: header')
51parser.add_argument('--silent', action='store_true', help='Do not-follow SMTP flow verbosely')
52parser.add_argument('--virus', action='store_true', help='Include eicar.txt sample virus')
53parser.add_argument('--dry-run', '-d', action='store_true', help='Do not actually sent out the message')
54args = parser.parse_args()
55
56
57email = MIMEMultipart()
58email['From'] = 'Testing sender <' + args.sender + '>'
59email['To'] = args.to or args.recipient
60if args.cc:
61 email['Cc'] = args.cc
62email['X-Server'] = args.server
63email['X-Port'] = str(args.port)
64email['X-Hostname'] = args.hostname
65email['Message-ID' ] = '<' +''.join(random.sample(string.ascii_letters +
66 string.digits,10)) + '@' + email['X-Hostname'] + '>'
67email['Date'] = strftime('%a, %d %b %Y %T %z',gmtime())
68email['Subject'] = args.subject
69email['X-Version'] = __svnversion__
70email['X-Author'] = __author__
71
72tests = []
73if args.spam:
74 tests.append('spam')
75if args.virus:
76 test.append('virus')
77email['X-Tests'] = ' '.join(tests)
78
79if args.reply_to:
80 email['Reply-To'] = args.reply_to
81
82if args.spam:
83 email['X-Spam'] = 'XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X'
84
85if args.message:
86 f = open(args.message,'r')
87 msg = f.read()
88 f.close()
89else:
90 msg = textwrap.dedent('''
91 Hi,
92
93 Sorry to bother you...
94
95 Please ignore this message as it is used to test
96 and verify systems to make sure everything works
97 flawless.
98
99 %(virus)s
100
101 Technical details:\n''' % email)
102
103 for k in list(email.keys()):
104 v = email[k]
105 msg += "* %-15s : %s\n" % (k,v)
106
107 msg += textwrap.dedent('''
108 Best regards,
109 Your system administrator
110 --
111 BSD Licensed Source Code for this tool at:
112 https://rickvanderzwet.nl/svn/personal/foomailer
113 ''')
114
115
116email.attach(MIMEText(msg))
117
118if args.virus:
119 part = MIMEBase('application', "octet-stream")
120 part.set_payload('X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*')
121 encoders.encode_base64(part)
122 part.add_header('Content-Disposition', 'attachment; filename="eicar.txt"')
123 email.attach(part)
124
125if args.file:
126 for filename in args.file:
127 mimetype = mimetypes.guess_type(filename)[0].split('/')
128 part = MIMEBase(mimetype[0],mimetype[1])
129 f = open(filename,'r')
130 part.set_payload(f.read())
131 f.close()
132 encoders.encode_base64(part)
133 part.add_header('Content-Disposition', 'attachment; filename="%s"' % os.path.basename(filename))
134 email.attach(part)
135
136print(email.as_string())
137
138if not args.dry_run:
139 mark = time.time()
140 server = smtplib.SMTP(args.server, args.port, timeout=600)
141 server.set_debuglevel(not args.silent)
142 server.helo(args.hostname)
143 server.ehlo(args.hostname)
144 server.sendmail(args.sender, args.recipient, email.as_string())
145 server.quit()
146 print("Sending took sec: %.2f" % (time.time() - mark))
Note: See TracBrowser for help on using the repository browser.