Failing to send email with the Python example

只谈情不闲聊 提交于 2019-11-28 03:59:56

The following code works for me:

import smtplib

FROMADDR = "my.real.address@gmail.com"
LOGIN    = FROMADDR
PASSWORD = "my.real.password"
TOADDRS  = ["my.real.address@gmail.com"]
SUBJECT  = "Test"

msg = ("From: %s\r\nTo: %s\r\nSubject: %s\r\n\r\n"
       % (FROMADDR, ", ".join(TOADDRS), SUBJECT) )
msg += "some text\r\n"

server = smtplib.SMTP('smtp.gmail.com', 587)
server.set_debuglevel(1)
server.ehlo()
server.starttls()
server.login(LOGIN, PASSWORD)
server.sendmail(FROMADDR, TOADDRS, msg)
server.quit()

I'm using Python 2.5.2.

Edit: changed port from 25 to 587 as suggested by ΤΖΩΤΖΙΟΥ, and dropped the second ehlo(). Now I would love to know why port 25 works perfectly from my machine (and port 465 does not).

The correct way to connect to GMail using SSL is:

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

Port 465 seems to cause delays. Both ports are specified in a GMail FAQ.

Note that use of port 587 is more common for SMTP over SSL, although this is just trivial information, it has no other practical use.

This answer is provided as community wiki in order to be chosen as "the" answer. Please improve as needed.

The problem is due to a bug in Python. Trying to create a connection with SMTP_SSL will fail with "SMTPServerDisconnected: please run connect() first."

A fix has been committed, so you can patch your local copy. See the attachment named "smtplib_72551.diff".

(Note: SMTP_SSL is a new class added to Python 2.6/3.0 and later.)

EndUsr

Here's a simple throw away solution. Meant to paste this earlier, but fell asleep at my chair.


import smtplib
import email
import os

username = "user@gmail.com"
passwd = "password"

def mail(to, subject, text, attach):
   msg = MIMEMultipart()

   msg['From'] = username
   msg['To'] = to
   msg['Subject'] = subject

   msg.attach(MIMEText(text)) 

   part = MIMEBase('application', 'octet-stream')
   part.set_payload(open(attach, 'rb').read())
   Encoders.encode_base64(part)
   part.add_header('Content-Disposition',
           'attachment; filename="%s"' % os.path.basename(attach))
   msg.attach(part)

   server = smtplib.SMTP("smtp.gmail.com", 495)
   server.ehlo()
   server.starttls()
   server.ehlo()
   server.login(username, passwd)
   server.sendmail(username, to, msg.as_string())
   server.close()

mail("you", "hi", "hi", "webcam.jpg")

It's my assumption that most people on this thread that have had successful attempts with their code aren't on win32. ;)

*edit: See http://docs.python.org/library/email-examples.html for some good "official" examples.

Okay, found out that this line of code does the trick!

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

Turned out to be GMAIL didn't support SSL on port 25 (and port 465 caused a hang for some reason).

Thanks guys!

You should check your port, I'm not sure that google's SMTP port is 65, that would explain the timeout.

Modify your sources as such:

smtplib.SMTP_SSL('smtp.google.com', 465)

If, however, you are certain that it ought to work and it doesn't, it appears that there are some problems with smtplib.SMTP_SSL, and there's an available patch for it here.

Incorrect port maybe? I'm using 587 for smtp.gmail.com and it works.

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

HOST = 'smtp.gmail.com'
PORT = 465

USERNAME = 'oltjano13@gmail.com'
PASSWORD = ''

SENDER = 'oltjano13@gmail.com'
RECIPIENT = 'oltjano13@gmail.com'

text_subtype = 'plain'

with open('textfile', 'rb') as f:
    msg = MIMEText(f.read(), text_subtype)


msg['Subject'] = 'Python Script'
msg['From'] = SENDER
msg['To'] = RECIPIENT

try:
    connection = SMTP(HOST, PORT)
    connection.login(USERNAME, PASSWORD)
    connection.sendmail(SENDER, RECIPIENT, msg.as_string())
except Exception, e:
    print(e)

The above code works fine for me. As you can see the PORT = 465 is being used in this example since I am using SSL. If you plan to use the port 587 then TLS is required.

Super Saiyan
import smtplib

content = 'example email stuff here'

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

mail.ehlo()

mail.starttls()

mail.login('email@gmail.com','password')

mail.sendmail('email@gmail.com', 'email@yahoo.com', content)

mail.close()
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!