如何在没有身份验证的情况下直接向 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 发送电子邮件?