我正在尝试使用email
模块将一堆照片发送到我的电子邮件地址。但是当我运行程序时,什么也没发生。我无法弄清楚程序中出了什么问题。我该如何解决这个问题?
Python代码:
import os
import smtplib
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
fromadd = 'fromadd@gmail.com'
toadd = 'toadd@gmail.com'
def send():
msg = MIMEMultipart()
msg['From'] = fromadd
msg['To'] = toadd
msg['Subject'] = 'Photos'
text = MIMEText('Pics')
msg.attach(text)
screenshot_data = open(files, 'rb').read()
webcam_data = open(files, 'rb').read()
send_image = MIMEImage(screenshot_data, name=os.path.basename(files))
send_images = MIMEImage(webcam_data, name=os.path.basename(files))
msg.attach(send_image)
msg.attach(send_images)
sessions = smtplib.SMTP('smtp.gmail.com', '587')
sessions.ehlo()
sessions.starttls()
sessions.ehlo()
sessions.login(fromadd, 'Password')
sessions.sendmail(fromadd, toadd, msg.as_string())
sessions.quit()
def main():
global files
for files in os.listdir(r'C:\NONE'):
if os.path.isfile(files) and files.endswith(".jpg"):
send()
print('File Sent: ' + files)
os.remove(files)
else:
pass
if __name__ == '__main__':
main()
答案 0 :(得分:1)
os.listdir()
仅返回文件名,而不返回完整路径。因此,除非您在c:\NONE
中运行此程序,或者在当前工作目录中碰巧有一个同名文件,否则os.path.isfile(files)
将返回False
,因此send()
将返回永远不会被召唤。
即使它不是特定于Python的-因此它中的许多具体技巧都不适用-您可能想读一下Eric Lippert的How To Debug Small Programs。还请记住Brian Kernighan的建议:
最有效的调试工具 还是很仔细的思考,再加上 明智地放置打印语句。
-“ Unix入门”(1979年)
立即解决的方法是将目录名os.path.join()
排在最前面;但是您还真的需要摆脱全局变量。
import os
import smtplib
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
fromadd = 'fromadd@gmail.com'
toadd = 'toadd@gmail.com'
def send(pathname, froma, toa):
msg = MIMEMultipart()
msg['From'] = froma
msg['To'] = toa
msg['Subject'] = 'Photos'
text = MIMEText('Pics')
msg.attach(text)
# Should really close() when done!
screenshot_data = open(pathname, 'rb').read()
webcam_data = open(pathname, 'rb').read()
screenshot_image = MIMEImage(screenshot_data, name=os.path.basename(pathname))
webcam_image = MIMEImage(webcam_data, name=os.path.basename(pathname))
msg.attach(screenshot_image)
msg.attach(webcam_image)
session = smtplib.SMTP('smtp.gmail.com', '587')
session.ehlo()
session.starttls()
session.ehlo()
session.login(froma, 'Password')
session.sendmail(froma, toa, msg.as_string())
session.quit()
def main():
for basename in os.listdir(r'C:\NONE'):
filename = os.path.join([r'C:\NONE', basename])
# switch order of conditions for minor efficiency hack
if filename.endswith(".jpg") and os.path.isfile(filename):
send(filename, fromadd, toadd)
print('File Sent: ' + filename)
os.remove(filename)
# empty else not required
if __name__ == '__main__':
main()
还请注意我如何重命名几个变量以避免单数实例上出现复数,并希望通过使用公共前缀更好地连接相关变量。
还不清楚为什么要为每个图像发送两个副本,或者为什么在没有任何有用的内容时创建文本部分。您可能还希望根据其文档中的建议避免使用旧式sendmail
方法。为什么要为每张照片分别创建一条消息?将所有照片附加到单个电子邮件中肯定会更加实用(除非图片绝对很大,并且邮件对于您的邮件服务器来说太大了;但是肯定地,电子邮件仍然是错误的工具)。
从根本上来说,您不应该在2018年用Python 2编写新代码;顺便说一句,在3.6+版本中对email
库进行了全面改进后,其中某些功能会更加简单明了(尽管它仍然是低级且古怪的)。