如何将图像添加到电子邮件正文_python

vee*_*vee 1 html python email outlook

我使用 python 发送电子邮件。我需要将图片插入到正文电子邮件中,如下所示:

\n\n

我需要这样的:

\n\n

但我的输出不显示这样的图像:

\n\n

在此输入图像描述

\n\n

我尝试了很多解决方案来修复它,但效果不佳。\n这是我的代码如下:

\n\n
import smtplib\nfrom email.mime.image import MIMEImage\nfrom email.mime.multipart import MIMEMultipart\nfrom email.mime.text import MIMEText\nfrom email.header import Header\nimport pandas as pd\nimport win32com.client as win32\nimport openpyxl\nimport sys\nfrom PIL import ImageGrab\nfrom pathlib import Path\ndf = pd.read_excel("xxxxx", sheet_name = "sample",nrows = 2, usecols = "A:W")\ndf1 = pd.read_excel("xxxx", sheet_name = "sample")\nexcel_path = ("sample")\nexcel = win32.gencache.EnsureDispatch(\'Excel.Application\')\nexcel.Visible = False\nexcel.DisplayAlerts = False\nwb = excel.Workbooks.Open(excel_path)\nws = wb.Worksheets(1)\nwin32c = win32.constants\nws.Range("A1:H33").CopyPicture(Format=win32c.xlBitmap)\nimg = ImageGrab.grabclipboard()\nimage_path = str("path" + \'te.png\')\nimg.save(image_path)\noutlook = win32.gencache.EnsureDispatch(\'Outlook.Application\')\nnew_mail = outlook.CreateItem(0)\nuser = df1.loc[34,"Unnamed: 4"]\napprover = df1.loc[36,"Unnamed: 4"]\ndef FIN(xReceiveTO,xReceiveCC, xsubject, xBody):\n  FROM = \'from@example.com\'\n  TO = \'To@example.com\'\n  CC = ""  \n  #msg = MIMEMultipart()\n  msg = MIMEText("<html><body><h1>\xe0\xb8\x94\xe0\xb8\xb3\xe0\xb9\x80\xe0\xb8\x99\xe0\xb8\xb4\xe0\xb8\x99\xe0\xb8\x81\xe0\xb8\xb2\xe0\xb8\xa3\xe0\xb8\xaa\xe0\xb9\x88\xe0\xb8\x87\xe0\xb9\x83\xe0\xb8\xab\xe0\xb9\x89\xe0\xb8\x97\xe0\xb8\xb5\xe0\xb8\xa1 AP \xe0\xb9\x81\xe0\xb8\xa5\xe0\xb9\x89\xe0\xb8\xa7</h1>" +\n                 "<p>\xe0\xb8\xa3\xe0\xb8\xb2\xe0\xb8\xa2\xe0\xb8\xa5\xe0\xb8\xb0\xe0\xb9\x80\xe0\xb8\xad\xe0\xb8\xb5\xe0\xb8\x94\xe0\xb8\x95\xe0\xb8\xb2\xe0\xb8\xa1\xe0\xb8\x82\xe0\xb9\x89\xe0\xb8\xad\xe0\xb8\xa1\xe0\xb8\xb9\xe0\xb8\xa5\xe0\xb8\x94\xe0\xb9\x89\xe0\xb8\xb2\xe0\xb8\x99\xe0\xb8\xa5\xe0\xb9\x88\xe0\xb8\xb2\xe0\xb8\x87" +\n                 "html_pages + <br><img src=te.png>"+\n                 "<a href=""mailto:CFGFIN002@ngerntidlor.com?cc=" + user + ";"+ approver + "&subject=Invoice%20\xe0\xb8\x89\xe0\xb8\x9a\xe0\xb8\xb1\xe0\xb8\x9a\xe0\xb8\x99\xe0\xb8\xb5\xe0\xb9\x89\xe0\xb8\x9c\xe0\xb9\x88\xe0\xb8\xb2\xe0\xb8\x99\xe0\xb8\x81\xe0\xb8\xb2\xe0\xb8\xa3\xe0\xb8\x9e\xe0\xb8\xb4\xe0\xb8\x88\xe0\xb8\xb2\xe0\xb8\xa3\xe0\xb8\x93\xe0\xb8\xb2\xe0\xb8\xad\xe0\xb8\x99\xe0\xb8\xb8\xe0\xb8\xa1\xe0\xb8\xb1\xe0\xb8\x95\xe0\xb8\xb4\xe0\xb8\x88\xe0\xb8\xb2\xe0\xb8\x81%20\xe0\xb8\xab\xe0\xb8\xb1\xe0\xb8\xa7\xe0\xb8\xab\xe0\xb8\x99\xe0\xb9\x89\xe0\xb8\xb2\xe0\xb8\x97\xe0\xb8\xb5\xe0\xb8\xa1\xe0\xb9\x81\xe0\xb8\xa5\xe0\xb9\x89\xe0\xb8\xa7%20\xe0\xb8\xa3\xe0\xb8\x9a\xe0\xb8\x81\xe0\xb8\xa7\xe0\xb8\x99\xe0\xb8\x97\xe0\xb8\xb5\xe0\xb8\xa1%20AP%20\xe0\xb8\x95\xe0\xb8\xa3\xe0\xb8\xa7\xe0\xb8\x88\xe0\xb8\xaa\xe0\xb8\xad\xe0\xb8\x9a\xe0\xb8\xaa\xe0\xb8\xad\xe0\xb8\x9a\xe0\xb8\xaa\xe0\xb9\x88\xe0\xb8\x87\xe0\xb8\x95\xe0\xb9\x88\xe0\xb8\xad\xe0\xb9\x84\xe0\xb8\x9b\xe0\xb8\x97\xe0\xb8\xb5\xe0\xb8\xa1%20Financial%20Planing%20and%20Analytics%20\xe0\xb8\x84\xe0\xb8\xa3\xe0\xb8\xb1\xe0\xb8\x9a&body=\xe0\xb8\x97\xe0\xb8\xb5\xe0\xb8\xa1%20AP%20\xe0\xb9\x84\xe0\xb8\x94\xe0\xb9\x89\xe0\xb8\x97\xe0\xb8\xb3\xe0\xb8\x81\xe0\xb8\xb2\xe0\xb8\xa3\xe0\xb8\x95\xe0\xb8\xa3\xe0\xb8\xa7\xe0\xb8\x88\xe0\xb8\xaa\xe0\xb8\xad\xe0\xb8\x9a\xe0\xb9\x81\xe0\xb8\xa5\xe0\xb9\x89\xe0\xb8\xa7\xe0\xb8\xa1\xe0\xb8\xb5\xe0\xb8\x84\xe0\xb8\xa7\xe0\xb8\xb2\xe0\xb8\xa1\xe0\xb9\x80\xe0\xb8\xab\xe0\xb9\x87\xe0\xb8\x99\xe0\xb8\xa7\xe0\xb9\x88\xe0\xb8\xb2\xe0\xb8\xaa\xe0\xb8\xa1\xe0\xb8\x84\xe0\xb8\xa7\xe0\xb8\xa3%20Approve%20\xe0\xb8\x84\xe0\xb8\xa3\xe0\xb8\xb1\xe0\xb8\x9a>Approve</a> "+" "+"<a href=""mailto:CFGFIN002@ngerntidlor.com?cc=" +user + ";"+ approver + "&subject=Invoice%20\xe0\xb8\x89\xe0\xb8\x9a\xe0\xb8\xb1\xe0\xb8\x9a\xe0\xb8\x99\xe0\xb8\xb5\xe0\xb9\x89\xe0\xb9\x84\xe0\xb8\xa1\xe0\xb9\x88\xe0\xb8\x9c\xe0\xb9\x88\xe0\xb8\xb2\xe0\xb8\x99\xe0\xb8\x81\xe0\xb8\xb2\xe0\xb8\xa3\xe0\xb8\x9e\xe0\xb8\xb4\xe0\xb8\x88\xe0\xb8\xb2\xe0\xb8\xa3\xe0\xb8\x93\xe0\xb8\xb2\xe0\xb8\xad\xe0\xb8\x99\xe0\xb8\xb8\xe0\xb8\xa1\xe0\xb8\xb1\xe0\xb8\x95\xe0\xb8\xb4\xe0\xb8\x88\xe0\xb8\xb2\xe0\xb8\x81\xe0\xb8\x97\xe0\xb8\xb5\xe0\xb8\xa1%20AP&body=\xe0\xb8\x97\xe0\xb8\xb5\xe0\xb8\xa1%20AP%20\xe0\xb9\x84\xe0\xb8\x94\xe0\xb9\x89\xe0\xb8\x97\xe0\xb8\xb3\xe0\xb8\x81\xe0\xb8\xb2\xe0\xb8\xa3\xe0\xb8\x95\xe0\xb8\xa3\xe0\xb8\xa7\xe0\xb8\x88\xe0\xb8\xaa\xe0\xb8\xad\xe0\xb8\x9a\xe0\xb9\x81\xe0\xb8\xa5\xe0\xb9\x89\xe0\xb8\xa7\xe0\xb8\xa1\xe0\xb8\xb5\xe0\xb8\x84\xe0\xb8\xa7\xe0\xb8\xb2\xe0\xb8\xa1\xe0\xb9\x80\xe0\xb8\xab\xe0\xb9\x87\xe0\xb8\x99\xe0\xb8\xa7\xe0\xb9\x88\xe0\xb8\xb2\xe0\xb8\xaa\xe0\xb8\xa1\xe0\xb8\x84\xe0\xb8\xa7\xe0\xb8\xa3%20Reject%20\xe0\xb8\x84\xe0\xb8\xa3\xe0\xb8\xb1\xe0\xb8\x9a%20>Reject</a>"\n                 "</body></html>","html","utf-8""")\n  #msg[\'Subject\'] =  Header(subject, \'utf-8\')\n  msg[\'Subject\'] =  "Test"\n  msg[\'To\'] = \', \'.join(xReceiveTO)\n  msg[\'CC\'] = \', \'.join(xReceiveCC)\n  msg[\'FROM\'] = FROM\n  s = smtplib.SMTP(\'10.45.1.25\')\n  s.send_message(msg)\n  s.quit()\n
Run Code Online (Sandbox Code Playgroud)\n\n

请告诉我如何将图像添加到我的正文电子邮件/中。

\n

h4z*_*4z3 7

主消息必须设置为MIMEMultipart子'related'类型(第一个参数)。

然后,图像必须附加 content-id,如下所示:

msg = MIMEMultipart("related")
msg["Subject"] = subject
msg["From"] = from_addr
msf["To"] = to_addr

html_output = "your html here"

msg.attach(MIMEText(html_output, "html"))
if images:
    for image_name, image_location in images.items():
        with open(image_location, "rb") as fp:
            img = MIMEImage(fp.read())
        img.add_header("Content-ID", "<{}>".format(image_name))
        msg.attach(img)

smtplib.SMTP(host, port).sendmail(self.from_addr, to_addr, msg.as_string())
Run Code Online (Sandbox Code Playgroud)

[这是我的电子邮件包装的一部分,因此“图像”是一个字典等。]

要引用 html 中的图像,请在 src 中使用cid:和名称(与用于将图片附加到电子邮件中的名称相同),例如

<img src="cid:logo"/>
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!这是我找到的唯一可行的解​​决方案。我发现有点奇怪,你使用: `smtplib.SMTP(host, port).sendmail(self.from_addr, to_addr, msg.as_string())` 而不是: `smtplib.SMTP(host, port).send_message(msg )` (2认同)
  • @OrizG,我刚刚检查了文档,似乎“SMTP.send_message”使用“Message”对象。我总是从 MIME 类型构建 html 电子邮件,所以我在学习时发现的任何示例/教程似乎都使用“SMTP.sendmail”,所以我总是使用它。我什至不知道“send_message”是否可以与 MIMEMultipart 一起使用,还是需要更多调整? (2认同)