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') |
| 9 | parser.add_argument('email', help='email address of the recipient') |
| 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 | ffe487b | 2025-01-04 00:46:10 -0500 | [diff] [blame^] | 15 | # open config file |
| 16 | confParser = configparser.ConfigParser() |
Zhiyi Zhang | 576aad1 | 2017-10-03 15:41:53 -0700 | [diff] [blame] | 17 | confParser.read('@SYSCONFDIR@/ndncert/ndncert-mail.conf') |
| 18 | |
| 19 | # read smtp settings |
Davide Pesavento | ffe487b | 2025-01-04 00:46:10 -0500 | [diff] [blame^] | 20 | encrypt_mode = confParser.get('ndncert.smtp', 'encrypt_mode') |
| 21 | server = confParser.get('ndncert.smtp', 'smtp_server') |
| 22 | port = confParser.get('ndncert.smtp', 'smtp_port') |
| 23 | username = confParser.get('ndncert.smtp', 'smtp_user') |
| 24 | password = confParser.get('ndncert.smtp', 'smtp_password') |
Zhiyi Zhang | 576aad1 | 2017-10-03 15:41:53 -0700 | [diff] [blame] | 25 | |
| 26 | # read email settings |
Davide Pesavento | ffe487b | 2025-01-04 00:46:10 -0500 | [diff] [blame^] | 27 | from_addr = confParser.get('ndncert.email', 'mail_from') |
| 28 | subject = confParser.get('ndncert.email', 'subject') |
| 29 | text = confParser.get('ndncert.email', 'text_template').format(args.secret, args.ca_name, args.cert_name) |
| 30 | html = confParser.get('ndncert.email', 'html_template').format(args.secret, args.ca_name, args.cert_name) |
Zhiyi Zhang | 576aad1 | 2017-10-03 15:41:53 -0700 | [diff] [blame] | 31 | |
Davide Pesavento | ffe487b | 2025-01-04 00:46:10 -0500 | [diff] [blame^] | 32 | # create email message |
| 33 | msg = EmailMessage() |
| 34 | msg['From'] = from_addr |
Zhiyi Zhang | 576aad1 | 2017-10-03 15:41:53 -0700 | [diff] [blame] | 35 | msg['To'] = args.email |
| 36 | msg['Subject'] = subject |
Davide Pesavento | ffe487b | 2025-01-04 00:46:10 -0500 | [diff] [blame^] | 37 | msg.set_content(text) |
| 38 | msg.add_alternative(html, subtype='html') |
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 | # connect to SMTP server |
Zhiyi Zhang | 576aad1 | 2017-10-03 15:41:53 -0700 | [diff] [blame] | 41 | if encrypt_mode == 'ssl': |
Davide Pesavento | ffe487b | 2025-01-04 00:46:10 -0500 | [diff] [blame^] | 42 | context = smtplib.SMTP_SSL(server, port, timeout=10) |
| 43 | elif encrypt_mode == 'tls': |
| 44 | context = smtplib.SMTP(server, port, timeout=10) |
| 45 | context.starttls() |
| 46 | elif encrypt_mode == 'none': |
| 47 | context = smtplib.SMTP(server, port, timeout=10) |
| 48 | else: |
| 49 | raise ValueError(f'Invalid encrypt_mode: {encrypt_mode}') |
Zhiyi Zhang | 576aad1 | 2017-10-03 15:41:53 -0700 | [diff] [blame] | 50 | |
Davide Pesavento | ffe487b | 2025-01-04 00:46:10 -0500 | [diff] [blame^] | 51 | with context as smtp: |
| 52 | if username and password: |
| 53 | smtp.login(username, password) |
| 54 | # send email |
| 55 | smtp.send_message(msg) |