Search code examples
pythonemailsmtpmail-server

Sending email via Python and Google SMTP server


My email is: sarahconnor@gmail.com

I would like to send an email from johnconnor@skynet.com to mine.

I don't want to login remotely to my gmail account to send an email.

This is what I need:

I'm Sarah Connor, and I want to receive in my mailbox ( sarahconnor@gmail.com ), an e-mail from johnconnor@skynet.com ...

So I've use this script to do so:

import requests
import smtplib

from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart

COMMASPACE = ', '

msg = MIMEMultipart()
msg['Subject'] = 'Our family reunion'
fromm = "johnconnor@skynet.com"
to = "sarahconnor@gmail.com"
msg['From'] = fromm
msg['To'] = COMMASPACE.join(to)
msg.preamble = 'Our family reunion'

requests.get("http://smtp.gmail.com", verify=False)
s = smtplib.SMTP_SSL("smtp.gmail.com", 587)
s.starttls()
s.login('sarahconnor@gmail.com', 'mypassword12345') #here I login to the SMTP server from Google to be able to send emails...
s.sendmail(fromm, to, msg.as_string())
s.close()

I have the following error:

raise ConnectionError(err, request=request)
requests.exceptions.ConnectionError: ('Connection aborted.', error(10054, 'An existing connection was forcibly closed by the remote host'))

And as seen from here, it doesn't seem that I'm having any of that issues.

Does anyone knows how can I fix this?

Thanks


Solution

  • this sends a mail from a gmail account to any other account

    import smtplib
    from email.mime.text import MIMEText
    
    
    class GmailHandler():
        """
        IMPORTANT NOTE:
        in order to access a gmail account with this handler,
        your account needs 'foreign-access' enabled (follow these steps):
        login to the account
        go here--> https://accounts.google.com/b/0/DisplayUnlockCaptcha
        press 'Continue'
        Done.
        """
    
        def __init__(self, gmail, password):
            self.gmail = gmail
            self.password = password
    
        def send_mail(self, receivers, subject, text):
    
            if not isinstance(receivers, list):
                receivers = [receivers]
    
            # Send the message via our own SMTP server, but don't include the envelope header
            smtp = smtplib.SMTP("smtp.gmail.com", 587)
            smtp.ehlo()
            smtp.starttls()
            smtp.ehlo()
            smtp.login(self.gmail, self.password)
    
            for receiver in receivers:
    
                msg = MIMEText(text)
                msg['Subject'] = subject
                msg['From'] = self.gmail
                msg['To'] = receiver
                smtp.sendmail(self.gmail, receiver, str(msg))
    
            smtp.quit()