我正在尝试找到一种使用 Python 邮寄文件内容的方法

Posted

技术标签:

【中文标题】我正在尝试找到一种使用 Python 邮寄文件内容的方法【英文标题】:I'm trying to find a way to mail the contents of a file with Python 【发布时间】:2020-12-27 22:41:53 【问题描述】:

我正在尝试制作一个脚本,该脚本必须将测试结果通过邮件正文邮寄给接收方。

在文件 A 中,我运行了一些将文本添加到 .txt 的代码,并以

结束
logger.mail('Testresult ' + date)

这部分在名为 logger 的文件中调用以下代码部分:

def mail(subject):
    note = open("logs/IguanaResult" + datum + ".txt", "r", encoding="utf-8")
    print("logs/IguanaResult" + datum + ".txt")
    message = note.read()
    mailing.mail(message, subject)
    note.close()

然后调用最后一部分代码,在一个名为 mailing 的文件中,它应该发送邮件:

def mail(message, subject):
    date = date.today()
    date = date.strftime("%d-%m-%Y")

    # Open password
    h = open("open password file", "r")

    # Email, pass, and receiver
    email = h.readline().split('\n')[0]
    password = h.readline()
    send_to_email = 'dedacted'

    msg = MIMEMultipart()
    msg['From'] = email
    msg['To'] = send_to_email
    msg['Subject'] = subject

    try:
        # Attach the message to the MIMEMultipart object
        msg.attach(MIMEText(message, 'plain'))
        print("content:" + message)
    except Exception:
        print("Could not attach message to MIME")

    server = smtplib.SMTP('smtp.gmail.com', 587)
    server.starttls()
    server.login(email, password)
    text = msg.as_string() # You now need to convert the MIMEMultipart object to a string to send
    server.sendmail(email, send_to_email, text)
    server.quit()

电子邮件已发送,但它只有一个标题。没有尸体。

我希望 *** 可以帮助我,因为没有错误消息...

【问题讨论】:

bytes 有一个方法decode 可以转换为strstr 有一个方法 encode 可以转换为 bytes。也许您打算使用str 而不是bytes 您将什么作为message 参数传递给mail 函数? 我在这里没有看到对bytes 的任何明确使用。我假设 message 是一个字符串。显式设置MIMEText 编码怎么样,比如:MIMEText(message, 'plain', 'utf-8') @mkrieger1:这是我尝试将logs/IguanaResult" + date + ".txt 的文件转换为电子邮件正文的部分 在这一行 note = open("logs/IguanaResult" + date + ".txt", "r") 尝试将其更改为 note = open("logs/IguanaResult" + date + ".txt", "r", encoding="utf-8") 【参考方案1】:

最小的工作示例 - 测试您的数据文件是否适用于此代码。

根据您的喜好更改get_sender_credential,我已从文件中加载,以便轻松将其隐藏在脚本之外。

如果您仍然看到其中的空白消息,那么您可能需要进行编码工作 - 因为我不确定您的数据的详细信息。无需将'plain' 显式传递给MIMEText,因为它是默认值。

请注意:建议对文件操作使用with 语句,而不是手动打开和关闭。如果这是完整的函数定义,它可以防止您像使用类似文件的对象 h 那样关闭文件。

此外,您不需要将 args 放入 split('\n'),因为 split 会自动根据换行符和空格进行拆分。

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart


def get_sender_credential():
    with open("id.txt", 'rt') as fp:
        return fp.read().split()  # just to hide my credential with convenience


def handshake_smtp(smtp_addr, sender, passwd) -> smtplib.SMTP:
    smtp_server = smtplib.SMTP(smtp_addr, 587)
    smtp_server.ehlo()
    smtp_server.starttls()
    smtp_server.ehlo()
    smtp_server.login(sender, passwd)

    return smtp_server


def send_mail(file_dir, subject, from_, to, smtp_server: smtplib.SMTP):
    with open(file_dir, 'rt') as fp:
        msg = MIMEMultipart()
        msg.attach(MIMEText(fp.read()))

    msg['Subject'] = subject
    msg['From'] = from_
    smtp_server.sendmail(from_, to, msg.as_string())
    smtp_server.quit()


smtp_address, sender_addr, sender_pass, recv_addr = get_sender_credential()

smtp_server_instance = handshake_smtp(smtp_address, sender_addr, sender_pass)
send_mail("some_data.txt", "hello world!", sender_addr, recv_addr, smtp_server_instance)

【讨论】:

虽然这段代码运行良好(顺便说一句,谢谢!),但我发现我遇到的问题是我忘记关闭一个文本文件。现在我使用 with open 来处理一切,就像一个魅力。

以上是关于我正在尝试找到一种使用 Python 邮寄文件内容的方法的主要内容,如果未能解决你的问题,请参考以下文章

“无法打开文件以供阅读”将PDF从存储附加到可邮寄

正则表达式以python分割文本文件

运行powershell脚本,以便检查并邮寄故障

Pentaho Kettle:邮寄转换的结果

在 PDF 文件中查找文本位置

在使用 python 写入时从日志文件中读取