【问题标题】:SMTP AUTH extension not supported by server服务器不支持 SMTP AUTH 扩展
【发布时间】:2016-09-10 11:33:00
【问题描述】:

使用 python 我想从我的应用程序发送电子邮件,但它显示错误

SMTP AUTH extension not supported by server

程序代码,

import smtplib
from email.MIMEMultipart import MIMEMultipart
from email.MIMEText import MIMEText
fromaddr = "test1@example.com"
toaddr = "test2@example.com"
msg = MIMEMultipart()
msg['From'] = fromaddr
msg['To'] = toaddr
msg['Subject'] = "Test Mail"
body = "Test mail from python"
msg.attach(MIMEText(body, 'plain'))
server = smtplib.SMTP('smtp.example.com', 25)
server.ehlo()
server.starttls()
server.ehlo()
server.login(fromaddr, "password")
text = msg.as_string()
server.sendmail(fromaddr, toaddr, text)
server.quit()

Telnet 输出:

ehlo test1.example.com
250-hidden
250-HELP
250-SIZE 104857600
250-ENHANCEDSTATUSCODES
250-8BITMIME
250-STARTTLS
250 OK

我需要验证并从应用发送邮件。

【问题讨论】:

    标签: python smtp smtplib


    【解决方案1】:

    在登录和发送电子邮件之前需要连接。

    server = smtplib.SMTP('smtp.example.com', 25)
    server.connect("smtp.example.com",465)
    server.ehlo()
    server.starttls()
    server.ehlo()
    server.login(fromaddr, "password")
    text = msg.as_string()
    server.sendmail(fromaddr, toaddr, text)
    server.quit()
    

    【讨论】:

    • 在建立连接server.connect 后,它工作正常。谢谢!
    • 端口 465 用于 SMTPS。如果您不提供任何端口,则默认为 25。使用 SMTPS 时,SSL 加密会在任何 SMTP 级别通信之前自动启动。
    • 根据官方文档,connect()是被隐式调用的。
    【解决方案2】:
    import smtplib
    
    s = smtplib.SMTP('smtplib.gmail.com',587)
    s.ehlo()
    s.starttls()
    s.login('frmaddr','password')
    try:
        s.sendmail('fromaddr','toaddr','message')
    except:
        print (failed)
    

    【讨论】:

    • 欢迎来到 Stack Overflow!虽然这段代码可以解决问题,including an explanation 解决问题的方式和原因确实有助于提高帖子的质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提出问题的人。请edit您的答案添加解释并说明适用的限制和假设。
    • print (failed) 会抛出异常,因为在这种情况下 failed 是一个未声明的变量。我猜你忘了在“失败”周围加上引号。
    【解决方案3】:

    这可能只是我正在使用的服务器,但即使在实施了可接受的解决方案之后,它也得到了与 OP 相同的错误。原来服务器不想登录,所以删除server.login(fromaddr, "password")行后,错误消失了,它工作了。

    【讨论】:

    • 谢谢,我也遇到了同样的问题!
    【解决方案4】:

    无需调用smtp.connect()smtp.ehlo(),因为它们是由SMTP()smtp.starttls() 自动调用的。只需将端口设置为587 而不是28,即可解决此问题。

    对于客户端使用,如果您对安全策略没有任何特殊要求,强烈建议您使用create_default_context() 函数来创建您的 SSL 上下文。它将加载系统的可信 CA 证书,启用证书验证和主机名检查,并尝试选择合理安全的协议和密码设置。

    一般来说,您会希望使用email 包的功能来构建一封电子邮件,然后您可以通过send_message() 发送。

    import smtplib, ssl
    from email.message import EmailMessage
    
    msg = EmailMessage()
    msg.set_content("The body of the email is here")
    msg["Subject"] = "An Email Alert"
    msg["From"] = "me@example.com"
    msg["To"] = "you@example.com"
    
    context=ssl.create_default_context()
    
    with smtplib.SMTP("smtp.example.com", port=587) as smtp:
        smtp.starttls(context=context)
        smtp.login(msg["From"], "p@55w0rd")
        smtp.send_message(msg)
    

    【讨论】:

    • 谢谢,这以最优雅的方式解决了我的问题。这个答案值得更高的排名。
    【解决方案5】:

    第一次点击是让您的 gmail 帐户通过其他应用程序发送电子邮件,在此部分允许:

    https://myaccount.google.com/lesssecureapps

    然后,您应该可以发送电子邮件

    import json 
    from email.mime.multipart import MIMEMultipart
    from email.mime.text import MIMEText
    import smtplib
    
    msg = MIMEMultipart()
    message = "This is an email"
    
    password = "yourpasswordemailsender"
    msg['From'] = "emailsender@gmail.com"
    msg['To'] = "emailsended@gmail.com"
    msg['Subject'] = "Title of email"
    
    msg.attach(MIMEText(message, 'plain'))
    server = smtplib.SMTP('smtp.gmail.com: 587')
    server.starttls()
    server.login(msg['From'], password)
    server.sendmail(msg['From'], msg['To'], msg.as_string())
    server.quit()
    

    【讨论】:

      【解决方案6】:

      您需要在登录前“启动”。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-06-17
        • 2012-08-10
        • 2012-03-02
        • 1970-01-01
        • 2011-09-15
        • 1970-01-01
        相关资源
        最近更新 更多