Не удалось отправить электронное письмо с примером Python - PullRequest
21 голосов
/ 30 декабря 2008

Я пытался (и не смог) выяснить, как отправлять электронную почту через Python.

Попробуем пример отсюда: http://docs.python.org/library/smtplib.html#smtplib.SMTP

но добавил строку server = smtplib.SMTP_SSL('smtp.gmail.com', 465) после того, как я получил отскок от отсутствия SSL-соединения.

Теперь я получаю это:

Traceback (most recent call last):
  File "C:/Python26/08_emailconnects/12_29_EmailSendExample_NotWorkingYet.py", line 37, in <module>
    server = smtplib.SMTP('smtp.gmail.com', 65)
  File "C:\Python26\lib\smtplib.py", line 239, in __init__
    (code, msg) = self.connect(host, port)
  File "C:\Python26\lib\smtplib.py", line 295, in connect
    self.sock = self._get_socket(host, port, self.timeout)
  File "C:\Python26\lib\smtplib.py", line 273, in _get_socket
    return socket.create_connection((port, host), timeout)
  File "C:\Python26\lib\socket.py", line 512, in create_connection
    raise error, msg
error: [Errno 10060] A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond
>>> 

Мысли


server = smtplib.SMTP ("smtp.google.com", 495) выдает ошибку тайм-аута. просто smtplib.smtp ("smtp.google.com", 495) выдает мне "SSLError: [Errno 1] _ssl.c: 480: ошибка: 140770FC: процедуры SSL: SSL23_GET_SERVER_HELLO: неизвестный протокол" (см. ниже).

Я пробую разные порты, и теперь я получаю совершенно новую ошибку. Я просто опубликую весь код, возможно, я делаю какую-то новичок.

"

import smtplib

mailuser = 'MYEMAIL@gmail.com'

mailpasswd = 'MYPASSWORD'

fromaddr = 'MYEMAIL@gmail.com'

toaddrs = 'MYEMAIL2@gmail.com'

msg = 'Hooooorah!'

print msg

server = smtplib.SMTP_SSL('smtp.google.com')

server = smtplib.SMTP_SSL_PORT=587

server.user(mailuser)

server.pass_(mailpasswd)

server.set_debuglevel(1)

server.sendmail(fromaddr, toaddrs, msg)

server.quit()

"

и тогда я получаю это сообщение об ошибке: "

Traceback (most recent call last):
  File "C:/Python26/08_emailconnects/12_29_eMAILSendtryin_stripped.py", line 16, in <module>
    server = smtplib.SMTP_SSL('smtp.google.com')
  File "C:\Python26\lib\smtplib.py", line 749, in __init__
    SMTP.__init__(self, host, port, local_hostname, timeout)
  File "C:\Python26\lib\smtplib.py", line 239, in __init__
    (code, msg) = self.connect(host, port)
  File "C:\Python26\lib\smtplib.py", line 295, in connect
    self.sock = self._get_socket(host, port, self.timeout)
  File "C:\Python26\lib\smtplib.py", line 755, in _get_socket
    self.sock = ssl.wrap_socket(self.sock, self.keyfile, self.certfile)
  File "C:\Python26\lib\ssl.py", line 350, in wrap_socket
    suppress_ragged_eofs=suppress_ragged_eofs)
  File "C:\Python26\lib\ssl.py", line 118, in __init__
    self.do_handshake()
  File "C:\Python26\lib\ssl.py", line 293, in do_handshake
    self._sslobj.do_handshake()
SSLError: [Errno 1] _ssl.c:480: error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol

"

обратите внимание, что на самом деле то, что выглядит как "server = smtplib.SMTPSSLPORT = 587", на самом деле "server = smtplib.SMTP подчеркивание SSL подчеркивание PORT = 587", есть какая-то о вещании форматирования, происходящем здесь.

Ответы [ 9 ]

28 голосов
/ 30 декабря 2008

У меня работает следующий код:

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()

Я использую Python 2.5.2.

Редактировать : изменил порт с 25 на 587, как предложено ΤΖΩΤΖΙΟΥ, и отбросил второе эхо (). Теперь я хотел бы знать, почему порт 25 работает отлично с моей машины (а порт 465 не ).

7 голосов
/ 31 декабря 2008

Правильный способ подключения к GMail с использованием SSL:

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

Порт 465, кажется, вызывает задержки. Оба порта указаны в GMail FAQ .

Обратите внимание, что использование порта 587 более распространено для SMTP через SSL, хотя это просто тривиальная информация, другого практического применения у него нет.

Этот ответ предоставляется в виде вики сообщества, чтобы быть выбранным в качестве ответа "the". Пожалуйста, улучшайте по мере необходимости.

6 голосов
/ 05 июня 2009

Проблема связана с ошибкой в ​​Python . Попытка создать соединение с SMTP_SSL завершится неудачно с «SMTPServerDisconnected: сначала запустите connect ()»

Исправление было зафиксировано, поэтому вы можете исправить свою локальную копию. См. Вложение с именем «smtplib_72551.diff».

(Примечание. SMTP_SSL - это новый класс, добавленный в Python 2.6 / 3.0 и более поздние версии.)

6 голосов
/ 30 декабря 2008

Вот простое решение. Имел в виду приклеить это раньше, но уснул у моего стула.


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")

Я предполагаю, что большинство людей в этой теме, которые делали успешные попытки с их кодом, не работают на win32. ;)

* edit: см. http://docs.python.org/library/email-examples.html для некоторых хороших "официальных" примеров.

2 голосов
/ 30 декабря 2008

Хорошо, узнал, что эта строка кода добивается цели!

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

Оказалось, что GMAIL не поддерживает SSL на порту 25 (и порт 465 по какой-то причине вызвал зависание).

Спасибо, ребята!

1 голос
/ 02 июня 2015
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)

Приведенный выше код прекрасно работает для меня. Как вы можете видеть, PORT = 465 используется в этом примере, так как я использую SSL. Если вы планируете использовать порт 587, тогда требуется TLS.

1 голос
/ 30 декабря 2008

Вы должны проверить свой порт, я не уверен, что SMTP-порт Google равен 65, что объясняет время ожидания.

Измените ваши источники так:

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

Если, однако, вы уверены, что он должен работать, а это не так, похоже, что есть некоторые проблемы с smtplib.SMTP_SSL, и есть доступное исправление для него здесь .

1 голос
/ 30 декабря 2008

Возможно, неправильный порт? Я использую 587 для smtp.gmail.com и все работает.

0 голосов
/ 06 февраля 2014
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()
...