Отправить содержимое из неизмененного печатного заявления по электронной почте в python - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть скрипт, который запускает main(), и в конце я хочу отправить его содержимое по электронной почте. Я не хочу писать новые файлы и ничего. Просто сделайте исходный сценарий без изменений и в конце просто отправьте содержимое того, что он напечатал. Идеальный код:

main()
send_mail()

Я пробовал это:


def main():
  print('HELLOWORLD')

def send_email(subject='subject', message='', destination='me@gmail.com', password_path=None):
    from socket import gethostname
    from email.message import EmailMessage
    import smtplib
    import json
    import sys

    server = smtplib.SMTP('smtp.gmail.com', 587)
    smtplib.stdout = sys.stdout # <<<<<-------- why doesn't it work?
    server.starttls()
    with open(password_path) as f:
        config = json.load(f)
        server.login('me@gmail.com', config['password'])

        # craft message
        msg = EmailMessage()

        #msg.set_content(message)
        msg['Subject'] = subject
        msg['From'] = 'me@gmail.com'
        msg['To'] = destination
        # send msg
        server.send_message(msg)

if __name__ == '__main__':
    main()
    send_mail()

, но это не работает.

Я не хочу записывать другие файлы или изменять исходные python операторы печати. Как это сделать?


Я пробовал это:

def get_stdout():
    import sys

    print('a')
    print('b')
    print('c')

    repr(sys.stdout)

    contents = ""
    #with open('some_file.txt') as f:
    #with open(sys.stdout) as f:
    for line in sys.stdout.readlines():
        contents += line
    print(contents)

, но он не позволяет мне читать sys.stdout, потому что он говорит, что он не читается. Как я могу открыть его в удобочитаемом или изменить его на читабельный?


Я проверил все следующие ссылки, но ни одна не помогла:

1 Ответ

0 голосов
/ 07 апреля 2020

Для отправки электронных писем я использую:

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) уже открытым?

...