web-dev-qa-db-ja.com

認証なしでSMTPサーバーに直接メールを送信する方法

smtp.gmail.comに直接接続して、スクリプトからGmailメールアカウントにメールを直接送信したい。

ただし、スクリプトにgmailパスワードを含めないことをお勧めします。私が読んだことから、Gmailが自分のユーザーを含むメールを配信する前に認証が必要なようです。

私の質問は、別のSMTPサーバーからのメールはどのように配信されるのかということです。SMTPサーバーにはGmailの資格情報がないためです。 Gmailでは、「anonymous」の送信者の認証のみが必要ですか。また、スクリプトはパーソナルコンピューターで実行されているため、セキュリティが強化されますか? python私が実行しているスクリプトは次のとおりです。

import smtplib
import email
msg = email.message.Message()
msg["From"] = "[email protected]"
msg["To"] = "[email protected]"
msg["Subject"] = "Test message"
server = smtplib.SMTP("smtp.gmail.com",587)
server.starttls()
server.ehlo_or_helo_if_needed()
try:
    failed = server.sendmail("[email protected]","[email protected]", 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', '[email protected]')

私の質問は、外部SMTPサーバーがこの問題をどのように回避するかです。そして、ローカルスクリプトでレプリケートできるものは何ですか、それとも正しいリバースDNSレコード、SPFレコードなどが必要ですか?

19
janak

認証なしでいくつかの外部SMTPサーバー(またはローカルSMTP)を使用できますが、送信されたメッセージはmsg ["From"]@ google。 com、実際のSMTPはsmtp.gmail.comではありません。

これらのSMTPサーバーには、ISPのDNSに正しい逆ゾーンが必要です。そうでない場合、このsmtpはgoogleによってブロックされます。

10
maxsocl

それは本当に良い質問であり、私はインラインで返信しています。

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 = '[email protected]'
toaddrs  = ['[email protected]']
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:<[email protected]>

RCPT TO:<[email protected]>

DATA
From: <[email protected]>
To: <[email protected]>
Subject: Just a test email

The body of the mail goes here.          
.

QUIT
32
MaK

認証なしでgmail smtp-serverを使用することはできません。これはGoogleのポリシーです。アカウントのパスワードを入力する必要があります。しかし、別の方法があります。 GAE(Google App Engine)をGmail APIで使用できます。この方法で、メッセージを直接送信できます。

1
SkyFox