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

问题描述

我正在尝试编写一个脚本,该脚本必须将测试结果邮寄到邮件正文中的接收方。

文件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()

电子邮件已发送,但只有标题。没有身体。

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

解决方法

最小的工作示例-测试您的数据文件是否与此代码兼容。

根据您的喜好更改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_,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_pass)
send_mail("some_data.txt","hello world!",recv_addr,smtp_server_instance)

enter image description here