2

I am trying to write a simple Python script to send emails through my company's SMTP server. I am using the following piece of code.

#! /usr/local/bin/python import sys,re,os,datetime from smtplib import SMTP #Email function def sendEmail(message): sender="[email protected]" receivers=['[email protected]','[email protected]'] subject="Daily Report - " + datetime.datetime.now().strftime("%d %b %y") header="""\ From: %s To: %s Subject: %s %s""" % (sender, ", ".join(receivers), subject, message) smtp = SMTP() smtp.set_debuglevel(1) smtp.connect('X.X.X.X') smtp.ehlo() smtp.starttls() smtp.ehlo() try: smtp.login('[email protected]', '********') smtp.sendmail(sender,receivers,header) smtp.quit() except Exception, e: print e #MAIN sendEmail("HAHHAHAHAHAH!!!") 

Running this program, yields this result.

connect: ('X.X.X.X', 25) connect: ('X.X.X.X', 25) reply: '220 COMPANY.com [ESMTP Server] service ready;ESMTP Server; 05/25/11 15:59:27\r\n' reply: retcode (220); Msg: COMPANY.com [ESMTP Server] service ready;ESMTP Server; 05/25/11 15:59:27 connect: COMPANY.com [ESMTP Server] service ready;ESMTP Server; 05/25/11 15:59:27 send: 'ehlo SERVER1.COMPANY.com\r\n' reply: '250-COMPANY.com\r\n' reply: '250-SIZE 15728640\r\n' reply: '250-8BITMIME\r\n' reply: '250 STARTTLS\r\n' reply: retcode (250); Msg: COMPANY.com SIZE 15728640 8BITMIME STARTTLS send: 'STARTTLS\r\n' reply: '220 Ready to start TLS\r\n' reply: retcode (220); Msg: Ready to start TLS send: 'ehlo SERVER2.COMPANY.com\r\n' reply: '250-COMPANY.com\r\n' reply: '250-SIZE 15728640\r\n' reply: '250 8BITMIME\r\n' reply: retcode (250); Msg: COMPANY.com SIZE 15728640 8BITMIME send: 'quit\r\n' reply: '221 [ESMTP Server] service closing transmission channel\r\n' reply: retcode (221); Msg: [ESMTP Server] service closing transmission channel ERROR: Could not send email! Check the reason below. SMTP AUTH extension not supported by server. 

How do I start debugging this "SMTP AUTH extension not supported by server." error?

P.S.: I know the SMTP details and credentials are correct, as I have a working Java class with the exact details.

1 Answer 1

8

The error you get means the SMTP server you're talking to doesn't claim to support authentication. If you look at the debug output you'll see that none of the responses to your EHLOs contain the necessary declaration for AUTH. If it did (properly) support authentication, one of the responses would be something like:

250 AUTH GSSAPI DIGEST-MD5 PLAIN 

(at least in reponse to the EHLO after the STARTTLS.) Because that response isn't included, smtplib assumes the server won't be able to handle the AUTH command, and will refuse to send it. If you're certain your SMTP server does support the AUTH command even though it doesn't advertise it, you can sneakily convince smtplib that it supports AUTH by explicitly adding it to the set of features. You'll need to know which kind of authentication schemes are supported, and then you can do:

smtp.starttls() smtp.ehlo() # Pretend the SMTP server supports some forms of authentication. smtp.esmtp_features['auth'] = 'LOGIN DIGEST-MD5 PLAIN' 

... but of course making the SMTP server behave according to spec would be a better idea :)

Sign up to request clarification or add additional context in comments.

7 Comments

Ah, thanks. Can you give me a list of all possible authentication methods, so I can try each one?
There isn't really a complete list, but Python only supports CRAM-MD5, PLAIN and LOGIN, so there's no point in trying others.
I tried all 3, didn't work. Finally I found this SMTP wrapper (ginstrom.com/code/mailer.html) that works like a charm. Will have to dig into the code to figure out what I was doing wrong!
It sounds like the SMTP server simply doesn't support authentication. Did you consider removing the login call?
That did it! So does that mean our SMTP server is insecure?
|

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.