繁体   English   中英

如何使用Python通过电子邮件将唯一附件发送给多个唯一收件人?

[英]How to email unique attachments to multiple unique recipients using Python?

我正在编写自动化Python脚本。 我的目的是通过电子邮件将多个唯一的附件发送给多个唯一的收件人。 例如,我有1000条唯一的语句,必须将这些语句通过电子邮件发送给1000个唯一的客户端。 我希望我的Python脚本能够自动选择附件并将其发送给正确的收件人!

我创建了脚本,并创建了pdf附件,并以收件人的每个电子邮件地址为它们命名,以便我可以使用名称来选择附件并将其与收件人的电子邮件进行匹配。 它完美地选择附件,但是在每次迭代中它使用户附件不断增加的问题。

 #1.READING FILE NAMES WHICH ARE EMAIL ADDRESS FOR RECEPIENTS
 import os, fnmatch
 filePath = "C:/Users/DAdmin/Pictures/"

def readFiles(path):

fileNames =fnmatch.filter(os.listdir(path), '*.pdf')
i=0
pdfFilesNamesOnly=[]
while i < len(fileNames):
    s =fileNames[i]
    removeThePdfExtension= s[0:-4]
    pdfFilesNamesOnly.append(removeThePdfExtension)
    i+=1

return pdfFilesNamesOnly
-----------------------------------------------------------
#2.SENDING AN EMAIL WITH UNIQUE ATTACHMENT TO MULTIPLE UNIQUE RECEPIENTS 

import smtplib
import mimetypes
from optparse import OptionParser
from email.mime.multipart import MIMEMultipart
from email import encoders
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email.mime.application import MIMEApplication
import os,fnmatch
from readFileNames import readFiles

filePath = "C:/Users/DAdmin/Pictures/"

listOfEmails= readFiles(filePath)# Files are named after emails 

def sendEmails(listOfFiNames): #sends the email

    email = 'goddietshe@gmail.com' # Your email
    password = '#####' # Your email account password

    send_to_list = listOfEmails# From the file names

#creating a multipart object
    subject ="MONTHLY STATEMENTS"
    mg = MIMEMultipart('alternative')
    mg['From'] = email
    mg['To'] = ",".join(send_to_list)
    mg['Subject'] = subject
    mg.attach(MIMEText("Please receive your monthly statement",'plain'))

   # Attaching a file now before emailing. (Where l have a problem)

    for i in listOfEmails:
       if i in send_to_list: 
            newFile = (i+'.pdf') # create the name of   the attachment to email using the name(which is the email) and will be used to pick the attachment

            with open(newFile,'rb') as attachment:
                part = MIMEBase('application','x- pdf')
                part.set_payload(attachment.read())
                attachment.close()
            encoders.encode_base64(part)
            part.add_header('Content- Disposition','attachment; filename="%s"' % newFile )

            mg.attach(part)
            text =mg.as_string() # converting the  message obj to a string/text obj

            server = smtplib.SMTP('smtp.gmail.com', 587)        # Connect to the server
            server.starttls() # Use TLS

            server.login(email, password) # Login to the email server

            # this is where it is emailing stuff
            server.sendmail(email, i , text) # Send the email
            server.quit() # Logout of the email server
            print("The mail was sent")


    #print("Failed ")

sendEmails(listOfFiNames)

我希望它通过电子邮件将每个唯一的附件自动发送给每个唯一的收件人(收件人为1000)

您仅使用attach重复使用mg (消息),因此附件堆积如山。 您需要使用set_payload用新内容替换以前的全部内容,因为没有“删除”方法。

为此,您必须记住要重新添加在循环之前设置的文本:

mg.attach(MIMEText("Please receive your monthly statement",'plain'))
for i in listOfEmails:

因为使用set_payload会丢失之前连接的所有零件。 我只是将其保存为变量,然后将其添加到循环中。

此外:

mg['To'] = ",".join(send_to_list)

此行使所有消息发送给所有人。 您还需要将该部分移到循环中,一次只设置一个电子邮件地址。


编辑应用这些更改:

def sendEmails(): #sends the email

    email = 'goddietshe@gmail.com' # Your email
    password = '#####' # Your email account password

    #creating a multipart object
    subject ="MONTHLY STATEMENTS"
    mg = MIMEMultipart('alternative')
    mg['From'] = email
    # mg['To'] = ",".join(listOfEmails) # NO!
    mg['Subject'] = subject

    text_content = MIMEText("Please receive your monthly statement",'plain')) #safe it for later, rather than attach it - we'll have to re-attach it every loop run

    for i in listOfEmails:
       if i in send_to_list: 
            newFile = (i+'.pdf') # create the name of   the attachment to email using the name(which is the email) and will be used to pick the attachment

            with open(newFile,'rb') as attachment:
                part = MIMEBase('application','x- pdf')
                part.set_payload(attachment.read())
                attachment.close()
            encoders.encode_base64(part)
            part.add_header('Content- Disposition','attachment; filename="%s"' % newFile )

            mg.set_payload(text_content) #change the whole content into text only (==remove previous attachment)
            mg.attach(part) #keep this - new attachment
            mg["To"] = i # send the email to the current recipient only!
            text =mg.as_string() # converting the  message obj to a string/text obj

            server = smtplib.SMTP('smtp.gmail.com', 587)        # Connect to the server
            server.starttls() # Use TLS

            server.login(email, password) # Login to the email server

            # this is where it is emailing stuff
            server.sendmail(email, i , text) # Send the email
            server.quit() # Logout of the email server
            print("The mail was sent")

 **Works very fine like this. Thanks @h4z3**

 def sendEmail():
    email = 'goddietshetu@gmail.com' # Your email
    password = '####' # Your email account password
    subject ="MONTHLY STATEMENTS"

    #creating a multipart object
    mg = MIMEMultipart('alternative')
    mg['From'] = email
    mg['Subject'] = subject

    # attaching a file now


    listOfEmails = readFileNames(filePath)
for i in listOfEmails:
    attachment  =open(i+'.pdf','rb')

    part = MIMEBase('application','octet-stream')
    part.set_payload(attachment.read())
    encoders.encode_base64(part)
    part.add_header('Content-Disposition',f"attachment; filename=  {i}.pdf")

    mg.set_payload(mg.attach(MIMEText("",'plain')))
    mg.attach(MIMEText("Please receive your monthly statement",'plain'))
    mg.attach(part)
    mg['To'] = i


    text =mg.as_string() # converting the message obj to a string/text obj

    server = smtplib.SMTP('smtp.gmail.com', 587) # Connect to the server
    server.starttls() # Use TLS
    server.login(email, password) # Login to the email server
    server.sendmail(email, i , text) # Send the email
server.quit() # Logout of the email serv
print("The mail was sent")
sendEmail()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM