Для отправки электронных писем я использую:
def send_email(subject, message, destination, password_path=None):
from socket import gethostname
from email.message import EmailMessage
import smtplib
import json
server = smtplib.SMTP('smtp.gmail.com', 587)
server.starttls()
with open(password_path) as f:
config = json.load(f)
server.login('me123@gmail.com', config['password'])
# craft message
msg = EmailMessage()
message = f'{message}\nSend from Hostname: {gethostname()}'
msg.set_content(message)
msg['Subject'] = subject
msg['From'] = 'me123@gmail.com'
msg['To'] = destination
# send msg
server.send_message(msg)
примечание. У меня есть пароль в файле json с использованием пароля приложения, как предлагается в этом ответе { ссылка } .
использование этого для сбора содержимого из stdout путем записи его в пользовательский файл stdout с использованием встроенной функции print:
import sys
from pathlib import Path
def my_print(*args, filepath='~/my_stdout.txt'):
filepath = Path(filepath).expanduser()
# do normal print
__builtins__['print'](*args, file=sys.__stdout__) #prints to terminal
# open my stdout file in update mode
with open(filepath, "a+") as f:
# save the content we are trying to print
__builtins__['print'](*args, file=f) #saves in a file
def collect_content_from_file(filepath):
filepath = Path(filepath).expanduser()
contents = ''
with open(filepath,'r') as f:
for line in f.readlines():
contents = contents + line
return contents
Обратите внимание на a+
, чтобы иметь возможность создать файл если он уже НЕ существует.
Обратите внимание, что если вы хотите удалить старое содержимое вашего пользовательского my_stdout.txt
, вам нужно удалить файл и проверить, существует ли он:
# remove my stdout if it exists
os.remove(Path('~/my_stdout.txt').expanduser()) if os.path.isfile(Path('~/my_stdout.txt').expanduser()) else None
Кредиты для кода печати взяты из ответа здесь: Как сделать читаемый файл (например, sys.stdout) уже открытым?