首页 > 解决方案 > 在电子邮件/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()

标签: python

解决方案


我认为您实际上并没有附加 PDF,只是指向磁盘上文件的指针。这就是为什么当你叫它12345.pdf时它找不到它。同样,您会发现即使使用全名“c:/user/12345.pdf”似乎对您有用,但另一台计算机上的其他人将无法打开它(因为文件不在他们的电脑)。

我不熟悉 smtp 库或 MIMEMultipart 的东西,所以我不能为您提供使其工作的代码 - 我相信您可以查一下。


另外,我建议您避免在文件路径字符串中使用文字反斜杠。用于os.path.join构建路径,它将使用适合您平台的分隔符,无论是 Windows、Linux、OSX 等。这里的主要好处是您将避免意外构建错误的路径,因为 Python 将路径中的某些内容解释为转义(\n, \b, \t, 等)。


推荐阅读