无法在python中发送邮件

时间:2018-07-17 03:44:28

标签: python windows python-2.7 email

我正在尝试使用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()

1 个答案:

答案 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库进行了全面改进后,其中某些功能会更加简单明了(尽管它仍然是低级且古怪的)。