nothingwnw 发表于 2023-7-17 21:23:28

smtplib发送邮件

m_text = MIMEText(text, 'html', 'utf-8')这里html改成plain,正文就没法显示图片,html的话,附件的xlsx文件打开内容就是乱码。
求助,怎么让正文显示图片,附件xlsx也正常显示。


import smtplib
from pathlib import Path
from email.mime.application import MIMEApplication
from email.mime.base import MIMEBase
from email import encoders
from email.mime.image import MIMEImage
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header

# 1.发送人账号
sendAddress = '****@***.****.com'
# 2.发送人授权码
password = '****'
#(乱写的 要去QQ邮箱找自己的哦)

# 1定义一个可以添加正文和附件的邮件消息对象
msg = MIMEMultipart()
#
To = ['13973519903@139.com']
# Cc = ['13975789908@139.com', '13787775557@139.com']
Cc = []
reciver = To + Cc

msg['From'] = sendAddress
msg['To'] = ','.join(To)
msg['Cc'] = ','.join(Cc)
msg['subject'] = '邮件标题'

text = f"""邮件正文
<img src="cid:0">
"""
# html文本引入id为0的图片

m_text = MIMEText(text, 'html', 'utf-8')
#这里html改成plain,正文就没法显示图片,html的话,附件的xlsx文件打开内容就是乱码

msg.attach(m_text)


# 邮件加入图片
m_img = MIMEBase('image', 'jpg')
m_img.add_header('Content-Disposition', 'attachment')
m_img.add_header('Content-ID', '<0>')   # 设置图片id为0
f = open(r"C:\Users\Nothing\Downloads\2023年07月17日精品企宽重复投诉率日通报.png", "rb")   # 读取本地图片
m_img.set_payload(f.read())
encoders.encode_base64(m_img)
msg.attach(m_img)

# 添加excel附件

# xlsx = MIMEApplication(open(r"C:\Users\Nothing\Downloads\2023年07月17日精品企宽重复投诉率日通报.xlsx", 'rb').read())# 打开Excel,读取Excel文件
xlsx = MIMEText(open(r"C:\Users\Nothing\Downloads\2023年07月17日精品企宽重复投诉率日通报.xlsx", 'rb').read(), 'base64', 'utf-8')
# xlsx["Content-Type"] = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'       # 设置内容类型
xlsx["Content-Type"] = 'application/octet-stream'
# xlsx['Content-Disposition'] = 'attachment;filename="2023年07月17日精品企宽重复投诉率日通报.xlsx"'
xlsx.add_header('Content-Disposition', 'attachment', filename="2023年07月17日精品企宽重复投诉率日通报.xlsx")
# encoders.encode_base64(xlsx)
msg.attach(xlsx)

# 3.连通服务器
# 465端口就是
server = smtplib.SMTP_SSL('****.*****.com', 465)
print(server)
# 4.登录
loginResult = server.login(sendAddress, password)
print(loginResult)
# (235, b'Authentication successful') 这样子的代表你登陆成功了
# 235响应成功状态码

# 发送邮件

try:
    server.sendmail(sendAddress, reciver, msg.as_string())
    print("发送成功")
    email = '成功了'
    server.quit()
except:
    print("发送失败")
    email = ''
    server.quit()



陶远航 发表于 2023-7-17 21:23:57

在使用 smtplib 发送邮件时,可以通过嵌入图片作为正文的方式来显示图片,同时保证附件的正常显示。以下是修改后的代码示例:

import smtplib
from pathlib import Path
from email.mime.application import MIMEApplication
from email.mime.base import MIMEBase
from email import encoders
from email.mime.image import MIMEImage
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header

# 1. 发送人账号
sendAddress = '****@***.****.com'
# 2. 发送人授权码
password = '****'# (请替换为自己的授权码)

# 收件人列表
To = ['13973519903@139.com']
Cc = []
reciver = To + Cc

# 创建邮件消息对象
msg = MIMEMultipart()
msg['From'] = sendAddress
msg['To'] = ','.join(To)
msg['Cc'] = ','.join(Cc)
msg['Subject'] = '邮件标题'

# 添加邮件正文
text = """
<html>
<body>
<p>邮件正文</p>
<img src="cid:0">
</body>
</html>
"""
m_text = MIMEText(text, 'html', 'utf-8')
msg.attach(m_text)

# 添加图片附件
with open(r"C:\Users\Nothing\Downloads\2023年07月17日精品企宽重复投诉率日通报.png", "rb") as f:
    m_img = MIMEImage(f.read())
    m_img.add_header('Content-ID', '<0>')# 设置图片id为0
    msg.attach(m_img)

# 添加Excel附件
xlsx_path = r"C:\Users\Nothing\Downloads\2023年07月17日精品企宽重复投诉率日通报.xlsx"
xlsx = MIMEApplication(open(xlsx_path, 'rb').read())
xlsx.add_header('Content-Disposition', 'attachment', filename=Path(xlsx_path).name)
msg.attach(xlsx)

# 连接邮件服务器并发送邮件
try:
    server = smtplib.SMTP_SSL('****.*****.com', 465)# 这里请替换为邮件服务器的地址
    loginResult = server.login(sendAddress, password)
    print(loginResult)# (235, b'Authentication successful')
    server.sendmail(sendAddress, reciver, msg.as_string())
    server.quit()
    print("发送成功")
except Exception as e:
    print("发送失败:", e)


请注意替换 sendAddress、password 和邮件服务器地址为你自己的信息,并确保图片和附件文件的路径正确。同时,邮件正文中的图片引用时,使用了 cid:0,需要根据实际情况进行调整。

如果还有其他问题,请随时提问。

isdkz 发表于 2023-7-17 21:24:00

在您的问题中,出现了当您尝试在邮件正文中插入图片并附带Excel文件作为附件时,图片可以正常显示,但是Excel文件会显示为乱码的问题。

根据您提供的代码,我发现您在添加Excel文件作为附件的方法存在问题。您应该使用 MIMEApplication 而不是 MIMEText 来处理Excel文件。您应该使用下面的代码来创建并附加Excel文件:

xlsx_path = r"C:\Users\Nothing\Downloads\2023年07月17日精品企宽重复投诉率日通报.xlsx"
with open(xlsx_path, "rb") as f:
    xlsx = MIMEApplication(f.read())
    # 添加邮件头信息
    xlsx.add_header('Content-Disposition', 'attachment', filename="2023年07月17日精品企宽重复投诉率日通报.xlsx")
    msg.attach(xlsx)


在上述代码中, MIMEApplication 类是用于处理不同类型的文件(例如PDF,Excel,Word等)的,而 MIMEText 主要是用于处理文本内容,例如邮件的正文。当你用 MIMEText 来读取和编码Excel文件时,这个Excel文件就会变成一个文本文件,这就是为什么你看到的Excel文件内容是乱码的原因。

总的来说,你应该使用正确的MIME类型来处理你的邮件内容和附件, MIMEText 用于处理文本内容, MIMEImage 用于处理图片,而 MIMEApplication 用于处理其他类型的文件,例如PDF,Excel等。

nothingwnw 发表于 2023-7-17 21:27:29

isdkz 发表于 2023-7-17 21:24
在您的问题中,出现了当您尝试在邮件正文中插入图片并附带Excel文件作为附件时,图片可以正常显示,但是Exc ...

我用MIMEApplication试过,也不行。
我代码里面有对应的语句,只不过被我注释掉了,换成MIMEText,效果是一样的

nothingwnw 发表于 2023-7-17 21:31:27

陶远航 发表于 2023-7-17 21:23
在使用 smtplib 发送邮件时,可以通过嵌入图片作为正文的方式来显示图片,同时保证附件的正常显示。以下是 ...

测试了,成功了,谢谢!!!

isdkz 发表于 2023-7-17 21:36:05

nothingwnw 发表于 2023-7-17 21:27
我用MIMEApplication试过,也不行。
我代码里面有对应的语句,只不过被我注释掉了,换成MIMEText,效果 ...

是因为你用Application的时候没用 add_header 吧
页: [1]
查看完整版本: smtplib发送邮件