これが私のスクリプトです:
#!/usr/bin/python
import smtplib
msg = 'Hello world.'
server = smtplib.SMTP('smtp.gmail.com',587) #port 465 or 587
server.ehlo()
server.starttls()
server.ehlo()
server.login('[email protected]','mypass')
server.sendmail('[email protected]','[email protected]',msg)
server.close()
Gmailアカウントからメールを送信しようとしています。 Gmailの要件により、スクリプトはstarttlsを使用します。 1and1とwebfactionの2つのWebホストでこれを試しました。 1and1は「接続が拒否されました」エラーを表示し、webfactionはエラーを報告しませんが、電子メールを送信しません。スクリプトに問題はないので、Webホストに関連している可能性があると思います。どんな考えやコメントもいただければ幸いです。
編集:私はデバッグモードをオンにしました。出力から、メッセージが正常に送信されたように見えます...私はそれをまったく受信しません。
send: 'ehlo web65.webfaction.com\r\n'
reply: '250-mx.google.com at your service, [174.133.21.84]\r\n'
reply: '250-SIZE 35651584\r\n'
reply: '250-8BITMIME\r\n'
reply: '250-STARTTLS\r\n'
reply: '250-ENHANCEDSTATUSCODES\r\n'
reply: '250 PIPELINING\r\n'
reply: retcode (250); Msg: mx.google.com at your service, [174.133.21.84]
SIZE 35651584
8BITMIME
STARTTLS
ENHANCEDSTATUSCODES
PIPELINING
send: 'STARTTLS\r\n'
reply: '220 2.0.0 Ready to start TLS\r\n'
reply: retcode (220); Msg: 2.0.0 Ready to start TLS
send: 'ehlo web65.webfaction.com\r\n'
reply: '250-mx.google.com at your service, [174.133.21.84]\r\n'
reply: '250-SIZE 35651584\r\n'
reply: '250-8BITMIME\r\n'
reply: '250-AUTH LOGIN PLAIN\r\n'
reply: '250-ENHANCEDSTATUSCODES\r\n'
reply: '250 PIPELINING\r\n'
reply: retcode (250); Msg: mx.google.com at your service, [174.133.21.84]
SIZE 35651584
8BITMIME
AUTH LOGIN PLAIN
ENHANCEDSTATUSCODES
PIPELINING
send: 'AUTH PLAIN *****\r\n'
reply: '235 2.7.0 Accepted\r\n'
reply: retcode (235); Msg: 2.7.0 Accepted
send: 'mail FROM:<[email protected]> size=12\r\n'
reply: '250 2.1.0 OK 4sm652580yxq.48\r\n'
reply: retcode (250); Msg: 2.1.0 OK 4sm652580yxq.48
send: 'rcpt TO:<[email protected]>\r\n'
reply: '250 2.1.5 OK 4sm652580yxq.48\r\n'
reply: retcode (250); Msg: 2.1.5 OK 4sm652580yxq.48
send: 'data\r\n'
reply: '354 Go ahead 4sm652580yxq.48\r\n'
reply: retcode (354); Msg: Go ahead 4sm652580yxq.48
data: (354, 'Go ahead 4sm652580yxq.48')
send: 'Hello world.\r\n.\r\n'
reply: '250 2.0.0 OK 1240421143 4sm652580yxq.48\r\n'
reply: retcode (250); Msg: 2.0.0 OK 1240421143 4sm652580yxq.48
data: (250, '2.0.0 OK 1240421143 4sm652580yxq.48')
GMail SMTPサーバーは、接続元のIPアドレスで逆DNSルックアップを実行し、ドメインが見つからない場合は接続を拒否すると思います。これは、スパマーがSMTPサーバーを第三者中継として使用しないようにするためです。
OPがまだこの回答を気にするかどうかはわかりませんが、同様の問題をトラブルシューティングするためにここにいることがわかりました。結局のところ、GoogleはSMTPサーバーの使用を許可する方法を変更しました。いくつかのことを確認する必要があります。
「from」アドレスとして認証に使用したのと同じアドレスを使用していること。私が間違っていない場合は、fromフィールドにほとんど何でも入れられる場合がありましたが、セキュリティ上の理由から、多くのSMTPホストサイト(googleを含む)は、これを、認証されたアドレスに制限しています。
「安全性の低いアプリ」からアカウントへのアクセスを許可します(読み取り:収益を生み出さないアプリ)。これを行うには、アカウントにログインして、ここに移動します: https://www.google.com/settings/security/lesssecureapps
Tlsでポート587を使用します。理由はよくわかりませんが、ポート465でニースをプレイすることはできませんでした。
これが誰かを助けることを願っています。
ここではいくつかの自己宣伝がありますが、私は正当な理由で感じています。
文字通りこのコードが必要なのは、あなたが書いたことを正確に実行するためだけです。
_import yagmail
yag = yagmail.SMTP('[email protected]')
yag.send('[email protected]', subject = None, contents = 'Hello')
_
またはワンライナー:
_yagmail.SMTP('[email protected]').send('[email protected]', None, 'Hello world.')
_
いいのは、キーリングを使用してパスワードを保存することを提案しているため、スクリプトでパスワードが他人に見られる危険性はありません。
インタプリタで一度実行することでこれを設定できます:
_import yagmail
yagmail.register("[email protected]", "mypassword")
_
そして終了します。その後、次のように使用できます。
_import yagmail
yagmail.SMTP("[email protected]") # without password
_
ホームディレクトリに「[email protected]」を含む.yagmailを追加すると、次のようにできます:yagmail.SMTP()
。しかし、今のところ、それは無意味です。
警告:大量のメッセージを送信することを真剣に考えている場合は、OAuth2を適切に設定すると、yagmailが役立ちます。
_yagmail.SMTP("[email protected]", oauth2_file="/path/to/save/creds.json")
_
初めて実行したときは、OAuth2の認証情報を取得してファイルに保存するプロセスを案内するので、次回は何もする必要がありません。誰かがあなたの資格を見つけたと思いますか?権限は制限されますが、Gmailを使用して資格情報を無効にすることをお勧めします。
パッケージ/インストールについては、 git または readthedocs を参照してください。Python 2および3の両方で使用できます。
有効なメッセージを作成してみましたか?
from email.MIMEText import MIMEText
msg = MIMEText('body')
msg['Subject'] = 'subject'
msg['From'] = "..."
msg['Reply-to'] = "..."
msg['To'] = "..."
アカウントからアカウントに送信されたメッセージが表示される可能性が最も高いので、GMailの[送信済み]フォルダを確認する必要があります。
私は上記のリンクに行き、送信する3つの異なるアドレスがありましたが、同じアドレスに#3のアドレスである3つのメールを受信しました。
http://mynthon.net/howto/-/python/python%20-%20logging.SMTPHandler-how-to-use-gmail-smtp-server.txt
import logging
import logging.handlers
class TlsSMTPHandler(logging.handlers.SMTPHandler):
def emit(self, record):
"""
Emit a record.
Format the record and send it to the specified addressees.
"""
try:
import smtplib
import string # for tls add this line
try:
from email.utils import formatdate
except ImportError:
formatdate = self.date_time
port = self.mailport
if not port:
port = smtplib.SMTP_PORT
smtp = smtplib.SMTP(self.mailhost, port)
msg = self.format(record)
msg = "From: %s\r\nTo: %s\r\nSubject: %s\r\nDate: %s\r\n\r\n%s" % (
self.fromaddr,
string.join(self.toaddrs, ","),
self.getSubject(record),
formatdate(), msg)
if self.username:
smtp.ehlo() # for tls add this line
smtp.starttls() # for tls add this line
smtp.ehlo() # for tls add this line
smtp.login(self.username, self.password)
smtp.sendmail(self.fromaddr, self.toaddrs, msg)
smtp.quit()
except (KeyboardInterrupt, SystemExit):
raise
except:
self.handleError(record)
logger = logging.getLogger()
gm = TlsSMTPHandler(("smtp.gmail.com", 587), '[email protected]', ['[email protected]', '[email protected]', '[email protected]'], 'unable to find Error!', ('[email protected]', 'mypassword'))
gm.setLevel(logging.ERROR)
logger.addHandler(gm)
try:
1/0
except:
logger.exception('It NO work for me!!-')
それは作品です
'''
Created on 2017/11/27
@author: devuser
'''
import smtplib
from email.mime.text import MIMEText
from email.utils import formatdate
FROM_ADDRESS = '[email protected]'
MY_PASSWORD = 'password'
TO_ADDRESS = '[email protected]'
BCC = '[email protected]'
SUBJECT = 'GmailのSMTPサーバ経由'
BODY = 'pythonでメール送信'
def create_message(from_addr, to_addr, bcc_addrs, subject, body):
msg = MIMEText(body)
msg['Subject'] = subject
msg['From'] = from_addr
msg['To'] = to_addr
msg['Bcc'] = bcc_addrs
msg['Date'] = formatdate()
return msg
def send(from_addr, to_addrs, msg):
smtpobj = smtplib.SMTP('smtp.gmail.com', 587)
smtpobj.ehlo()
smtpobj.starttls()
smtpobj.ehlo()
smtpobj.login(FROM_ADDRESS, MY_PASSWORD)
smtpobj.sendmail(from_addr, to_addrs, msg.as_string())
smtpobj.close()
if __name__ == '__main__':
to_addr = TO_ADDRESS
subject = SUBJECT
body = BODY
msg = create_message(FROM_ADDRESS, to_addr, BCC, subject, body)
send(FROM_ADDRESS, to_addr, msg)