连接错误 SMTP python

Connection Error SMTP python

我已经使用 python 一段时间了,并且过去一直在使用电子邮件功能而没有任何错误,但是在我制作的最新程序中我遇到了这个错误

 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'

欢迎任何帮助

毛茸茸的

尝试使用 SMTP 的空构造函数,然后调用 connect(host, port):

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

您在 close 之后有一个 ehlo。这似乎不太可能成功。此外,quit 执行 close,因此您可以在接近尾声时摆脱 ehloclose 调用

您仍然可以使用 SMTP_SSL class 与 smtp 服务器建立加密连接,而无需调用 starttls(更短)。您不需要每次都调用 ehlo,它会在需要时自动完成,并且当连接到默认端口时,创建实例时不必提供一个 SMTP* classes.

msg = MIMEText ('%s - %s' % (msg.text, msg.channel))
msg['To'] = ','.join(receivers)
msg['Subject'] = 'msg.channel'
msg['From'] = 'someone@somedomain.com'

将 SMTP 与 starttls 一起使用:

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

现在 SMTP_SSL class

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

最后

server.quit()

all sorted 有了一些想法并尝试了下面的代码

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,以便每次都更改。

谢谢大家

我是 yagmail 的维护者,这个软件包应该可以让发送电子邮件变得非常容易。

import yagmail
yag = yagmail.SMTP('user','password')
yag.send(to = 'to@gmail.com', subject = 'msg.channel')

yag离开作用域时,它会自动关闭。

我还建议您在密钥环中注册一次,这样您就不必在脚本中编写密码了。只需 运行 一次:

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

然后您可以将其缩短为:

SMTP().send('to@gmail.com', 'msg.channel')

您可以使用 pip 或 pip3 安装它(对于 Python 3)。您还可以 read more about it,具有轻松添加附件、内联 images/html、别名等功能

对于 Python 3.6.*
注意:在 gmail 中,只有关闭两步验证才能使用。允许通过低安全应用程序打开 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()

当我尝试从 Celery(作为 Docker 容器)发送电子邮件时,我遇到了类似的问题。我将 env_file 添加到 worker 并在 docker compose 文件中击败容器。

env_file: ./env/dev/.env

在该文件中我有一个电子邮件配置。

EMAIL_HOST=smtp.gmail.com
EMAIL_HOST_USER=your_mail
EMAIL_HOST_PASSWORD=your_password
EMAIL_PORT=587

我通过删除这一行解决了这个错误:

server.quit() 

raise SMTPServerDisconnected('please run connect() first')

如果你有这个错误,我想安装这个:

pip install django-smtp-ssl

这个安装smtp库和ssl协议

它非常适合我