【问题标题】:How to send a mail directly to SMTP server without authentication?如何在没有身份验证的情况下直接向 SMTP 服务器发送邮件?
【发布时间】:2012-04-03 13:00:28
【问题描述】:

我想通过直接连接到smtp.gmail.com,直接从脚本向 Gmail 电子邮件帐户发送电子邮件。

但是,我不希望脚本中包含 gmail 密码。根据我的阅读,Gmail 似乎需要进行身份验证才能发送任何邮件,包括发送给自己的用户。

我的问题是,来自另一台 SMTP 服务器的邮件是如何传递的,因为该 SMTP 服务器没有 Gmail 凭据。 Gmail 是否只需要对“匿名”发件人进行身份验证,并且由于我的脚本在个人计算机上运行,​​因此它需要更高的安全性?这是我正在运行的 python 脚本:

import smtplib
import email
msg = email.message.Message()
msg["From"] = "user@gmail.com"
msg["To"] = "user@gmail.com"
msg["Subject"] = "Test message"
server = smtplib.SMTP("smtp.gmail.com",587)
server.starttls()
server.ehlo_or_helo_if_needed()
try:
    failed = server.sendmail("user@gmail.com","user@gmail.com", msg.as_string())
    server.close()
except Exception as e:
    print(e)

当我运行这个脚本时,输出是:

(530, b'5.5.1 Authentication Required. Learn more at
5.5.1 http://support.google.com/mail/bin/answer.py?answer=14257 fw5sm21125889wib.0', 'user@gmail.com')

我的问题是,外部 SMTP 服务器如何避免这个问题?他们所做的一切是否可以在本地脚本中复制,还是需要正确的反向 DNS 记录、SPF 记录等?

【问题讨论】:

    标签: python authentication smtp gmail


    【解决方案1】:

    这是一个非常好的问题,我正在内联回复。

    我想通过直接连接到 smtp.gmail.com 直接从脚本向 Gmail 电子邮件帐户发送电子邮件。

    首先 smtp.gmail.com 不是接受邮件(来自其他邮件服务器)的邮件服务器,而是允许 Gmail 用户登录并因此发送或检查电子邮件。如果我们想找出接受来自其他邮件服务器的邮件的 Gmail 邮件服务器。我们可以在终端上运行以下cmd:

    dig mx gmail.com +short

    输出:

    10 alt1.gmail-smtp-in.l.google.com.
    40 alt4.gmail-smtp-in.l.google.com.
    5 gmail-smtp-in.l.google.com.
    30 alt3.gmail-smtp-in.l.google.com.
    20 alt2.gmail-smtp-in.l.google.com. 
    

    由于gmail-smtp-in.l.google.com. 的最低值为5,我们将其用作首选邮件服务器

    但是,我不希望脚本中包含 gmail 密码。根据我的阅读,Gmail 似乎需要身份验证才能发送任何邮件,包括发送给自己的用户。

    只有一个人使用 smtp.gmail.com 登录和发送/检查电子邮件到/从他们各自的帐户,因此我们需要用户凭据。但是,我们在向其邮件服务器发送电子邮件时不需要凭据,即 gmail-smtp-in.l.google.com(示例如下)

    我的问题是,来自另一台 SMTP 服务器的邮件是如何传递的,因为该 SMTP 服务器没有 Gmail 凭据。 Gmail 是否只需要对“匿名”发件人进行身份验证,并且由于我的脚本在个人计算机上运行,​​因此需要更高的安全性?这是我正在运行的 python 脚本:

    正如我在上面的讨论中明确表示的那样,我们不需要 Gmail 凭据来连接到 Gmail 邮件服务器,但是如果我们使用个人连接到 Gmail 邮件服务器计算机我们可以发送几封电子邮件,但要发送更多电子邮件,我们需要使用 DKIM、SPF 等建立域声誉和问责制(这是一个完全不同的范围)。

    以下 python 脚本无需身份验证即可向 gmail 帐户发送电子邮件。

    import smtplib
    
    fromaddr = 'sending@example.com'
    toaddrs  = ['receiving@gmail.com']
    # string inside msg below must have "Subject: <subject line>\n"
    # for a subject to be sent, and "To: " for the recipient to be shown in the email
    msg = '''To: receiving@gmail.com
        Subject: Subject line here\n
        The body goes here
        .
    '''
    
    msg = msg.format(fromaddr =fromaddr, toaddr = toaddrs[0])
    # The actual mail send
    server = smtplib.SMTP('gmail-smtp-in.l.google.com:25')
    server.starttls()
    server.ehlo("example.com")
    server.mail(fromaddr)
    server.rcpt(toaddrs[0])
    server.data(msg)
    server.quit()  
    

    或者试试下面的 Telnet sn -p

    telnet gmail-smtp-in.l.google.com 25
    
    HELO sendingdomain.com
    
    MAIL FROM:<user@sending.com>
    
    RCPT TO:<playingwithtelnet@gmail.com>
    
    DATA
    From: <user@sending.com>
    To: <playingwithtelnet@gmail.com>
    Subject: Just a test email
    
    The body of the mail goes here.          
    .
    
    QUIT
    

    【讨论】:

    • 这里的“25”代表什么? @MaK
    • 25 是 SMTP 端口,用于与邮件服务器通信。 en.m.wikipedia.org/wiki/Simple_Mail_Transfer_Protocol
    • 是的@Mak,但它是静态的吗?还是动态的?他们有可用的端口吗?
    • @MohideenibnMohammed 不太确定您的问题。 25 是 SMTP 协议的通用端口,在该上下文中它是静态的。
    • @user3225309 如果您的 ip 地址列在 spamhaus 数据库中,则它不起作用:SpamHaus。您可以按照那里的说明删除您的 ip。我知道,因为一周前我遇到了同样的问题。删除了我的 ip,现在它工作正常。 :) 不确定是否会永远有效,但我只是想学习一些东西,它已经完成了。看看这个:stackoverflow.com/a/20235665/5482966
    【解决方案2】:

    您可以使用一些无需身份验证的外部 SMTP 服务器(或本地 SMTP),但发送的邮件将被 Google 的垃圾邮件过滤器捕获,因为 msg["From"]@ google.com,而实际的 SMTP 不是 smtp.gmail.com

    那些 SMTP 服务器也必须在 ISP 的 DNS 中有正确的反向区域,否则这个 smtp 将被 google 阻止。

    【讨论】:

      【解决方案3】:

      您不能在没有身份验证的情况下使用 gmail smtp-server。这是谷歌的政策。您需要输入您的帐户密码。但还有另一种方式。您可以将 GAE (Google App Engine) 与 Gmail API 一起使用。这样就可以直接发送消息了。

      【讨论】:

        猜你喜欢
        • 2021-08-13
        • 1970-01-01
        • 2013-10-27
        • 2016-01-06
        • 2014-08-11
        • 2020-10-28
        • 1970-01-01
        • 2010-10-12
        相关资源
        最近更新 更多