# along with this program. If not, see <http://www.gnu.org/licenses/>.
fromemail.generatorimportGenerator
fromemail.messageimportEmailMessage
fromemail.utilsimportformatdate
importargparse
...
...
@@ -27,6 +28,7 @@ import getpass
importhashlib
importjinja2
importos
importmagic
importrequests
importsecrets
importsmtplib
...
...
@@ -43,18 +45,20 @@ if sys.version_info < (3, 8):
parser.register('action','extend',ExtendAction)
# Parse args
parser.add_argument('-a','--attach',dest='attach',default=[],nargs=1,action='extend',help='add attachment(s) to mail (default: None)')
parser.add_argument('-b','--basedir',dest='basedir',default='Mails',help='base directory for all output (default: "Mails")')
parser.add_argument('-B','--bcc',dest='bcc',default=[],nargs=1,action='extend',help='additional mail recipient to bcc (default: None)')
parser.add_argument('-B','--bcc',dest='bcc',default=[],nargs=1,action='extend',help='additional mail recipient(s) to bcc (default: None)')
parser.add_argument('-c','--campaign',dest='campaign',default='Test',help='campaign name (default: "Test")')
parser.add_argument('-C','--cc',dest='cc',default=[],nargs=1,action='extend',help='additional mail recipient(s) to cc (default: None)')
parser.add_argument('-d','--dry-run',dest='dryrun',default=False,action='store_true',help='dry run -- do not actually send mails or create targets (default: False)')
parser.add_argument('-f','--from',dest='sender',default='Nobody <nobody@example.com>',help='sender mail address (default: "Nobody <nobody@example.com>"; implies dry-run if not set)')
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('-S','--smtpserver',dest='smtpserver',default='localhost',help='SMTP server to use (default: "localhost"); port can be specified with "<host>:<port>" notation and takes precedence over implied ports and port specification')
parser.add_argument('-T','--to',dest='to',default='{firstname} {lastname} <{email}>',help='recipient mail address (default: "{firstname} {lastname} <{email}>")')
parser.add_argument('-u','--url',dest='url',default='{webserver}/{campaign}{infix}-{hash}',help='URL template to use (default: "{webserver}/{campaign}{infix}-{hash}"')
parser.add_argument('-U','--createurl',dest='createurl',default='{webserver}/{campaign}{infix}-{hash}/create',help='URL template to use for creation URL (default: "{webserver}/{campaign}{infix}-{hash}/create"')
parser.add_argument('-w','--webserver',dest='webserver',default='https://challenge.example.com',help='web server to use (default: "https://challenge.example.com"; implies dry-run if not set')
parser.add_argument('-w','--webserver',dest='webserver',default='https://challenge.example.com',help='web server to use (default: "https://challenge.example.com"; implies dry-run if not set; to suppress web-hook calling, set to empty string ""')
parser.add_argument('infix',default='',nargs='?',help='infix for ID purposes, default empty')
args=parser.parse_args()
...
...
@@ -112,10 +117,14 @@ if not args.salt:
args.salt=secrets.token_hex(8)
ifargs.verbose:
ifargs.attach:
print(f'Using "{", ".join(args.attach)}" as mail attachment(s).')
print(f'Using "{args.basedir}" as base directory.')
ifargs.bcc:
print(f'Using "{", ".join(args.bcc)}" as silent mail recipients.')
print(f'Using "{", ".join(args.bcc)}" as bcc mail recipient(s).')
print(f'Using "{args.campaign}" as campaign.')
ifargs.cc:
print(f'Using "{", ".join(args.cc)}" as cc mail recipient(s).')
print(f'Using "{args.sender}" as sender mail address.')
ifargs.replyto:
print(f'Using "{args.replyto}" as reply-to mail address.')
...
...
@@ -127,6 +136,7 @@ if args.verbose:
print(f'Using "{args.template.format_map(SafeDict(basedir=args.basedir,campaign=args.campaign,infix=args.infix,webserver=args.webserver,salt=args.salt))}" as template file.')
print(f'Using "{args.to.format_map(SafeDict(basedir=args.basedir,campaign=args.campaign,infix=args.infix,webserver=args.webserver,salt=args.salt))}" as recipient mail address.')
print(f'Using "{args.url.format_map(SafeDict(basedir=args.basedir,campaign=args.campaign,infix=args.infix,webserver=args.webserver,salt=args.salt))}" as URL template.')
print(f'Using "{args.createurl.format_map(SafeDict(basedir=args.basedir,campaign=args.campaign,infix=args.infix,webserver=args.webserver,salt=args.salt))}" as URL template.')
print(f'Using "{args.webserver}" as web server.')
print(f'Using "{args.infix}" as infix.')
print(f'Using "{args.smtpserver}" as SMTP server.')