Tianyuan Yu | 13aac73 | 2022-03-03 20:59:54 -0800 | [diff] [blame] | 1 | #!/usr/bin/env python3 |
Zhiyi Zhang | 576aad1 | 2017-10-03 15:41:53 -0700 | [diff] [blame] | 2 | import argparse |
Davide Pesavento | ffe487b | 2025-01-04 00:46:10 -0500 | [diff] [blame] | 3 | import configparser |
| 4 | import smtplib |
| 5 | from email.message import EmailMessage |
Zhiyi Zhang | 576aad1 | 2017-10-03 15:41:53 -0700 | [diff] [blame] | 6 | |
| 7 | # init arg parser and parse |
Davide Pesavento | ffe487b | 2025-01-04 00:46:10 -0500 | [diff] [blame] | 8 | parser = argparse.ArgumentParser(description='Email challenge sender for NDNCERT CA') |
Davide Pesavento | 397faa9 | 2025-01-04 20:56:56 -0500 | [diff] [blame] | 9 | parser.add_argument('recipient', help='email address of the recipient') |
Davide Pesavento | ffe487b | 2025-01-04 00:46:10 -0500 | [diff] [blame] | 10 | parser.add_argument('secret', help='secret code for the challenge') |
| 11 | parser.add_argument('ca_name', help='name of the certificate authority') |
| 12 | parser.add_argument('cert_name', help='name of the certificate being requested') |
Zhiyi Zhang | 576aad1 | 2017-10-03 15:41:53 -0700 | [diff] [blame] | 13 | args = parser.parse_args() |
| 14 | |
Davide Pesavento | 397faa9 | 2025-01-04 20:56:56 -0500 | [diff] [blame] | 15 | vars = { |
| 16 | 'ca_name': args.ca_name, |
| 17 | 'cert_name': args.cert_name, |
| 18 | 'recipient': args.recipient, |
| 19 | 'secret': args.secret, |
| 20 | } |
| 21 | |
Davide Pesavento | ffe487b | 2025-01-04 00:46:10 -0500 | [diff] [blame] | 22 | # open config file |
Davide Pesavento | 74f837d | 2025-01-05 15:34:44 -0500 | [diff] [blame^] | 23 | cfg = configparser.ConfigParser(empty_lines_in_values=True, |
| 24 | interpolation=configparser.ExtendedInterpolation()) |
| 25 | cfg.read('@SYSCONFDIR@/ndncert/ndncert-mail.conf') |
Zhiyi Zhang | 576aad1 | 2017-10-03 15:41:53 -0700 | [diff] [blame] | 26 | |
| 27 | # read smtp settings |
Davide Pesavento | 74f837d | 2025-01-05 15:34:44 -0500 | [diff] [blame^] | 28 | server = cfg.get('ndncert.smtp', 'smtp_server') |
| 29 | port = cfg.get('ndncert.smtp', 'smtp_port') |
| 30 | encrypt_mode = cfg.get('ndncert.smtp', 'encrypt_mode') |
| 31 | username = cfg.get('ndncert.smtp', 'smtp_user', fallback=None) |
| 32 | password = cfg.get('ndncert.smtp', 'smtp_password', fallback=None) |
Zhiyi Zhang | 576aad1 | 2017-10-03 15:41:53 -0700 | [diff] [blame] | 33 | |
| 34 | # read email settings |
Davide Pesavento | 74f837d | 2025-01-05 15:34:44 -0500 | [diff] [blame^] | 35 | from_addr = cfg.get('ndncert.email', 'from', vars=vars) |
| 36 | subject = cfg.get('ndncert.email', 'subject', vars=vars) |
| 37 | text = cfg.get('ndncert.email', 'text_template', vars=vars) |
| 38 | html = cfg.get('ndncert.email', 'html_template', vars=vars) |
Zhiyi Zhang | 576aad1 | 2017-10-03 15:41:53 -0700 | [diff] [blame] | 39 | |
Davide Pesavento | ffe487b | 2025-01-04 00:46:10 -0500 | [diff] [blame] | 40 | # create email message |
| 41 | msg = EmailMessage() |
| 42 | msg['From'] = from_addr |
Davide Pesavento | 397faa9 | 2025-01-04 20:56:56 -0500 | [diff] [blame] | 43 | msg['To'] = args.recipient |
Zhiyi Zhang | 576aad1 | 2017-10-03 15:41:53 -0700 | [diff] [blame] | 44 | msg['Subject'] = subject |
Davide Pesavento | ffe487b | 2025-01-04 00:46:10 -0500 | [diff] [blame] | 45 | msg.set_content(text) |
| 46 | msg.add_alternative(html, subtype='html') |
Zhiyi Zhang | 576aad1 | 2017-10-03 15:41:53 -0700 | [diff] [blame] | 47 | |
Davide Pesavento | ffe487b | 2025-01-04 00:46:10 -0500 | [diff] [blame] | 48 | # connect to SMTP server |
Zhiyi Zhang | 576aad1 | 2017-10-03 15:41:53 -0700 | [diff] [blame] | 49 | if encrypt_mode == 'ssl': |
Davide Pesavento | ffe487b | 2025-01-04 00:46:10 -0500 | [diff] [blame] | 50 | context = smtplib.SMTP_SSL(server, port, timeout=10) |
Davide Pesavento | cf216ea | 2025-01-04 01:02:23 -0500 | [diff] [blame] | 51 | elif encrypt_mode == 'starttls': |
Davide Pesavento | ffe487b | 2025-01-04 00:46:10 -0500 | [diff] [blame] | 52 | context = smtplib.SMTP(server, port, timeout=10) |
| 53 | context.starttls() |
| 54 | elif encrypt_mode == 'none': |
| 55 | context = smtplib.SMTP(server, port, timeout=10) |
| 56 | else: |
| 57 | raise ValueError(f'Invalid encrypt_mode: {encrypt_mode}') |
Zhiyi Zhang | 576aad1 | 2017-10-03 15:41:53 -0700 | [diff] [blame] | 58 | |
Davide Pesavento | ffe487b | 2025-01-04 00:46:10 -0500 | [diff] [blame] | 59 | with context as smtp: |
| 60 | if username and password: |
| 61 | smtp.login(username, password) |
| 62 | # send email |
| 63 | smtp.send_message(msg) |