diff --git a/reaction-mailcreate/README.md b/reaction-mailcreate/README.md index bc9497b4f5545a747448a59dfec4c7c06a116752..5f140cd08b4b1bace54edde46d3536bb290c8029 100644 --- a/reaction-mailcreate/README.md +++ b/reaction-mailcreate/README.md @@ -105,6 +105,9 @@ DFN-CERT,Tobias,Dussa,dussa@dfn-cert.de - `-h`/`--help`: Displays the help text and exits the script. - `-i`/`--input`: The input file for the participating sites. Defaults to `{basedir}/{campaign}/Input{infix}.lst`. + - `-I`/`--message-id`: Create a message ID. Useful when the mail server + used is not standard-compliant and does not add one like it is supposed + to do. - `-o`/`--output`: The output file name template to be used when generating the mail files. Defaults to `{basedir}/{campaign}/{site}/{timestamp}{infix}.eml`. diff --git a/reaction-mailcreate/createMails.py b/reaction-mailcreate/createMails.py index 588536d569a1c1e55180bb3fc9f6bdcecb88dfa2..374c19065e8d292d3b58794a0c00d8fef2a449b2 100755 --- a/reaction-mailcreate/createMails.py +++ b/reaction-mailcreate/createMails.py @@ -20,7 +20,7 @@ from email.generator import Generator from email.message import EmailMessage -from email.utils import formatdate +from email.utils import formatdate, make_msgid import argparse import csv import datetime @@ -63,6 +63,7 @@ parser.add_argument('-f', '--from', dest='sender', default='Nobody <no parser.add_argument('-F', '--force', dest='force', default=False, action='store_true', help='force insecure login without TLS/SSL (default: False)') parser.add_argument('-H', '--hashstring', dest='hashstring', default='{salt}{campaign}{infix}-{site}', help='string to be hashed for the URL (default: "{salt}{campaign}{infix}-{site}" where "{salt}" is a random string)') parser.add_argument('-i', '--input', dest='input', default='{basedir}/{campaign}/Input{infix}.lst', help='input file (default: "{basedir}/{campaign}/Input{infix}.lst")') +parser.add_argument('-I', '--message-id', dest='messageid', default=False, action='store_true', help='create a message ID (default: False)') parser.add_argument('-o', '--output', dest='output', default='{basedir}/{campaign}/{site}/{timestamp}{infix}.eml', help='output file name template (default: "{basedir}/{campaign}/{site}/{timestamp}{infix}.eml")') parser.add_argument('-R', '--reply-to', dest='replyto', default=None, help='reply-to mail address (default: None)') parser.add_argument( '--salt', dest='salt', default=None, help='salt to use for hashing (default: random 8-byte hex string)') @@ -191,6 +192,8 @@ if args.verbose: print(f'Using "{args.smtpuser}" as user for SMTP authentication.') if args.smtppass: print('Using "{args.smtppass}" as password for SMTP authentication.') + if args.messageid: + print(f'Generating a message ID.') if (args.smtpuser or args.smtppass) and \ (args.smtpport == 25) and \ @@ -285,6 +288,10 @@ def createMail(data): # Sign mail if requested message = signMail(message) + # Create message ID if requested + if args.messageid: + message['Message-Id'] = make_msgid() + message['Date'] = formatdate(localtime=True) message['Subject'] = args.subject.format_map(SafeDict(basedir=args.basedir, campaign=args.campaign, infix=args.infix, webserver=args.webserver, salt=args.salt, site=data['site'], firstname=data['firstname'], lastname=data['lastname'], email=data['email'], hash=data['hash'], URL=data['URL'], timestamp=data['timestamp'])) message['From'] = args.sender.format_map(SafeDict(basedir=args.basedir, campaign=args.campaign, infix=args.infix, webserver=args.webserver, salt=args.salt, site=data['site'], firstname=data['firstname'], lastname=data['lastname'], email=data['email'], hash=data['hash'], URL=data['URL'], timestamp=data['timestamp']))