问题
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
回答1:
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()
Let me know if it won't work.
Hope it helps !!
回答2:
as far as i know Gmail and other companies have security to prevent emails beeing sent from unknown sources, here is a link to turn that kind of security of:
https://www.google.com/settings/security/lesssecureapps
there you can modify the account sothat it will accept the email
i also use this code to send a email:
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from_adres = ‘VAN_eposadres@gmail.com'
to_adres = ‘NA_eposadres@gmail.com'
epos_liggaam = MIMEMultipart('alternatief')
epos_liggaam['Subject'] = "DIE OPSKRIF"
epos_liggaam['From'] = from_adres
epos_liggaam['To'] = to_adres
boodskap = MIMEText("Hierdie is die boodskap gedeelte van
die epos", 'plain')
epos_liggaam.attach(boodskap)
mail = smtplib.SMTP('smtp.gmail.com',587)
mail.ehlo()
mail.starttls()
mail.login(van_adres,'wagwoord')
mail.sendmail(van_adres,na_adres,epos_liggaam.as_string())
mail.close()
hope this helped!
thanks!
来源:https://stackoverflow.com/questions/37960035/python-email-errno-10061-no-connection-could-be-made-because-the-target-machi