Функция SMTP на Python, отправляющая текстовый файл как тип файла .bin

#linux #python-3.x #smtplib #pathlib

#linux #python-3.x #smtplib #pathlib

Вопрос:

При вызове приведенной ниже функции SMTP сообщение отправляется на мой почтовый ящик, но файл журнала прикреплен в виде файла типа .bin. При открытии файл .bin читается так, как если бы это был файл типа .txt, но я не могу открыть файлы .bin на своем мобильном устройстве, что является для меня огромной проблемой. Есть ли какой-либо способ прикрепить этот файл к сообщению, используя его исходный тип файла? Любая обратная связь очень ценится.

Редактировать: файл отправляется с его исходным типом файла (.txt), когда я запускаю это с компьютера Windows, но тип файла неправильно обрабатывается, когда я запускаю его с компьютера Linux. Я тестировал это как с Outlook (предпочтительно), так и с Gmail. Outlook распознает файл как тип файла .bin, в то время как Gmail вообще не распознает тип файла.

 from pathlib import Path
data_folder = Path("path/to/working/directory")
log_file = Path(data_folder / "log.txt")

def sendmail():

    maildate = str(datetime.now().strftime("%m"   "/"   "%d"   "/"   "%Y"))
    subjectdate = str("Subject - "   maildate)
    
    import smtplib
    from email.mime.base import MIMEBase
    from email.mime.multipart import MIMEMultipart
    from email import encoders

    msg = MIMEMultipart()
    msg['Subject'] = subjectdate
    msg['From'] = 'from@from.com'
    msg['To'] = 'to@to.com'

    attachment = MIMEBase('application', "octet-stream")
    attachment.set_payload(open(log_file, "r").read())
    encoders.encode_base64(attachment)
    attachment.add_header('Content-Disposition', 'attachment, filename=log_file')

    msg.attach(attachment)

    s = smtplib.SMTP('sender@sender.com')
    s.send_message(msg)
    s.quit()
  

Комментарии:

1. В чем причина использования application / octet-stream вместо чего-то вроде plain / text? октетный поток предназначен для двоичных данных. Кроме того, есть ли какая-либо причина, по которой ваше имя_файла не может содержать расширение .txt?

2. Спасибо за ваш вклад. Я смог исправить проблему, изменив filename=log_file, чтобы включить имя файла и расширение. Теперь я понимаю, что он прикреплял файл как «log_file» вместо использования фактического имени файла.

Ответ №1:

Файл отправляется без расширения, поскольку имя файла интерпретируется как «log_file» вместо значения log_file. Приведенный ниже код работает должным образом и правильно прикрепляет файл к сообщению.

 from pathlib import Path
data_folder = Path("path/to/working/directory")
log_file = Path(data_folder / "log.txt")

def sendmail():

    maildate = str(datetime.now().strftime("%m"   "/"   "%d"   "/"   "%Y"))
    subjectdate = str("Subject - "   maildate)

    import smtplib
    from email.mime.base import MIMEBase
    from email.mime.multipart import MIMEMultipart
    from email import encoders

    msg = MIMEMultipart()
    msg['Subject'] = subjectdate
    msg['From'] = 'from@from.com'
    msg['To'] = 'to@to.com'

    attachment = MIMEBase('application', "octet-stream")
    attachment.set_payload(open(log_file, "r").read())
    encoders.encode_base64(attachment)
    attachment.add_header('Content-Disposition', 'attachment, filename="log.txt"')

    msg.attach(attachment)

    s = smtplib.SMTP('sender@sender.com')
    s.send_message(msg)
    s.quit()