如果不使用gmail,如何从python发送电子邮件?

如果不使用gmail,如何从python发送电子邮件?,python,email,Python,Email,我已经有了用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} -- destinatio

我已经有了用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)
我已经阅读了多重问题或解决常见错误:

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')
还有一个黄色感叹号警告我

编辑2 电子邮件的输出:


我建议粘贴这封空邮件。

我发现连接到谷歌SMTP服务器最可靠的方法是通过应用程序密码

如何获取应用程序密码 去 在登录到谷歌下,确认该账户已进行两步验证。 另外,在登录谷歌下选择应用程序密码。 选择应用程序作为邮件,选择设备作为其他自定义名称,然后将其命名。 复制应用程序密码,它将在一个黄色框中,看起来像:XXXX XXXX XXXX XXXX 在代码中使用应用程序密码
希望这有帮助

如果您对gmail提供的服务不满意,建议您转到另一家提供商,如果您不探索其他选项,这是不完整的

您可以通过TCP端口25将消息直接发送到目标电子邮件服务器。SMTP服务器应在不需要任何授权的情况下从任何客户端接受自己域的邮件。这里的凭证没有问题

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

缩小规模的原因是,如果第一次尝试失败,您必须注意重试——通常使用邮件队列来实现这一目的。一些网站使用灰色列表作为反垃圾邮件措施,第一次尝试将失败


当一封邮件中有多个收件人,并且这样的程序成为真正的SMTP服务器的一个很小的子集时,所有这些就变得不那么繁琐了。您甚至可能想安装一个真正的服务器,比如LinuxPostfix,并将其配置为仅发送,这里提供了一些教程。请注意,有很多配置选项。

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

服务器=smtplib.SMTP'SMTP.newemail.com',端口 用新服务器的smtp替换url和端口。
其余的应该是相同的

我有一个通过雅虎发送电子邮件的功能。你也不需要pip安装任何东西

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')

这显然是一封只有主题和正文的电子邮件最基本的格式,但你可以做的还有很多。如果您想更高级地阅读标准库中的和文档。

对于我来说,使用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')

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')
编辑:

但是,如果您确实想使用另一个smtp服务器,您可以使用outlook作为示例。通过在端口587上连接smtp-mail.outlook.com,我在没有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')

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')

选择另一个您有凭据的SMTP服务器,并将smtplib指向它。或者最好使用一些非SMTP电子邮件网关,如sendgrid、mailgun、mailjet……此网站有一个服务器及其端口列表:抱歉,我不是这方面的专家,但我不知道拥有服务器凭据意味着什么。我有可以创建用于发送电子邮件的假电子邮件地址的凭据。这够了吗,还是我必须做点别的?我不在乎我用的是什么,gmail还是别的什么,只要它总是发送电子邮件,而且不会让人感到痛苦。@ThomasBrefeld我不是这方面的专家。我不知道如何使用你发送给我的列表来更改我的脚本。有什么想法/帮助吗?@Pinocchio几年前我用过谷歌的SMTP服务器,它工作得很好。我记得我有很多问题,直到我允许在帐户中使用不太安全的应用程序,之后一切似乎都正常了。我相信你已经尝试过了,但是你能确保该帐户允许不太安全的应用程序吗。你也可以发布EmailMessage或它返回的内容吗?我只想要一个易于使用和工作的python脚本…我如何更改配置,使我不会像你建议的那样使用google。您有示例代码吗?简单的脚本只是一个客户端请求服务器发送消息。您必须从选择服务器开始。当您达成协议,允许您使用某个特定的服务器时,您将获得该服务器的地址、登录名和密码。用这些新数据替换gmail的数据。不要期望找到一个没有帐户就可以使用的免费服务器。你能提供一个你认为可以可靠工作的具体示例吗?你是否尝试过从多个服务器上执行此操作?我使用outlook服务器实现了这一点。这里不需要SSL。这不是100%的意思…我的用例是连接到HPC集群中的任意计算节点。回答不错。。。。
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')