Question

I am looking for a quick example on how to send Gmail emails with multiple CC:'s. Could anyone suggest an example snippet?

Was it helpful?

Solution

I've rustled up a bit of code for you that shows how to connect to an SMTP server, construct an email (with a couple of addresses in the Cc field), and send it. Hopefully the liberal application of comments will make it easy to understand.

from smtplib import SMTP_SSL
from email.mime.text import MIMEText

## The SMTP server details

smtp_server = "smtp.gmail.com"
smtp_port = 587
smtp_username = "username"
smtp_password = "password"

## The email details

from_address = "address1@domain.com"
to_address = "address2@domain.com"

cc_addresses = ["address3@domain.com", "address4@domain.com"]

msg_subject = "This is the subject of the email"

msg_body = """
This is some text for the email body.
"""

## Now we make the email

msg = MIMEText(msg_body) # Create a Message object with the body text

# Now add the headers
msg['Subject'] = msg_subject
msg['From'] = from_address
msg['To'] = to_address
msg['Cc'] = ', '.join(cc_addresses) # Comma separate multiple addresses

## Now we can connect to the server and send the email

s = SMTP_SSL(smtp_server, smtp_port) # Set up the connection to the SMTP server
try:
    s.set_debuglevel(True) # It's nice to see what's going on

    s.ehlo() # identify ourselves, prompting server for supported features

    # If we can encrypt this session, do it
    if s.has_extn('STARTTLS'):
        s.starttls()
        s.ehlo() # re-identify ourselves over TLS connection

    s.login(smtp_username, smtp_password) # Login

    # Send the email. Note we have to give sendmail() the message as a string
    # rather than a message object, so we need to do msg.as_string()
    s.sendmail(from_address, to_address, msg.as_string())

finally:
    s.quit() # Close the connection

Here's the code above on pastie.org for easier reading

Regarding the specific question of multiple Cc addresses, as you can see in the code above, you need to use a comma separated string of email addresses, rather than a list.

If you want names as well as addresses you might as well use the email.utils.formataddr() function to help get them into the right format:

>>> from email.utils import formataddr
>>> addresses = [("John Doe", "john@domain.com"), ("Jane Doe", "jane@domain.com")]
>>> ', '.join([formataddr(address) for address in addresses])
'John Doe <john@domain.com>, Jane Doe <jane@domain.com>'

Hope this helps, let me know if you have any problems.

OTHER TIPS

If you can use a library, I highly suggest http://libgmail.sourceforge.net/, I have used briefly in the past, and it is very easy to use. You must enable IMAP/POP3 in your gmail account in order to use this.

As for a code snippet (I haven't had a chance to try this, I will edit this if I can):

import smtplib
from email.MIMEMultipart import MIMEMultipart
from email.MIMEBase import MIMEBase
from email.MIMEText import MIMEText
from email import Encoders
import os

#EDIT THE NEXT TWO LINES
gmail_user = "your_email@gmail.com"
gmail_pwd = "your_password"

def mail(to, subject, text, attach, cc):
   msg = MIMEMultipart()

   msg['From'] = gmail_user
   msg['To'] = to
   msg['Subject'] = subject

   #THIS IS WHERE YOU PUT IN THE CC EMAILS
   msg['Cc'] = cc
   msg.attach(MIMEText(text))

   part = MIMEBase('application', 'octet-stream')
   part.set_payload(open(attach, 'rb').read())
   Encoders.encode_base64(part)
   part.add_header('Content-Disposition',
           'attachment; filename="%s"' % os.path.basename(attach))
   msg.attach(part)

   mailServer = smtplib.SMTP("smtp.gmail.com", 587)
   mailServer.ehlo()
   mailServer.starttls()
   mailServer.ehlo()
   mailServer.login(gmail_user, gmail_pwd)
   mailServer.sendmail(gmail_user, to, msg.as_string())
   # Should be mailServer.quit(), but that crashes...
   mailServer.close()

mail("some.person@some.address.com",
   "Hello from python!",
   "This is a email sent with python")

For the snippet I modified this

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top