【问题标题】:Python SMTP function sending .txt file as .bin file-typePython SMTP 函数将 .txt 文件作为 .bin 文件类型发送
【发布时间】:2019-03-19 21:30:24
【问题描述】:

当调用下面的 SMTP 函数时,消息被发送到我的邮箱,但日志文件附加为 .bin 文件类型。打开时,.bin 文件的读取方式与 .txt 文件类型相同,但我无法在移动设备上打开 .bin 文件,这对我来说是个大问题。有没有办法使用它的原始文件类型将此文件附加到消息中?非常感谢任何反馈。

编辑:当我从 Windows 机器上运行它时,该文件以其原始文件类型 (.txt) 发送,但是当我从 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()

【问题讨论】:

  • 使用 application/octet-stream 代替纯文本的原因是什么? octet-stream 用于二进制数据。另外,您的 file_name 是否有任何原因不能包含 .txt 扩展名?
  • 感谢您的意见。我能够通过更改 filename=log_file 以包含文件名和扩展名来解决此问题。我现在意识到它是将文件附加为“log_file”而不是使用实际的文件名。

标签: linux python-3.x smtplib pathlib


【解决方案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()

【讨论】:

    猜你喜欢
    • 2018-09-15
    • 1970-01-01
    • 2014-06-05
    • 1970-01-01
    • 2020-04-01
    • 2019-01-08
    • 2018-12-18
    • 2012-07-24
    • 1970-01-01
    相关资源
    最近更新 更多