4

I want to send a mail in using python, below is my code, but I got the error 10061 at the end, hope anyone can help me, thanks!

import smtplib
fromaddr = 'XXX@XX.com'
toaddrs  = 'XXX@XX.com    '
msg = 'Why,Oh why!'
username = 'XXXXXX'
password = 'XXXXXX'
server = smtplib.SMTP('smtp.gmail.com:587')
server.ehlo()
server.starttls()
server.login(username,password)
server.sendmail(fromaddr, toaddrs, msg)
server.quit()

error msg:socket.error: [Errno 10061] No connection could be made because the target machine actively refused it

Emon
  • 51
  • 1
  • 2
  • 4
  • Possible duplicate of [No connection could be made because the target machine actively refused it](http://stackoverflow.com/questions/4532335/no-connection-could-be-made-because-the-target-machine-actively-refused-it) – tripleee Jun 22 '16 at 07:12
  • 2
    Its not duplicate of the mentioned question. This question is more specific to gmail services – Roshan Jun 22 '16 at 08:43

2 Answers2

3

As far as I know Gmail and other companies have security to prevent emails being sent from unknown sources, but this link can turn that kind of security off.

There you can modify the account so it will accept the email.

I use this code to send email:

import smtplib

from email.mime.multipart import MIMEMultipart

from email.mime.text import MIMEText

from_address = 'johndoe@gmail.com'

to_address = 'johndoe@gmail.com'

message = MIMEMultipart('Foobar')

epos_liggaam['Subject'] = 'Foobar'

message['From'] = from_address

message['To'] = to_address

content = MIMEText('Some message content', 'plain')

message.attach(content)

mail = smtplib.SMTP('smtp.gmail.com', 587)

mail.ehlo()

mail.starttls()

mail.login(from_address, 'password')

mail.sendmail(from_address,to_address, message.as_string())

mail.close()
Anonymous
  • 738
  • 4
  • 14
  • 36
Cid-El
  • 500
  • 7
  • 30
  • 1
    Pls note that my first language is not english, so some of the variables may have weird names... thanks – Cid-El Jun 22 '16 at 06:32
  • as mentioned by Cid-EL you have to enable less secure apps. Since you are using gmail. You can also use GMAIL API's – Roshan Jun 22 '16 at 06:34
  • 2
    Thanks for you answer, I use turn one the lesssecureapps and use your codes, but still got the same error msg.:( – Emon Jun 22 '16 at 06:48
  • did you went to the link and chose turn on, then saved the changes and tried it? couse i had the excact error u had some time ago, and that code worked quite well. – Cid-El Jun 22 '16 at 06:54
3

As mentioned by Cid-EL, You have to enable less secure apps in GMAIL settings

However, It's not secure to turn on that perticular option.

Gmail provides API's to perform mail operations. GMAIL API's are supported in many languages.

For Python API : Python with Gmail

For Java API's : Java with Gmail

Little more effort but you can have a secure connection !!

Step 1: Turn on the GMAIL API

Step 2: Install Google client library

pip install --upgrade google-api-python-client

Step 3: Code sample to send a mail using GMAIL API

from __future__ import print_function
import httplib2
import os

from apiclient import discovery
import oauth2client
from oauth2client import client
from oauth2client import tools

try:
   import argparse
   flags = argparse.ArgumentParser(parents=[tools.argparser]).parse_args()
except ImportError:
   flags = None

# If modifying these scopes, delete your previously saved credentials 
# at ~/.credentials/gmail-python-quickstart.json
SCOPES = "https://mail.google.com/"
CLIENT_SECRET_FILE = 'client_secret.json'
APPLICATION_NAME = 'Gmail API Python Quickstart'


def get_credentials():
  """Gets valid user credentials from storage.

  If nothing has been stored, or if the stored credentials are invalid,
  the OAuth2 flow is completed to obtain the new credentials.

  Returns:
    Credentials, the obtained credential.
  """
   home_dir = os.path.expanduser('~')
   credential_dir = os.path.join(home_dir, '.credentials')
   if not os.path.exists(credential_dir):
      os.makedirs(credential_dir)
   credential_path = os.path.join(credential_dir,
                                'gmail-python-quickstart.json')

   store = oauth2client.file.Storage(credential_path)
   credentials = store.get()
   if not credentials or credentials.invalid:
      flow = client.flow_from_clientsecrets(CLIENT_SECRET_FILE, SCOPES)
      flow.user_agent = APPLICATION_NAME
      if flags:
         credentials = tools.run_flow(flow, store, flags)
      else: # Needed only for compatibility with Python 2.6
         credentials = tools.run(flow, store)
      print('Storing credentials to ' + credential_path)
   return credentials

# create a message
def CreateMessage(sender, to, subject, message_text):
  """Create a message for an email.

  Args:
    sender: Email address of the sender.
    to: Email address of the receiver.
    subject: The subject of the email message.
    message_text: The text of the email message.

  Returns:
    An object containing a base64 encoded email object.
  """
    message = MIMEText(message_text)
    message['to'] = to
    message['from'] = sender
    message['subject'] = subject
    return {'raw': base64.b64encode(message.as_string())}

#send message 
def SendMessage(service, user_id, message):
    """Send an email message.

    Args:
     service: Authorized Gmail API service instance.
     user_id: User's email address. The special value "me"
     can be used to indicate the authenticated user.
     message: Message to be sent.

    Returns:
     Sent Message.
    """
    try:
        message = (service.users().messages().send(userId=user_id, body=message).execute())
        #print 'Message Id: %s' % message['id']
        return message
    except errors.HttpError, error:
        print ('An error occurred: %s' % error)


def main():
    """Shows basic usage of the Gmail API.
       Send a mail using gmail API
    """
    credentials = get_credentials()
    http = credentials.authorize(httplib2.Http())
    service = discovery.build('gmail', 'v1', http=http)

    msg_body = "test message"

    message = CreateMessage("xxxxx@gmail.com", "yyy@gmail.com", "Status report of opened tickets", msg_body)
   
    SendMessage(service, "me", message)

if __name__ == '__main__':
    main()
Tomerikoo
  • 18,379
  • 16
  • 47
  • 61
Roshan
  • 1,380
  • 13
  • 23
  • Hi just Authentication successful for GMAIL API, and what's the next step? How can I send a mail with this API, sorry for the stupid question – Emon Jun 22 '16 at 07:46
  • Its okay, have you created account in google developer console ? – Roshan Jun 22 '16 at 08:37
  • YES I have, just want to know what's step? could you please give me some code about how to call the GMAIL API or how to use the API – Emon Jun 27 '16 at 02:14
  • @Emon i've updated the answer, when you run for the first time, it will open a browser and you have to give the permission there. let me know if it won't work – Roshan Jun 27 '16 at 05:42
  • Sorry for my stupid. but this line except errors.HttpError, error: print ('An error occurred: %s' % error) is error, how to define the errors? – Emon Jun 27 '16 at 07:17
  • @Emon Please check whether your indentation is correct – Roshan Jun 27 '16 at 08:52
  • @Emon keep both client.json and current python file in the home directory – Roshan Jun 27 '16 at 08:53