如何在没有身份验证的情况下直接向 SMTP 服务器发送邮件?

Posted

技术标签:

【中文标题】如何在没有身份验证的情况下直接向 SMTP 服务器发送邮件?【英文标题】:How to send a mail directly to SMTP server without authentication? 【发布时间】: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 记录等?

【问题讨论】:

【参考方案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,现在它工作正常。 :) 不确定是否会永远有效,但我只是想学习一些东西,它已经完成了。看看这个:***.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 一起使用。这样就可以直接发送消息了。

【讨论】:

以上是关于如何在没有身份验证的情况下直接向 SMTP 服务器发送邮件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有客户端身份验证的情况下从服务器验证 Firebase 用户?

如何使用 google smtp 服务器从 django 发送电子邮件?

如何在没有硬编码 NetworkCredentials 的情况下使用 System.Net.Mail?

禁用 rcpt 命令

SMTP 身份验证用户名是啥

如何在没有 Microsoft 身份的情况下对 blazor 服务器进行 jwt 身份验证?