Я участвую в разработке одного проекта на работе. Мы разрабатываем прототипы Raspberry Pi и специальное программное обеспечение. Хоть и разработанное ПО работает блестяще, нам бы хотелось добавить немного дополнительных функций.
Используем Python!
Первое, что мне пришло в голову — это отправка e-mail. Я подумал, что это будет самый сложный фрагмент кода, который мне придётся написать. Если закончу с ним, остальная работа для меня будет довольно лёгкой. Ну или я так думал…
Первое, что я сделал — пошёл на Stack Overflow и нашёл ответ на свой вопрос.
Кажется, довольно просто.
Отправка e-mail
Добавив smtplib из стандартной библиотеки, вы можете отсылать письма очень легко. Мне пришлось посмотреть синтаксис определения функций и прочитать про код-стайл Python. Я всегда предпочитаю использовать имена функций, которые больше всего подходят для языка. Это привело меня к созданию следующей функции:
def send_mail( sender, receivers: List[str], subject, body, username, password, server_address ): """Sends an email to the specified receivers using an Exchange server.""" message = MIMEMultipart() message["From"] = sender message["To"] = ",".join(receivers) message["Subject"] = subject message.attach(MIMEText(body)) server = smtplib.SMTP(server_address, 587) server.starttls() server.login(username, password) server.sendmail(sender, receivers, message.as_string()) server.quit()
Поскольку я использую Exchange сервер, мне приходится инициализировать TLS. Не считая этого, всё довольно просто.
Запускаем скрипт в терминале
Я также хотел иметь возможность запуска скрипта в терминале. Это можно сделать, вызвав функцию после её определения. Когда интерпретатор Python будет проходить через файл, он выполнит её вызов.
Однако в Python хорошим тоном считается поместить вызов внутри аргумента __name__ == » __main__». Это делается для того, чтобы определить, запущен файл напрямую или импортирован другим файлом или модулем.
Когда интерпретатор Python запускает файл напрямую (например, в терминале), он устанавливает глобальную переменную __name__ в __main__.
Когда файл импортируется другим файлом или модулем, __name__ будет установлено как имя файла или модуля.
Поместив выполняемый код внутри if __name__ == » __main__», мы убеждаемся, что код запускается только тогда, когда файл используется напрямую, а не импортируется в другую часть кода.
Анализ входных данных
Я хотел бы указать параметры для функции send_mail, передав их при запуске файла в терминале. Оказывается, у Python тоже есть библиотека для этого!
Импортируя argparse, у меня появляется возможность определить параметры, добавить типовые подсказки и справочные тексты. argparse автоматически добавляет ключ -h, который показывает все возможные параметры и справочные тексты.
Чтобы было поинтереснее, я добавил функцию, которая может использовать файл с текстом, вместо обычного ввода текста. Скрипт получает текст из файла и использует его как контент письма.
if __name__ == " __main__": parser = argparse.ArgumentParser(description="Sends an email to the specified receivers using the Sykehuspartner Exchange server.") parser.add_argument("sender", type=str, help="Sender's email address.") parser.add_argument("receivers", type=str, help="Comma-seperated list of email addresses.") parser.add_argument("subject", type=str, help="Subject of the email.") parser.add_argument("body", type=str, help="Body text of the email. Can be plain text or a file path when -f is passed.") parser.add_argument("username", type=str, help="The username to authenticate with on mail server.") parser.add_argument("password", type=str, help="The password to authenticate with on mail server.") parser.add_argument("server", type=str, help="The address of the mail server.") parser.add_argument("-f", "--file", action="store_true", help="Specifies that the body argument contains a file path instead of plain text") args = parser.parse_args() if args.file: with open(args.body) as file: args.body = file.read() send_mail(args.sender, args.receivers.split(","), args.subject, args.body, args.username, args.password, args.server)
Перевод статьи Jon Stødle: Sending an email with Python