首页 > 解决方案 > 附件中的图片无效

问题描述

我使用 SMTP 通过邮件发送图像。可以发邮件,但是图片打不开;它说不支持的格式。该图像是使用opencv拍摄的。这是我使用的代码。请告诉我我在程序中做错了什么。没有错误,但图像无法打开。

鳕鱼:

import cv2
i=0

camera = cv2.VideoCapture(0)
if(i==0):
     for i in range(1):
           return_value, image = camera.read()
           cv2.imwrite('Disease'+str(i)+'.png', image)


import smtplib 
from email.mime.multipart import MIMEMultipart 
from email.mime.text import MIMEText 
from email.mime.base import MIMEBase 
from email import encoders 

fromaddr = "xxxxxx@gmail.com"
toaddr = "yyyyyy@gmail.com"

msg = MIMEMultipart() 
msg['From'] = fromaddr
msg['To'] = toaddr 
msg['Subject'] = "DISEASE"
body = "FOR NOTIFICATION"

msg.attach(MIMEText(body, 'plain')) 

filename = "Disease.png"
attachment = open("C:/tensorflow1/models/research/object_detection/capture.py", "rb") 

p = MIMEBase('application', 'octet-stream') 
p.set_payload((attachment).read()) 
encoders.encode_base64(p) 
p.add_header('Content-Disposition', "attachment; filename= %s" % filename) 

msg.attach(p) 

s = smtplib.SMTP('smtp.gmail.com', 587) 
s.starttls() 
s.login(fromaddr, "password") 

text = msg.as_string() 

s.sendmail(fromaddr, toaddr, text) 
s.quit() 

在此处输入图像描述

标签: python-3.xemailmime

解决方案


您正在附加一段 Python 代码并声称它是一个图像。我想您可能想要运行该代码并附加其输出。

假设C:/tensorflow1/models/research/object_detection/capture.py是您包含的用于创建图像的代码的路径,并且C:/tensorflow1/models/research/object_detection/位于您的PYTHONPATH.

import disease

虽然可以说,更好的设计是重组这个文件,以便它声明一个你可以在需要时调用的函数,而不是在你运行代码时立即运行一次import;标准机制是

def functionname():
    # ... Your code here

if __name__ == '__main__':
    functionname()

然后导入和调用此代码的方法是

import disease

# ... Other code ...
disease.functionname()

(显然,一个比functionname恰当描述的名称更好的名称,例如generate_png。)

如果您只是将图像附加到电子邮件然后丢弃它,也许您可​​能希望完全避免将图像写入磁盘,但由于这有点推测,并且命中磁盘不是主要的效率问题,我在这一点上不会详细说明。

作为另一个细节,您将图像附加为通用application/octet-stream身体部位。图像有自己指定的 MIME 类型;你会想要image/png一张PNG图片。

此类附件的 Python 类是MIMEImage.

from email.mime.image import MIMEImage

# ...
image_filename = './Disease.png'
image = MIMEImage(open(image_filename, 'rb').read(), name=os.path.basename(image_filename))
msg.attach(image)

该类通常已经知道如何设置详细的属性,例如精确的图像类型和内容配置以及传输编码。

除了文体,import语句通常应该在文件的顶部;见PEP-8。


推荐阅读