问题描述
我正在尝试编写一个脚本,该脚本必须将测试结果邮寄到邮件正文中的接收方。
关闭logger.mail('Testresult ' + date)
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)