Ошибка при импорте smtplib

Автор Ethanol, 28 июля 2017, 23:34:08

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Ethanol

Здравствуйте. Написал по статье тривиальную программу для отправки сообщения на email:

import smtplib
smtpObj = smtp.SMTP('smtp.yandex.ru', 465)
smtpObj.starttls()
smtpObj.login('mark@yandex.ru','mark123')
smtpObj.sendmail("mark@yandex.ru","mark@gmail.com","Hello my friend!")
smtpObj.quit()


Далее запускаю его в python3:
mark@evil:~/Загрузки/Python$ python3 letter.py
Traceback (most recent call last):
  File "letter.py", line 1, in <module>
    import smtplib
  File "/usr/lib/python3.4/smtplib.py", line 47, in <module>
    import email.utils
[b]ImportError: bad magic number in 'email': b'\x03\xf3\r\n'[/b]


Ранее бездумно запускал пару готовых скриптов из инета и после этого при запуске этой же программы мне почему-то вылезало сообщение, которое ссылалось на файл скачанный из инета. Те скрипты я удалил и теперь Python жалуется на "плохое магическое число".

Debian 8.9
p.s.Пробовал загуглить, но даже не знаю. как грамотно сформулировать.

ZEN

#1
Цитироватьimport smtplib
smtpObj = smtp.SMTP('smtp.yandex.ru', 465)
Что-то тут с кодом не то. Возможно имелось ввиду "import smtplib as smtp", но в принципе ошибка с этим не связана. На python 2.7 код работает?

По стектрейсу видно, что код валится на import smtplib, который пытается в свою очередь подгрузить email.utils. А этот модуль для 2.7 и 3.4 версии отличается:
zen@devel:~$ python -c 'import email.utils; print(email.utils.__file__)'
/usr/lib/python2.7/email/utils.py
zen@devel:~$ python3 -c 'import email.utils; print(email.utils.__file__)'
/usr/lib/python3.4/email/utils.py
zen@devel:~$ diff -q /usr/lib/python2.7/email/utils.py /usr/lib/python3.4/email/utils.py
Файлы /usr/lib/python2.7/email/utils.py и /usr/lib/python3.4/email/utils.py различаются
Crimea is Ukraine

Ethanol

#2
Попробовал python 2, тоже не нравится:
mark@evil:~/Загрузки/Python$ python letter.py
Traceback (most recent call last):
  File "letter.py", line 1, in <module>
    import smtplib
  File "/usr/lib/python2.7/smtplib.py", line 46, in <module>
    import email.utils
  File "/home/mark/Загрузки/Python/email.py", line 3, in <module>
AttributeError: 'module' object has no attribute 'SMTP'
mark@evil:~/Загрузки/Python$ python2.7 letter.py
Traceback (most recent call last):
  File "letter.py", line 1, in <module>
    import smtplib
  File "/usr/lib/python2.7/smtplib.py", line 46, in <module>
    import email.utils
  File "/home/mark/Загрузки/Python/email.py", line 3, in <module>
AttributeError: 'module' object has no attribute 'SMTP'


В папке со скриптами была ещё папка с именем типа __pycache__ и несколько файлов с расширением .pyc. Я их удалил и снова запустил команду python letter.py и теперь ошибка другая:
mark@evil:~/Загрузки/Python$ python3 letter.py
Traceback (most recent call last):
  File "letter.py", line 2, in <module>
    smtpObj = smtp.SMTP('smtp.yandex.ru', 465)
NameError: name 'smtp' is not defined


Попробовал запустить на ноуте с установленным Python3 и та же ошибка. То есть теперь ошибка в самом коде?
p.s. Да, я не очень умный


ZEN

Цитата: Ethanol от 29 июля 2017, 08:31:46Попробовал запустить на ноуте с установленным Python3 и та же ошибка. То есть теперь ошибка в самом коде?

я об этом выше писал) Вы импортируете модуль smtplib, а работать пытаетесь с просто smtp. Что бы код заработал, нужно немного подправить:
import smtplib
smtpObj = smtplib.SMTP('smtp.yandex.ru', 465)
smtpObj.starttls()
smtpObj.login('mark@yandex.ru','mark123')
smtpObj.sendmail("mark@yandex.ru","mark@gmail.com","Hello my friend!")
smtpObj.quit()
Crimea is Ukraine

Ethanol

Да, отлично! Спасибо.
Только вот почему-то письмо по-прежнему не отправляется. Никаких ошибок не выводит. Ввожу python3 letter.py и всё. Курсор на новую строку, приглашения к вводу нет.
Если останавливаю процесс CTRL+C, то выводит:
mark@evil:~/Загрузки/Python$ python3 letter.py
^CTraceback (most recent call last):
  File "letter.py", line 2, in <module>
    smtpObj = smtplib.SMTP('smtp.yandex.ru', 465)
  File "/usr/lib/python3.4/smtplib.py", line 242, in __init__
    (code, msg) = self.connect(host, port)
  File "/usr/lib/python3.4/smtplib.py", line 323, in connect
    (code, msg) = self.getreply()
  File "/usr/lib/python3.4/smtplib.py", line 369, in getreply
    line = self.file.readline(_MAXLINE + 1)
  File "/usr/lib/python3.4/socket.py", line 371, in readinto
    return self._sock.recv_into(b)
KeyboardInterrupt

Т.е. всё что после ^C

ZEN

Попробуй включить debug, добавь строчку "smtpObj.set_debuglevel(1)"

import smtplib
smtpObj = smtplib.SMTP('smtp.yandex.ru', 465)
smtpObj.set_debuglevel(1)
smtpObj.starttls()
smtpObj.login('mark@yandex.ru','mark123')
smtpObj.sendmail("mark@yandex.ru","mark@gmail.com","Hello my friend!")
smtpObj.quit()


хотя бы узнаем на какой стадии процесс останавливается
Crimea is Ukraine

Ethanol

Не, всё также зависает.

ZEN

Хм... не подключается к хосту:
>>> smtpObj = smtplib.SMTP('smtp.yandex.ru', 465, timeout=10)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/smtplib.py", line 256, in __init__
    (code, msg) = self.connect(host, port)
  File "/usr/lib/python2.7/smtplib.py", line 317, in connect
    (code, msg) = self.getreply()
  File "/usr/lib/python2.7/smtplib.py", line 365, in getreply
    + str(e))
smtplib.SMTPServerDisconnected: Connection unexpectedly closed: timed out
Crimea is Ukraine

mrgoodvin

Попробовал аналогично, не подключается.
~$ /usr/bin/python3
Python 3.5.3 (default, Jan 19 2017, 14:11:04)
[GCC 6.3.0 20170118] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import smtplib
>>> o = smtplib.SMTP("smtp.gmail.com", 465)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.5/smtplib.py", line 251, in __init__
    (code, msg) = self.connect(host, port)
  File "/usr/lib/python3.5/smtplib.py", line 337, in connect
    (code, msg) = self.getreply()
  File "/usr/lib/python3.5/smtplib.py", line 393, in getreply
    raise SMTPServerDisconnected("Connection unexpectedly closed")
smtplib.SMTPServerDisconnected: Connection unexpectedly closed

А вот через ssl работает. SMTP(...) заменить на SMTP_SSL(...), строку starttls() убрать, понятное дело. А вот почему SMTP не работает не понятно.