【问题标题】:Email sender python bot which can send Emails to multiple recipient with their names in message电子邮件发件人 python bot,可以将电子邮件发送给多个收件人,并在消息中显示他们的姓名
【发布时间】:2021-02-04 01:10:09
【问题描述】:

我有一个 csv 文件,其中一列是名称,另一列是电子邮件。我必须将电子邮件发送给 csv 中列出的所有成员,他们的名字来自消息中的名称列。还有一些名字没有电子邮件,所以我想忽略那个名字。 This is how my csv file looks like

所以,我尝试了这段代码。它单独向每个成员发送电子邮件,但向每个电子邮件地址发送相同的名称,即最后一个。

谁能帮我解决这个问题...?

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import csv
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email import *
from itertools import islice

df=pd.read_csv("emails.csv")
df.isnull()
df.isnull().sum()
df['email'].fillna("NO Email",inplace=True)

X=df.iloc[:,2].values
y=df.iloc[:,0].values


FROM= "mail@gmail.com"
TO=X
password=input("enter password:")
message= MIMEMultipart()
message['From'] = FROM
message['Subject'] = "subject line"
server = smtplib.SMTP('smtp.gmail.com', 587)
server.starttls()
server.login(FROM,password)
for j in TO:
    if(j=="NO Email"):
        #i_iter=iter(i)
        print("No email found ")#+ next(islice(i_iter,1)))
        for i in y:
            #next(i_iter)
            print("Name skip")
         continue
     else:
        i=0
        for i in range(len(y)):
            message = MIMEText("""hii..........{}""".format(y[i]))
            #i+=1
        print("Login success")
        server.sendmail(FROM,j,message.as_string())
        print("email has been send to ",j)

【问题讨论】:

    标签: python pandas csv email smtp


    【解决方案1】:

    您正在替换循环内的原始 message,因此您最终传递给 server.sendmail 的不是有效的电子邮件。

    可能会尝试类似的东西

    from email.message import EmailMessage
    import smtplib
    import logging
    
    FROM = "mail@gmail.com"
    
    with smtplib.SMTP('smtp.gmail.com', 587) as server:
        server.starttls()
        server.login(FROM, password)
        logging.info("Login success")
    
        for address, recipient in zip(X, y):
            if address == "NO Email":
                logging.warning("No email found: %s", recipient)
                continue
    
            message = EmailMessage()
            message['From'] = FROM
            message['Subject'] = "subject line"
            message.set_content("""hii..........{}""".format(recipient))
    
            server.send_message(message)
            logging.info("email has been sent to %s", recipient)
    

    请注意我们如何使用zip() 来对齐两列,并将随机email 函数的相当随意的组合替换为https://docs.python.org/3/library/email.examples.html 中的第一个示例,并且更切线地使用logging 而不是@ 987654329@ 用于诊断消息。

    【讨论】:

    • 认为 Gmail 将要求您执行ehlo -- 两次!在 STARTTLS 之前一次,然后在之后。
    • 它给出了错误SMTPServerDisconnected: please run connect() first 如果我在 if 条件之外写了 continue 它运行但只向一个人发送电子邮件。你能告诉我如何解决这个问题。
    • 显然不要将continue 放在条件之外。您可以为smtplib 启用详细调试并链接到结果记录的粘贴吗?
    • 你能详细告诉我如何启用它吗?
    猜你喜欢
    • 2019-06-17
    • 1970-01-01
    • 2016-08-21
    • 2023-03-17
    • 2015-08-29
    • 2018-11-19
    • 1970-01-01
    • 2012-05-18
    相关资源
    最近更新 更多