11

This is a question about sending an email through an authenticated SMTP (not gmail). The below script was put together through various questions and answers on this site but I get an error that has no "googlable" candidates for this particular combination of tools. I'm working in Python 3.5.1 and it produces this error:

mail failed; [SSL: UNKNOWN_PROTOCOL] unknown protocol (_ssl.c:645)

Is this client side error or server? Am I missing some certificates I'm not aware of? AFAIK server supports SSL authentication. Any thoughts and nudges in the right direction will be appreciated.

import sys
from smtplib import SMTP_SSL as SMTP
from email.mime.text import MIMEText

# credentials masked, obviously
SMTPserver = 'myserver'
sender = 'mymail'
destination = ['recipient']

USERNAME = "myusername"
PASSWORD = "mypass"

# typical values for text_subtype are plain, html, xml
text_subtype = 'plain'

content = """\
Test message
"""

subject = "Sent from Python"

try:
    msg = MIMEText(content, text_subtype)
    msg['Subject'] = subject
    msg['From'] = sender
    conn = SMTP(host=SMTPserver, port=465)
    conn.set_debuglevel(False)
    conn.login(USERNAME, PASSWORD)

    try:
        conn.sendmail(sender, destination, msg.as_string())
    finally:
        conn.quit()

except Exception as exc:
    sys.exit("mail failed; %s" % str(exc))
2
  • 1
    I suspect your server isn't using SSL/TLS. Can you try to connect to it from the command line, e.g. with: openssl s_client -connect myserver:465? If the server is working properly it should negotiate the SSL connection and display an SMTP banner. Commented Mar 27, 2016 at 0:06
  • 1
    I had a similar error when using SMTP SSL from Flask-Mail. Using TLS it worked OK. Commented Mar 27, 2016 at 2:37

2 Answers 2

11

Thanks to both commentators under my question. After navigating around SSL by setting

from smtplib import SMTP as SMTP 

and enabling TLS once the STMP object is created (forgive me if I'm not using the correct terminology)

conn = SMTP(host=SMTPserver, port=587)  # object created
conn.ehlo() 
conn.starttls()  # enable TLS
conn.ehlo()

I was able to send e-mail.

enter image description here

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

Comments

5

I had the same problem. I just changed from:

EMAIL_USE_SSL = True

To:

EMAIL_USE_TLS = True

6 Comments

Seems like yours was for a Django use-case. Correct?
Yes, it is for a Django use case
This is not useful for the question, because EMAIL_USE_SSL does not appear in the example code.
vy32 this might be the missing configuration that needs to be added to solve the issue, and that was exactly what I had to add when I had the same issue.
For anyone using Flask-Mail or Flask-Security, a variation of this answer fixes your SSL problem - MAIL_USE_TLS = True - The Flask-Security docs say to use MAIL_USE_SSL but you want TLS instead.
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.