首页 > 解决方案 > 无法在python中发送邮件

问题描述

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

标签: pythonwindowspython-2.7email

解决方案


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(尽管它仍然是低级和古怪的)。


推荐阅读