Search code examples
pythonsmtpgmailbcc

Bcc Field in SMTP [ showing/not showing ] problem


I'm trying to use python's smtplib to send, via gmail, an email with bcc addresses. I use this code:

#imports etc...
fromAddr = [email protected]
to = [ [email protected] ]
cc = [ [email protected] ]
bcc = [ [email protected], [email protected] ]
server = SMTP( "smtp.gmail.com", 587)
#starttls, login, etc..
content = "Hello, this is a message."
msg = "From: %s\r\nTo:%s\r\nCc: %s\r\n\r\n%s" % ( from, to, cc, content )
server.sendmail( fromAddr, to + cc + bcc, msg )
#server.quit() etc...

-> When I go to the respective Inboxs I get the same message for all the addresses in [to+cc+bcc], wich is right. But

what i would like to happen was that each bcc address got a bcc field with its own address in it, just like is described in here for the web interface of gmail.

This is what I wish to accomplish:

Cc and To Inboxes:

To: [email protected]
From: [email protected]
Cc: [email protected]
(...)

recpt3 Inbox:

To: [email protected]
From: [email protected]
Cc: [email protected]
Bcc: [email protected]
(...)

recpt4 Inbox:

To: [email protected]
From: [email protected]
Cc: [email protected]
Bcc: [email protected]
(...)

Has anyone managed to get this working? I've been looking in the smtp rfc documents and I've found nothing, I dont understand how gmail can do it


Solution

  • My guess would be that gmail does a separate SMTP session for each BCC recipient. If everything between your two comments were a function dosend(fromAddr, toAddr, content, to, cc, bcc=None) you might do something like this:

    dosend(fromAddr, to+cc, content, to, cc)
    for t in bcc:
        dosend(fromAddr, t, content, to, cc, t)
    

    That would send it once to the to and cc address(es), then send it again to each bcc address individually, with the appropriate bcc header. Just to clarify what dosend does: the fromAddr and toAddr arguments are for the envelope (the first and second arguments to server.sendmail). The to, cc, and (optional) bcc arguments are for the headers in msg. (Your code doesn't add a Bcc, you would need to add that if the optional argument bcc is provided.)

    (Edit: I deleted my comments about the possibility it might use X-Bcc. I just tried it, and it works as described above. I also fixed up and clarified the description of dosend.)