如何在没有身份验证的情况下直接将邮件发送到SMTP服

jan*_*nak 21 python authentication gmail smtp

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

但是,我宁愿不在脚本中使用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)
Run Code Online (Sandbox Code Playgroud)

当我运行此脚本时,输出为:

(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')
Run Code Online (Sandbox Code Playgroud)

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

MaK*_*MaK 34

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

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

首先,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. 
Run Code Online (Sandbox Code Playgroud)

由于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()  
Run Code Online (Sandbox Code Playgroud)

或者尝试以下Telnet代码段

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
Run Code Online (Sandbox Code Playgroud)

  • @user3225309 如果您的 IP 地址列在 spamhaus 数据库中,则不起作用:[SpamHaus](https://www.spamhaus.org/pbl/)。您可以按照那里的说明删除您的 IP。我知道,因为一周前我遇到了同样的问题。我的IP被删除了,现在工作正常了。:) 不确定是否会永远有效,但我只是想学习一些东西,然后就完成了。看看这个:/sf/answers/1416496581/ (2认同)

max*_*ocl 10

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

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