python - 无法在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()
解决方案
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
(尽管它仍然是低级和古怪的)。
推荐阅读
- java - 我可以在没有链接到验证器实现的情况下创建 spring mvc 自定义验证注释吗
- ios - 以编程方式检查 Apple Watch 是否戴在手腕上?
- android - 当 Android 手机具有 6 核 SoC 时,从应用程序开发人员的角度来看,这意味着什么
- ios - Apple SSO:用户的随机电子邮件地址
- multithreading - Netty 多线程在 4.1 版本中被破坏?长查询后无法处理短查询?
- python - 列出所有目录和文件 = 每个的 ctime
- powershell - 使用 EmployeeType AD 属性创建动态通讯组
- wpf - WPF 如何绑定到 ICommand.CanExecute()
- asp.net - Firefox 中的 ASP.net 双重回发
- sql - 使用查询结果从另一列获取值