python - 为什么我无法使用 Python3 发送带有 excel 附件的电子邮件
问题描述
我认为问题出在参数中server=...
,我应该在这里放什么?
import smtplib
import os
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email.mime.text import MIMEText
from email.utils import COMMASPACE, formatdate
from email import encoders
def send_mail(send_from, send_to, subject, text, files=[], server=r'\\myserver\User\name\PythonProject\'):
assert type(send_to)==['sendto@.com']
assert type(files)==['File Name.xlsx']
msg = MIMEMultipart()
msg['From'] = "sendfrom@.com"
msg['To'] = COMMASPACE.join(send_to)
msg['Date'] = formatdate(localtime=True)
msg['Subject'] = subject
msg.attach( MIMEText(text) )
for f in files:
part = MIMEBase('application', "octet-stream")
part.set_payload( open(files,"rb").read() )
encoders.encode_base64(part)
part.add_header('Content-Disposition', 'attachment; filename="%s"' % os.path.basename(f))
msg.attach(part)
smtp = smtplib.SMTP('1.1.1.1: 25')
smtp.sendmail(send_from, send_to, msg.as_string())
smtp.close()
解决方案
这段代码有很多问题。
server
函数签名中 的默认值- 字符串以 结尾
\'
,它转义结束引号:删除它或转义它(“r”前缀转义字符串内的反斜杠,但终端反斜杠被解释为转义结束引号,因此在字符串之外) server
未在函数中使用
- 字符串以 结尾
- 使用可变的默认值通常
files=[]
是个坏主意。files=None
在尝试迭代之前更好地使用和检查代码中的值 - 这些
assert
陈述不起作用。- 使用isinstance而不是
type
检查对象类型
- 使用isinstance而不是
part.set_payload( open(files,"rb").read() )
正在尝试打开文件列表,它只需要在循环中打开当前文件:open(f, ...)
这是代码的“固定”版本
def send_mail(
send_from,
send_to,
subject,
text,
files=None,
server=r"\\myserver\User\name\PythonProject\\",
):
assert isinstance(send_to, list)
assert isinstance(files, list)
msg = MIMEMultipart()
msg["From"] = "sendfrom@.com"
msg["To"] = COMMASPACE.join(send_to)
msg["Date"] = formatdate(localtime=True)
msg["Subject"] = subject
msg.attach(MIMEText(text))
if files is not None:
for f in files:
part = MIMEBase("application", "octet-stream")
part.set_payload(open(f, "rb").read())
encoders.encode_base64(part)
part.add_header(
"Content-Disposition", 'attachment; filename="%s"' % os.path.basename(f)
)
msg.attach(part)
smtp = smtplib.SMTP('1.1.1.1:25')
smtp.sendmail(send_from, send_to, msg.as_string())
smtp.close()
推荐阅读
- azure-devops - Azure Devops 管道 pytest 收集失败 ModuleNotFoundError: No module named
- security - 与 WASM 相关的安全风险是什么?
- mysql - 获取所有常规数据,并检索隐私数据(如果具有值的列与所需参数匹配,则适用)在 MySQL 中
- html - 活动类不会更改为引导程序中导航栏的项目
- oracle - 执行视图时出错:函数计数在 denodo 中不可执行
- encryption - 离线播放 ExoPlayer 中的 AES 加密视频
- javascript - OnScroll 折叠视图 - React Native
- r - 如何使用 depmixS4 进行分类?
- python - Python - 套接字 CAN 连接
- c++ - 文件包含在 C++/C 中