我正在尝试找到一种使用 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
可以转换为str
; str
有一个方法 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 邮寄文件内容的方法的主要内容,如果未能解决你的问题,请参考以下文章