python - 在电子邮件/SMTP 脚本中重命名 PDF 文件时遇到问题
问题描述
我找到了一个脚本,可以将 PDF 文件附加到电子邮件中。但是,附加的 PDF 的完整路径名是“C:\User\12345.pdf”。我希望文件名只有“12345.pdf”,所以我使用了 os.path.basename。现在,每次我在电子邮件中打开 PDF 时,都会收到错误消息“Adobe 无法打开 '12345.pdf',因为它不是受支持的文件类型或文件已损坏。我的代码如下。
addr_to = 'test@test.com'
addr_from = 'test@test.com'
# Define SMTP email server details
smtp_server = 'test.com'
port = '25'
attachmentfilename = os.path.basename('C:\User\' + filename)
# Construct email
msg = MIMEMultipart('alternative')
msg['To'] = addr_to
msg['From'] = addr_from
msg['Subject'] = 'Subject HERE'
# Create the body of the message (a plain-text and an HTML version).
text = "This is a test message.\nText and html."
print(text)
html = "This is a test message.\nText and html."
f"""
<b>{master_name}</b>
<br /><br />
Test TEXT<br/><br/><br/>
Thank You,<br/>
Test Deptt<br/>
"""
# Record the MIME types of both parts - text/plain and text/html.
part1 = MIMEText(text, 'plain')
part2 = MIMEText(html, 'html')
part = MIMEBase('application', "octet-stream")
part.add_header('Content-Disposition',
'attachment; filename="{}"'.format(attachmentfilename))
msg.attach(part)
# Attach parts into message container.
# According to RFC 2046, the last part of a multipart message, in this case
# the HTML message, is best and preferred.
msg.attach(part1)
msg.attach(part2)
# Send the message via an SMTP server
s = smtplib.SMTP(smtp_server, port)
s.sendmail(addr_from, addr_to, msg.as_string())
s.quit()
解决方案
我认为您实际上并没有附加 PDF,只是指向磁盘上文件的指针。这就是为什么当你叫它12345.pdf时它找不到它。同样,您会发现即使使用全名“c:/user/12345.pdf”似乎对您有用,但另一台计算机上的其他人将无法打开它(因为文件不在他们的电脑)。
我不熟悉 smtp 库或 MIMEMultipart 的东西,所以我不能为您提供使其工作的代码 - 我相信您可以查一下。
另外,我建议您避免在文件路径字符串中使用文字反斜杠。用于os.path.join
构建路径,它将使用适合您平台的分隔符,无论是 Windows、Linux、OSX 等。这里的主要好处是您将避免意外构建错误的路径,因为 Python 将路径中的某些内容解释为转义(\n
, \b
, \t
, 等)。
推荐阅读
- html - CSS:如何将最后一个元素向左对齐
- dart - 映射不可变列表
- arrays - 如何将二维数组中的每个数组转换为打字稿中的字符串?
- node.js - 获取 TypeError:无法读取属性
未定义的 - java - 如何使用来自 InterruptableJob 接口的覆盖中断方法终止当前正在运行的石英作业?
- drools - Drools - 如何在 THEN 子句中访问对象
- python - 如何获取当前位置(纬度、经度)。不使用获取IP?
- angular - 无法匹配任何路由。URL段:'服务器/基本
- javascript - 通过函数映射列表,单击时给我错误:“无法读取未定义的属性'值'”
- unity3d - Unity 触发器检测玩家是否完全脱离对撞机