我希望直接从脚本发送电子邮件到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记录等?
答案 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一起使用。通过这种方式,您可以直接发送消息。