【问题标题】:How to automatically send personalized emails with a pdf attachment in Python?如何在 Python 中自动发送带有 pdf 附件的个性化电子邮件?
【发布时间】:2021-11-03 01:26:43
【问题描述】:

我是一名初级程序员,我正在尝试编写一个程序,该程序会自动将个性化电子邮件发送到带有 pdf 附件的 csv 文件中的接收者列表。

我当前的代码发送个性化电子邮件,但我不知道如何添加附件。另外,我认为在函数中编写程序是最佳实践,但我也不知道该怎么做。

如果有人可以帮助我,将不胜感激。另外,我想让它尽可能简单,以便我仍然了解每一行代码的作用。

import os
import smtplib, ssl
import csv 

# Sender credentials (from environment variables)
email_address = os.environ.get("email_user")
email_pass = os.environ.get("email_app_pass")


context = ssl.create_default_context()
with smtplib.SMTP_SSL("smtp.gmail.com", 465, context=context) as server: 
    server.login(email_address, email_pass) # Log into sender email account

    # Email information
    subject = "Testing Python Automation"
    body = """ Hi {name},\n\n This email was entirely generated in Python. So cool!
    """
    msg = f"Subject: {subject}\n\n{body}"

    with open("contacts_test.csv") as file:
        reader = csv.reader(file)
        next(reader) # Skip header row
        for name, email in reader:
            server.sendmail(email_address, email, msg.format(name=name))

    file.close()

server.quit()

【问题讨论】:

标签: python python-3.x email


【解决方案1】:

这仅适用于使用 gmail 并确保您已手动设置 对您的 gmail 帐户具有特殊权限,以便程序能够代表您发送电子邮件。该过程描述为here

您可以使用其他电子邮件地址服务,您需要相应地更改第 32 行中的 smtp 服务器地址和 smtp 端口号,并处理所需的任何其他额外步骤。

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders
body = """
Hi {name},\n\n This email was entirely generated in Python. So cool!
""".format(name="Name")

# details
sender = 'example1@gmail.com'  # my email
password = '&*password.$'  # my email's password
receiver = 'example2@gmail.com'  # receiver's email

msg = MIMEMultipart()
msg['To'] = receiver
msg['From'] = sender
msg['Subject'] = 'Testing Python Automation'
msg.attach(MIMEText(body, 'plain'))


pdfname = "mypdf.pdf"  # pdf file name
binary_pdf = open(pdfname, 'rb')
payload = MIMEBase('application', 'octate-stream', Name=pdfname)
payload.set_payload((binary_pdf).read())
encoders.encode_base64(payload)
payload.add_header('Content-Decomposition', 'attachment', filename=pdfname)
msg.attach(payload)

session = smtplib.SMTP('smtp.gmail.com', 587)
session.starttls()
session.login(sender, password)
text = msg.as_string()
session.sendmail(sender, receiver, text)
session.quit()
print('[#] Mail Sent!')

【讨论】:

  • 感谢您的代码示例!但是,这似乎不会向 csv 文件中的所有收件人发送电子邮件,对吧?
  • 它应该可以邮寄任何地址,只要它是一个有效的地址
猜你喜欢
  • 2011-10-09
  • 1970-01-01
  • 2012-08-08
  • 2021-09-14
  • 2014-05-12
  • 1970-01-01
  • 2020-11-20
  • 2014-02-28
  • 1970-01-01
相关资源
最近更新 更多