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

时间:2012-03-19 00:03:09

标签: python authentication smtp gmail

我希望直接从脚本发送电子邮件到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)

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

(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记录等?

3 个答案:

答案 0 :(得分:28)

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

  

我想直接从脚本发送电子邮件到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. 

由于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']
msg = '''
    From: {fromaddr}
    To: {toaddr}
    Subject: testin'     
    This is a test 
    .
'''

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代码段

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

答案 1 :(得分:9)

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

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

答案 2 :(得分:1)

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