使用Python和Gmail在同一线程中发送多封邮件

4 投票
2 回答
4981 浏览
提问于 2025-04-17 20:36

我有一个正在运行的程序。当这个程序得到结果时,它会用这个函数给我发邮件:

def send_email(message):

    import smtplib

    gmail_user = OMITTED
    gmail_pwd = OMITTED
    FROM = OMITTED
    TO = OMITTED #must be a list

    try:
        #server = smtplib.SMTP(SERVER) 
        server = smtplib.SMTP("smtp.gmail.com", 587) #or port 465 doesn't seem to work!
        server.ehlo()
        server.starttls()
        server.login(gmail_user, gmail_pwd)
        server.sendmail(FROM, TO, message)
        #server.quit()
        server.close()
        print 'successfully sent the mail'
    except:
        print "failed to send mail"  

说明:这个代码是我在Stack Overflow上找到的,不是我写的。我把一些看起来没什么特别意义的部分删掉了。

有时候我的代码会得到很多结果,这样我在不到20秒的时间里就会收到150封以上的不同邮件。

我该如何修改上面的函数,让程序把所有结果都发到同一个邮件线程里呢?

如果你不太明白我的意思,我希望我的邮箱看起来像这样:

sender@gmail.com(150) ...  
... (other emails from other senders)  

而不是:

sender@gmail.com ...  
sender@gmail.com ...  
sender@gmail.com ...  
sender@gmail.com ...  
sender@gmail.com ...  
...  
sender@gmail.com ...  
... (other emails from other senders)

编辑

为了解决这个问题,我只需要把之前删掉的代码部分重新加回来。完整的函数是这个:

def send_email(TEXT):

    import smtplib

    gmail_user = OMITTED
    gmail_pwd = OMITTED
    FROM = OMITTED
    TO = OMITTED #must be a list
    SUBJECT = "Big brother candidate"
    #TEXT = "Testing sending mail using gmail servers"

    # Prepare actual message
    message = """\From: %s\nTo: %s\nSubject: %s\n\n%s
    """ % (FROM, ", ".join(TO), SUBJECT, TEXT)

    try:
        #server = smtplib.SMTP(SERVER) 
        server = smtplib.SMTP("smtp.gmail.com", 587) #or port 465 doesn't seem to work!
        server.ehlo()
        server.starttls()
        server.login(gmail_user, gmail_pwd)
        server.sendmail(FROM, TO, message)
        #server.quit()
        server.close()
        print 'successfully sent the mail'
    except:
        print "failed to send mail"  

2 个回答

9

这个问题虽然很老,但我觉得有必要回答一下,因为其实有办法可以实现提问者想要的效果。你可以通过给你的邮件添加一些头部信息来做到这一点,然后在发送另一封邮件时引用这些信息。例如:

from email.utils import make_msgid

my_id = make_msgid()

#Build your email as you normally do, and add ID as a message header
message = MIMEMultipart()
message["Message-ID"]  = my_id 
message["Subject"] = "test"
message["From"] = from_email 
# ...etc and send your email using smtp.sendmail

# On the reply (or when sending another email), add the following headers
message["In-Reply-To"] = my_id
message["References"] = my_id

# ...send your email using smtp.sendmail

当你查看你的邮件客户端时,你会发现后面的邮件会被标记为对前一封邮件的回复,这样就形成了你在常用的邮件客户端(比如Gmail、Inbox、Outlook、Yahoo等)中通常看到的邮件线程。

1

这看起来不是在问如何发送邮件,而是如何整理邮件,以便GMail能够正确地将它们归类在一起。

可以查看这个页面,了解邮件归类是怎么回事。简单来说,你需要在后续的邮件主题开头加上“Re: ”。因为你没有展示生成邮件的代码,所以我无法告诉你该怎么做。

撰写回答