【问题标题】:Send email using my yahoo account - error message使用我的雅虎帐户发送电子邮件 - 错误消息
【发布时间】:2016-12-01 07:34:43
【问题描述】:

我使用 Python 3.5.2。

我正在尝试使用我的雅虎帐户发送电子邮件。我根据这个网站使用yahoo SMTP 服务器域名smtp.mail.yahoo.com `http://neerajbyte.com/send-email-through-python-console-with-gmail-hotmail-and-yahoo/'。但是我收到一条错误消息(如下)。通常出于安全原因谷歌,我试过了,会向我发送一封电子邮件,通知我有一个应用程序试图访问我的帐户,我必须点击一个链接才能允许它。但是我没有收到来自雅虎的电子邮件,只是这个错误消息,不知道为什么。

这是我的代码:

>>> import smtplib
>>> conn = smtplib.SMTP('smtp.mail.yahoo.com', 587)
>>> type(conn)
<class 'smtplib.SMTP'>
>>> conn
<smtplib.SMTP object at 0x02AD9A70>
>>> conn.ehlo()
(250, b'smtp.mail.yahoo.com\nPIPELINING\nSIZE 41697280\n8 BITMIME\nSTARTTLS')
>>> conn.starttls
<bound method SMTP.starttls of <smtplib.SMTP object at 0x02AD9A70>>
>>> conn.login('j@yahoo.com', 'j2')

这是我的错误信息:

_Traceback (most recent call last):
  File "<pyshell#6>", line 1, in <module>
    conn.login('j@yahoo.com', 'j2')
  File "C:\Users\J\AppData\Local\Programs\Python\Python35-32\lib\smtplib.py", line 696, in login
    "SMTP AUTH extension not supported by server.")
smtplib.SMTPNotSupportedError: SMTP AUTH extension not supported by server.
_

【问题讨论】:

    标签: python email smtp smtplib yahoo-mail


    【解决方案1】:

    据我所知,Yahoo 和 Gmail 在尝试从应用程序登录时需要双重身份验证。这些是步骤:

    1. 在 Yahoo 中,您可以转到 Account Info。

    2. 单击左侧的“帐户安全”选项卡。启用两步验证。然后,当您第一次尝试此操作时,您将获得选择验证方法的选项。通常我选择通过 SMS 的 OTP。

    3. 然后您可以管理应用密码。这将弹出一个弹出窗口以生成 16 个字符的密码。这是您在登录邮件时可以在应用中使用的内容。

    以下是示例屏幕截图:

    【讨论】:

    • 如何通过短信选择OTP?我按照您提到的内容进行操作,但仍然无法访问。我启用了允许使用不太安全登录的应用程序。我点击 Manage app passwords,然后输入 Python smtplib,它会生成一个 16 个字母的密码。我将这个 16 个字母的密码输入到此代码(如下)中,但仍然有相同的错误消息。 conn.login('j@yahoo.com', 'jgjt apbo btwj qcwq')
    • 密码中没有空格。删除空格并尝试。
    • 不确定。如果不是 OTP/SMS,你的第二个身份验证因素是什么?也许您需要注销,清除浏览器缓存并重试。
    • 我怎么知道我的第二个身份验证因素是什么?然后我注销并清除浏览器并再次尝试,同样的错误消息。
    • 好的,它适用于我的 gmail 但不适用于雅虎。当我有时间时,我会对此进行一些调查。谢谢
    【解决方案2】:

    关注文章https://support.google.com/accounts/answer/185833?hl=en

    使用 ansible 邮件模块为 gmail 通知创建和使用应用密码。

    生成应用程序密码,并在您的 anisble playbook 中使用相同的 16 位应用程序密码

    - 名称:'ansible 邮件模块到 gmail 通知' 邮件: 主机:smtp.gmail.com 子类型:html 港口:587 密码: ************** 至:XXXXXXXXX@gmail.com 发件人:YYYYYYYYYY.YYYY@gmail.com 用户名:YYYYYYYYYY.YYYY@gmail.com 主题:用户详细信息报告 附:/tmp/data_details/data_details.csv 正文:{{查找('文件','/tmp/data_details/data_details.csv')}} 委托人:本地主机

    现在尝试发送电子邮件它应该可以工作。 我已经成功测试并且它正在工作。

    【讨论】:

      【解决方案3】:

      在为邮件模块编写剧本时使用 ansible vault 密码字符串变量的另一种最佳方法。不要危及安全风险。

      我已经实现了使用邮件模块发送电子邮件的相同功能,并且它按预期工作。

      ansible-vault encrypt_string yourgmailapppassword --name gmail_password
      

      使用上述方法使用 ansible vault string 选项加密 gmail 应用程序密码,并将加密变量定义到 playbook 中。

      cat fetch-users-deatils.yml
      
          - name: Linux servers user audit report preparation
            hosts: "{{ HOSTS }}"
            roles:
              - user-collections
          
          - name: Refreshing user Dashboard & sending email from localhost
            hosts: localhost
            become: false
            vars:
             - gmail_password: !vault |
                    $ANSIBLE_VAULT;1.1;AES256
                    62613232383962323430633831113465356231563163366235353034393230656331663436646233
                    3266353862303738303737383530313664356135336661390a336562613436626665333833323030
                    61393135643433313930643337363465343332353716333831222766376137396430426361663633
                    6233313433633231320a663435636230636431643731333166366435346564316331323361633566
                    38622138392437888466666535323432653034323936353961646233613437343831
            tasks:
              - name: Collecting the user details information and recreating the users dashboard
                script: dashboard_user.sh
                tags: user_dashboard
          
          
              - name: User Audit data output file stored on below location
                debug:
                  msg:
                   /tmp/user_collection/user_details.csv
          
              - name: 'Sending Ansible users report email'
                mail:
                  host: smtp.gmail.com
                  subtype: html
                  port: 587
                  password: "{{ gmail_password }}"
                  to: abcdefghijkl@gmail.com
                  from: abcdefghijkl@gmail.com
                  username: abcdefghijkl@gmail.com
                  subject: User details report
                  attach: /tmp/user_collection/user_details.csv
                  body: <pre> {{ lookup('file', '/tmp/user_collection/user_details.csv') }} </pre>
                delegate_to: localhost
      

      下面是ansible playbook执行命令

      ansible-playbook fetch-users-deatils.yml -e "HOSTS=all" --ask-vault-pass
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-09-19
        • 1970-01-01
        • 1970-01-01
        • 2016-02-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多