【问题标题】:How does one send an e-mail from python NOT using gmail?如何不使用 gmail 从 python 发送电子邮件?
【发布时间】:2020-07-13 11:23:27
【问题描述】:

我已经有了用 python 发送电子邮件的代码:

def send_email_gmail(subject, message, destination):
    """ Send an e-mail using gmail with message to destination email.

    Arguments:
        message {str} -- message string to send.
        destination {str} -- destination email (as string)
    """
    server = smtplib.SMTP('smtp.gmail.com', 587)
    server.starttls()
    # not a real email account nor password, its all ok!
    server.login('me123@gmail.com', 'fakepassword111!!!')

    # craft message
    msg = EmailMessage()

    message = f'{message}\n'
    msg.set_content(message)
    msg['Subject'] = subject
    msg['From'] = 'me123@gmail.com'
    msg['To'] = destination
    # send msg
    server.send_message(msg)

我已经阅读了解决常见错误的多个问题(Login credentials not working with Gmail SMTPSMTPAuthenticationError when sending mail using gmail and python):

smtplib.SMTPAuthenticationError: (534, b'5.7.14 <https://accounts.google.com/signin/continue?sadfdgjsfgrp=1&dsfgscc=1dsdfgsfg&pldsfgt=AKsdfsdfggsdfggnsbu\n5.7.14 G0crCr0qSvWTng9xRE_pd3WnK3S2sDMsdfgsdfgX0J-xoetn7aHyFQi2qYrQisdfgsdfgKIwMCcgD7zLB1t7Z\n5.7.14 -OjHjpJqasdftBuTi9wh0sYlNW637SmPLuMnnLGn_WcZX5TGH4sddsfgXYar-Aasdfw0ctWfLhasdffPQV>\n5.7.14 Please log in via your web browser and then try again.\n5.7.14  Learn more at\n5.7.14  https://support.google.com/mail/answer/787521345364524 n21sm17577sadfdsf46qtn.17 - gsmtp')

无论如何,我按照这些答案的建议做了,但我仍然遇到错误。所以我决定我不想再为此使用 gmail。我从一个虚假帐户发送电子邮件只是为了发送电子邮件,所以它的安全性对我来说并不重要。

那么如何更改上面的代码,使其适用于在 python/code 中发送电子邮件更可靠的不同电子邮件服务?

想法答案将包含自包含并包含有效的示例脚本。


编辑1:

我当然检查过在我的假 gmail 上打开不太安全的应用程序功能,复制粘贴该页面内容的文本:

Turn off less secure app access
Your account is vulnerable to malicious activity because you’re allowing apps & devices that use less secure sign-in technology to access your account. You should turn off this type of access. Google will automatically turn this setting OFF if it’s not being used. Learn more

还有一个黄色感叹号警告我。


编辑2

EmailMessage()的输出:


按照建议,我粘贴了这个(空消息)。

【问题讨论】:

  • 选择另一个您拥有凭据的 SMTP 服务器,并将 smtplib 指向它。或者最好使用一些非 SMTP 电子邮件网关,例如 sendgrid、mailgun、mailjet,...
  • 这个网站有一个服务器列表和它们的端口:arclab.com/en/kb/email/…
  • 抱歉,我不是这方面的专家,但我不知道拥有服务器凭据意味着什么。我有可以创建用于发送电子邮件的虚假电子邮件地址的凭据。这足够了吗,还是我必须做其他事情?我不在乎我使用什么,gmail 或其他什么,只要它总是发送电子邮件并且不痛苦。
  • @ThomasBrefeld 我不是这方面的专家。我不知道如何使用您发送给我的列表来更改我的脚本。有什么想法/帮助吗?
  • @Pinocchio 几年前我使用过 google 的 SMTP 服务器,它运行良好。我记得我遇到了很多问题,直到我允许使用该帐户的安全性较低的应用程序,之后一切似乎都正常了。我确定您已经尝试过了,但您能否确保该帐户允许安全性较低的应用程序。您还可以发布“EmailMessage()”还是它返回的内容?

标签: python email


【解决方案1】:

对我来说,当我使用 SSL 登录时,它的工作方式与预期一样,如下所示:

import smtplib, ssl
from email.mime.text import MIMEText


def send_email_gmail(subject, message, destination):
    # First assemble the message
    msg = MIMEText(message, 'plain')
    msg['Subject'] = subject

    # Login and send the message
    port = 465
    my_mail = 'me123@gmail.com'
    my_password = 'fakepassword111!!!'
    context = ssl.create_default_context() 
    with smtplib.SMTP_SSL('smtp.gmail.com', port, context=context) as server:
        server.login(my_mail, my_password)
        server.sendmail(my_mail, destination, msg.as_string())


send_email_gmail('Test subject', 'This is the message', 'to_email@email.com')

编辑:

但是,如果您真的想使用另一个 smtp 服务器,您可以使用例如 Outlook。通过连接到端口 587 上的 smtp-mail.outlook.com,我可以在没有 SSL 的情况下使用它,如下所示:

def send_email_gmail(subject, message, destination):
    # First assemble the message
    msg = MIMEText(message, 'plain')
    msg['Subject'] = subject

    # Login and send the message
    port = 587
    my_mail = 'my_mail@hotmail.com'
    my_password = 'my_password'
    with smtplib.SMTP('smtp-mail.outlook.com', port) as server:
        server.starttls()
        server.login(my_mail, my_password)
        server.sendmail(my_mail, destination, msg.as_string())

send_email_gmail('Test', 'Bericht', 'm.drillenburg@gmail.com')

【讨论】:

  • 您是否尝试过从多个服务器执行此操作?
  • 我使用 Outlook 服务器让它工作。这里不需要 SSL。
  • 不是 100% 这意味着...我的用例是连接到 HPC 集群中的任意计算节点。
【解决方案2】:

我有一个用来通过 yahoo 发送电子邮件的功能。你也不需要pip install 任何东西。

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


def send_email(subject, to_email, message):
    password = "some_password"  # needs to be changed
    my_email = "some_email@yahoo.com"  # needs to be changed
    smtp_obj = smtplib.SMTP('smtp.mail.yahoo.com', 587)
    smtp_obj.starttls()
    smtp_obj.ehlo()
    smtp_obj.login(my_email, password)
    msg = MIMEMultipart()
    msg['From'] = my_email
    msg['To'] = to_email
    msg['Subject'] = subject
    msg.attach(MIMEText(message, 'plain'))
    smtp_obj.sendmail(msg['From'], msg['To'], msg.as_string())
    smtp_obj.quit()


if __name__ == '__main__':
    send_email('Subject: Automated e-mail', 'my_test_email@test.com', 'This was sent via script')

对于只有主题和正文的电子邮件来说,这显然是最基本的格式,但您可以做的还有很多。如果您想更深入地阅读标准库中的 emailsmtplib 文档。

【讨论】:

    【解决方案3】:

    如果您只需要另一个电子邮件地址,请查找新电子邮件服务器的 SMTP。

    server = smtplib.SMTP('smtp.newemail.com', port)
    # replace the url and port with your new server's smtp.
    

    其余的应该是一样的

    【讨论】:

    • 你能提供一个你认为可能可靠工作的具体例子吗?
    【解决方案4】:

    如果您对 gmail 提供的服务不满意,如果不探索其他选项,建议您切换到其他提供商是不完整的。

    您可以通过 TCP 端口 25 将消息直接发送到目标电子邮件服务器。SMTP 服务器应该接受来自任何客户端的“自己”域的消息,而无需任何授权。这里的凭据没有问题。

    可以通过查找收件人电子邮件域的 MX 记录(MX 代表邮件交换器)从 DNS 获取该服务器的地址。通常有几个。 MX 主机具有偏好(最低数字 = 最高偏好),为了获得最佳结果,应按照从最高偏好到最低偏好的顺序与他们联系,直到邮件被接受。

    缩小规模是,如果第一次尝试失败,您必须注意重试 - 通常使用邮件队列来实现此目的。一些网站使用“灰名单”作为反垃圾邮件措施,第一次尝试将失败。

    当邮件中有多个收件人并且此类程序成为真正 SMTP 服务器的一小部分时,所有这些都变得不那么琐碎了。你甚至可能想要安装一个像 Linux “postfix”这样的真实服务器并将其配置为只发送,有可用的教程。请注意,有大量的配置选项。

    【讨论】:

    • 我只想要一个易于使用且工作的python脚本......我如何更改配置,以便我不按照您的建议使用google。有示例代码吗?
    • 一个简单的脚本只是一个客户端请求服务器发送消息。您必须从选择服务器开始。当您达成协议允许您使用某些特定服务器时,您将获得其地址、您的登录名和密码。用这些新数据替换 gmail 的数据。不要期望找到无需帐户即可使用的免费服务器。
    【解决方案5】:

    我发现连接到 google 的 SMTP 服务器最可靠的方法是通过应用密码。


    如何获取应用密码

    1. 转至manage my google account
    2. 在“登录 Google”下,确认帐户的“两步验证”已启用。
    3. 也在“登录 Google”下选择“应用密码”。
    4. 选择应用程序为“邮件”,选择设备为“其他(自定义名称)”并命名。
    5. 复制app密码,会出现在一个黄色的框里,看起来像:“XXXX XXXX XXXX XXXX”

    在代码中使用应用密码

    import smtplib
    from email.message import EmailMessage
    
    def send_email_gmail(subject, message, destination):
        server = smtplib.SMTP('smtp.gmail.com', 587)
        server.starttls()
        #This is where you would replace your password with the app password
        server.login('account@gmail.com', 'App_Password')
    
        msg = EmailMessage()
    
        message = f'{message}\n'
        msg.set_content(message)
        msg['Subject'] = subject
        msg['From'] = 'me123@gmail.com'
        msg['To'] = destination
        server.send_message(msg)
    
    send_email_gmail('Test subject', 'This is the message', 'to_email@email.com')
    

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-12
      • 2017-04-01
      • 1970-01-01
      • 2016-03-22
      • 1970-01-01
      • 2013-10-17
      • 2016-02-09
      相关资源
      最近更新 更多