2015-05-10 3 views
2

Я использую Python для бита теперь и использую функцию электронной почты без каких-либо ошибок в прошлом, но на последнюю программу я сделал я получаю эту ошибкусоединение SMTP Ошибки питон

Traceback (most recent call last): 
    File "daemon.py", line 62, in <module> 
    scraper.run() 
    File "c:\cfsresd\scraper.py", line 48, in run 
    self.scrape() 
    File "c:\cfsresd\scraper.py", line 44, in scrape 
    handler(msg) 
    File "daemon.py", line 57, in handler 
    server.ehlo() 
    File "C:\Python27\lib\smtplib.py", line 385, in ehlo 
    self.putcmd(self.ehlo_msg, name or self.local_hostname) 
    File "C:\Python27\lib\smtplib.py", line 318, in putcmd 
    self.send(str) 
    File "C:\Python27\lib\smtplib.py", line 310, in send 
    raise SMTPServerDisconnected('please run connect() first') 
    smtplib.SMTPServerDisconnected: please run connect() first 

Я использовал тот же код электронной почты для всех моих проектов, но это первый раз. Я попытался добавить connect(), но это не имело никакого значения. Ниже по электронной почте раздел моего сценария

msg = MIMEText ('%s - %s' % (msg.text, msg.channel)) 
    server = smtplib.SMTP('smtp.gmail.com:587') 
    server.ehlo() 
    server.starttls() 
    msg['Subject'] = "msg.channel" 
    msg['From'] = ('removed') 
    msg['To'] = ('removed') 
    server.login('user','password') 
    server.sendmail(msg.get('From'),msg["To"],msg.as_string()) 
    server.close() 
    server.ehlo() 
    server.quit() 
    print 'sent' 

веселит за любую помощь

мохнатой

+0

Неправильное подключение? Это одна и та же строка соединения, которую вы обычно используете? Я думаю, что «smtplib.SMTP» принимает хост и порт как разные аргументы, хотя, возможно, он также обрабатывает его, как вы его там указываете. –

+0

электронная почта все равно отправляется, но затем появляется ошибка, а сценарий останавливается. – Shaggy89

+0

вот один, который я сделал, что работает через мой github [link] (https://github.com/Shaggs/SMTP-for-py/blob/master/SMTP-for-py.py) – Shaggy89

ответ

2

все сортируется сделал несколько идею и пытались код ниже

msg = MIMEText ('%s - %s' % (msg.text, msg.channel)) 
server = smtplib.SMTP('smtp.gmail.com') 
server.starttls() 
server.login('user','pass') 
msg['Subject'] = "msg.channel" 
msg['From'] = ('from') 
msg['To'] = ('to') 
server.sendmail(msg.get('From'),msg["To"],msg.as_string()) 
server.quit() 

Так что я удалил ehlo(), close() и номер порта. теперь мне нужно тренироваться, как изменить тему на msg.channel, чтобы она менялась каждый раз.

благодарю всех

2

Попробуйте использовать пустой конструктор SMTP, а затем позвонить connect(host, port):

server = smtplib.SMTP() 
    server.connect('smtp.gmail.com', '587') 
    server.ehlo() 
    server.starttls() 
    server.login(username, password) 
+0

перечитывать сообщение и пытались забыть() в topline, но порога же ошибка игнорировать старые комментарии извините – Shaggy89

+0

Call connect ('smtp.google.com', '587'), а не connect ('smtp.google.com:587') – DeepSpace

+0

У меня есть все пути, называемые smtp.gmail.com, но пробовали с smtp.google.com и получить ошибку 11004 получить addrinfo fail – Shaggy89

1

У вас есть ehlo после close , Это кажется маловероятным. Кроме того, quit делает close так что вы, вероятно, можете просто избавиться от ehlo и close звонков ближе к концу

+0

спасибо. работал каждый раз. теперь удалено – Shaggy89

1

Вы все еще можете иметь шифрованное соединение с сервером SMTP, используя класс SMTP_SSL без необходимости в StartTLS вызова (короче). Вам не нужно вызывать ehlo каждый раз, это делается автоматически, когда это необходимо, и при подключении к порту по умолчанию не нужно указывать его при создании экземпляров классов SMTP *.

msg = MIMEText ('%s - %s' % (msg.text, msg.channel)) 
msg['To'] = ','.join(receivers) 
msg['Subject'] = 'msg.channel' 
msg['From'] = '[email protected]' 

Использование SMTP с STARTTLS:

server = smtplib.SMTP('smtp.gmail.com') 
server.starttls() 
server.login('user', 'password') 
server.sendmail(msg['From'], receivers, msg.as_string()) 

и теперь с классом SMTP_SSL

server = smtplib.SMTP_SSL('smtp.gmail.com') 
server.login('user', 'password') 
server.sendmail(msg['From'], receivers, msg.as_string()) 

и, наконец,

server.quit() 
+0

throws огромная ошибка – Shaggy89

+0

говорит неправильный протокол Мне нравится server.startttls() лично – Shaggy89

+0

Итак, что это за 'msg' объект в конструкторе MIMEText? И что такое «канал»? –

0

Я сопровождающий yagmail, пакет, который должен сделать это очень легко отправить по электронной почте.

import yagmail 
yag = yagmail.SMTP('user','password') 
yag.send(to = '[email protected]', subject = 'msg.channel') 

когда yag покидает область видимости, он будет автоматически близко.

Я также советую вам зарегистрироваться в брелоке один раз, поэтому вам никогда не придется писать пароль в скрипте. Просто запустите один раз:

yagmail.register('user', 'password') 

Вы можете сократить его к этому:

SMTP().send('[email protected]', 'msg.channel') 

Вы можете установить его с пип или PIP3 (для Python 3).Вы можете также read more about it с функциональностью, как легко добавлять вложения, встроенные изображения/html, псевдонимы и т.д.

+0

'yagmail.Connect (...): AttributeError: объект 'module' не имеет атрибута 'Connect' 'Импорт yagmail из yagmail - то же самое. –

+1

@TomRussell С тех пор обновлено до SMTP. Я обновил ответ, спасибо, что нашел время оставить комментарий. – PascalVKooten

1

Для Pyhton 3.6 *
. Примечание: В Gmail он будет работать, только если проверка 2-Step выключен. Разрешить gmail открывать с помощью низко защищенного приложения.

import smtplib 
from email.mime.multipart import MIMEMultipart 
from email.mime.text import MIMEText 

from_addr = 'sender-email-id' 
to_addr = 'receiver-email-id' 
text = 'Hi Friend!!!' 

username = 'sender-username' 
password = 'password' 

msg = MIMEMultipart() 

msg['From'] = from_addr 
msg['To'] = to_addr 
msg['Subject'] = 'Test Mail' 
msg.attach(MIMEText(text)) 


server = smtplib.SMTP('smtp.gmail.com:587') 
server.ehlo() 
server.starttls() 
server.ehlo() 
server.login(username,password) 
server.sendmail(from_addr,to_addr,msg.as_string()) 
server.quit() 
Смежные вопросы