Имеется код для отправки электронных писем, некоторые строки имеют одно и то же имя человека, которому отправляется электронное письмо, но каждая строка имеет уникальное значение. Я пытаюсь заставить его отправить одно электронное письмо со всеми значениями, где в столбце имени есть повторяющиеся ячейки с тем же именем, но со всеми уникальными значениями в этих строках.
Итак, я попытался создать дублированный фрейм данных, потянув строки с дублирующимися строками, чтобы упростить операторы if else. Поскольку, когда я отправляю электронные письма, они отправляют одни и те же значения в разные электронные письма несколько раз, я пытался сделать так, чтобы каждый раз, когда он отправлял электронное письмо, он отбрасывал строку используемого значения.
В конце кода вместо удаления одной строки из одного значения она сбрасывает каждую строку со значением.
import smtplib
import pandas as pd
import ssl
import xlrd
your_name = "Name Here"
your_email = "Email you using here"
your_password = "password to email here"
cc = input("Email of person you want to cc in email: ")
# for gmail change smtp-mail.outlook.com to smtp.gmail.com, 465
server = smtplib.SMTP_SSL('smtp-mail.outlook.com', 587)
server.ehlo()
server.login(your_email, your_password)
data = [['bob', 'testemail@gmail.com', 'howdy'], ['joe',
'testemail@gmail.com', 'hi'], ['bill', 'testemail@gmail.com', 'hey'],
['bob', 'testemail@gmail.com', 'hola'],['bob', 'testemail@gmail.com',
'hello'], ['josh', 'testemail@gmail.com', 'yo'], ['austin',
'testemail@gmail.com', 'cya']
df = pd.DataFrame(data, columns = ['Pending Action From', 'Email',
'values'])
all_names = email_list['Pending Action From']
all_emails = email_list['Email']
all_values = email_list['values']
# Takes duplicate row based off same name
duplicateRowsDF = email_list[email_list.duplicated(['Pending Action From'])]
duplicateRowsDF.to_excel('DuplicateQARList.xlsx', index=False)
duplicateRowsDF = pd.read_excel('DuplicateQARList.xlsx')
# removes duplicate row based off same name and keeps first same name
email_list.drop_duplicates(subset='Pending Action From', keep="first", inplace=True)
# email_list.to_excel('TestQARList.xlsx')
duplicate_values = duplicateRowsDF['value']
duplicate_names = duplicateRowsDF['Pending Action From']
# Create the email to send
def full_email():
full_email = ("From: {0} <{1}>\n"
"To: {2} <{3}>\n"
"Cc: {4}\n"
"Subject: {5}\n\n"
"{6}"
.format(your_name, your_email, name, email, cc,
subject, message))
# Create the email to send
# In the email field, you can add multiple other emails if you want
# all of them to receive the same text
try:
server.sendmail(your_email, [email], full_email)
print('Email to {} successfully sent!\n\n'.format(email))
except Exception as e:
print('Email to {} could not be sent :( because {}\n\n'.format(email, str(e)))
for idx in range(len(email_list)):
email = all_emails[idx]
name = all_names[idx]
value = all_values[idx]
for i in range(len(duplicateRowsDF)):
duplicate_value = duplicate_values[i]
duplicate_name = duplicate_names[i]
if name == duplicate_name and value != duplicate_value and duplicate_names[i] == duplicate_names[i]:
message = value, duplicate_values[i]
full_email()
email_list = email_list.drop(value)
# Close the smtp server
server.close()
Пример созданных фреймов данных, он берет дубликаты с тем же именем в ожидающем действии из строки и помещает эти строки в другой фрейм данных.
Потребовалось только два, но предполагается, что данные будут взяты из всех значений имен, которые являются дубликатами. Он отправляет одно и то же электронное письмо, поскольку они являются дубликатами одного и того же человека, но он принимает все отдельные значения для этого одного человека.