私はPython経由で電子メールを送信する方法を理解しようとして(失敗して)います。
ここから例を試す: http://docs.python.org/library/smtplib.html#smtplib.SMTP
しかし、SSL接続がないという返事を受け取った後、server = smtplib.SMTP_SSL('smtp.gmail.com', 465)
という行を追加しました。
今私はこれを手に入れています:
Traceback (most recent call last):
File "C:/Python26/08_emailconnects/12_29_EmailSendExample_NotWorkingYet.py", line 37, in <module>
server = smtplib.SMTP('smtp.gmail.com', 65)
File "C:\Python26\lib\smtplib.py", line 239, in __init__
(code, msg) = self.connect(Host, port)
File "C:\Python26\lib\smtplib.py", line 295, in connect
self.sock = self._get_socket(Host, port, self.timeout)
File "C:\Python26\lib\smtplib.py", line 273, in _get_socket
return socket.create_connection((port, Host), timeout)
File "C:\Python26\lib\socket.py", line 512, in create_connection
raise error, msg
error: [Errno 10060] A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected Host has failed to respond
>>>
考え?
server = smtplib.SMTP( "smtp.google.com"、495)でタイムアウトエラーが発生します。 smtplib.smtp( "smtp.google.com"、495)だけで「SSLError:[Errno 1] _ssl.c:480:error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol」が表示されます(下記参照)。
別のポートを試してみると、まったく新しいエラーが発生します。コード全体を投稿するだけで、おそらく新人の間違いを犯しています。
」
import smtplib
mailuser = '[email protected]'
mailpasswd = 'MYPASSWORD'
fromaddr = '[email protected]'
toaddrs = '[email protected]'
msg = 'Hooooorah!'
print msg
server = smtplib.SMTP_SSL('smtp.google.com')
server = smtplib.SMTP_SSL_PORT=587
server.user(mailuser)
server.pass_(mailpasswd)
server.set_debuglevel(1)
server.sendmail(fromaddr, toaddrs, msg)
server.quit()
」
そして、私はこのエラーメッセージを受け取ります: "
Traceback (most recent call last):
File "C:/Python26/08_emailconnects/12_29_eMAILSendtryin_stripped.py", line 16, in <module>
server = smtplib.SMTP_SSL('smtp.google.com')
File "C:\Python26\lib\smtplib.py", line 749, in __init__
SMTP.__init__(self, Host, port, local_hostname, timeout)
File "C:\Python26\lib\smtplib.py", line 239, in __init__
(code, msg) = self.connect(Host, port)
File "C:\Python26\lib\smtplib.py", line 295, in connect
self.sock = self._get_socket(Host, port, self.timeout)
File "C:\Python26\lib\smtplib.py", line 755, in _get_socket
self.sock = ssl.wrap_socket(self.sock, self.keyfile, self.certfile)
File "C:\Python26\lib\ssl.py", line 350, in wrap_socket
suppress_ragged_eofs=suppress_ragged_eofs)
File "C:\Python26\lib\ssl.py", line 118, in __init__
self.do_handshake()
File "C:\Python26\lib\ssl.py", line 293, in do_handshake
self._sslobj.do_handshake()
SSLError: [Errno 1] _ssl.c:480: error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol
」
「server = smtplib.SMTPSSLPORT = 587」のように見えるものは、実際には「server = smtplib.SMTPunderscoreSSLunderscorePORT = 587 "、ここではある種のフォーマット処理が行われています。
次のコードは私のために働きます:
import smtplib
FROMADDR = "[email protected]"
LOGIN = FROMADDR
PASSWORD = "my.real.password"
TOADDRS = ["[email protected]"]
SUBJECT = "Test"
msg = ("From: %s\r\nTo: %s\r\nSubject: %s\r\n\r\n"
% (FROMADDR, ", ".join(TOADDRS), SUBJECT) )
msg += "some text\r\n"
server = smtplib.SMTP('smtp.gmail.com', 587)
server.set_debuglevel(1)
server.ehlo()
server.starttls()
server.login(LOGIN, PASSWORD)
server.sendmail(FROMADDR, TOADDRS, msg)
server.quit()
私はPython 2.5.2を使用しています。
編集:ΤΖΩΤΖΙΟΥによって提案されているようにポートを25から587に変更し、2番目のehlo()をドロップしました。今、私はなぜ私のマシンからポート25が機能する完全に(そしてポート465がしない)のかを知りたいです。
SSLを使用してGMailに接続する正しい方法は次のとおりです。
server = smtplib.SMTP('smtp.gmail.com', 587)
ポート465が遅延を引き起こしているようです。どちらのポートも GMail FAQ で指定されています。
SMTP over SSLでは、ポート587の使用がより一般的ですが、これは簡単な情報ですが、他の実用的な用途はありません。
この回答は、「the」回答として選択するためにコミュニティWikiとして提供されています。必要に応じて改善してください。
問題は Pythonのバグ によるものです。 SMTP_SSLで接続を作成しようとすると、「SMTPServerDisconnected:最初にconnect()を実行してください」というエラーで失敗します。
修正がコミットされたので、ローカルコピーにパッチを適用できます。 「smtplib_72551.diff」という名前の添付ファイルを参照してください。
(注:SMTP_SSLは、Python 2.6/3.0以降に追加された新しいクラスです。)
これは簡単な使い捨てソリューションです。これを先に貼り付けるつもりでしたが、私の椅子で寝てしまいました。
import smtplib
import email
import os
username = "[email protected]"
passwd = "password"
def mail(to, subject, text, attach):
msg = MIMEMultipart()
msg['From'] = username
msg['To'] = to
msg['Subject'] = subject
msg.attach(MIMEText(text))
part = MIMEBase('application', 'octet-stream')
part.set_payload(open(attach, 'rb').read())
Encoders.encode_base64(part)
part.add_header('Content-Disposition',
'attachment; filename="%s"' % os.path.basename(attach))
msg.attach(part)
server = smtplib.SMTP("smtp.gmail.com", 495)
server.ehlo()
server.starttls()
server.ehlo()
server.login(username, passwd)
server.sendmail(username, to, msg.as_string())
server.close()
mail("you", "hi", "hi", "webcam.jpg")
このスレッドでコードの試行に成功したほとんどの人はwin32を使用していないと私は推測しています。 ;)
*編集:いくつかの優れた「公式」の例については http://docs.python.org/library/email-examples.html を参照してください。
さて、このコード行がうまくいくことがわかりました!
server = smtplib.SMTP( 'smtp.gmail.com'、587)
GMAILがポート25でSSLをサポートしていないことが判明しました(ポート465が何らかの理由でハングしました)。
みんなありがとう!
from smtplib import SMTP_SSL as SMTP
from email.mime.text import MIMEText
Host = 'smtp.gmail.com'
PORT = 465
USERNAME = '[email protected]'
PASSWORD = ''
SENDER = '[email protected]'
RECIPIENT = '[email protected]'
text_subtype = 'plain'
with open('textfile', 'rb') as f:
msg = MIMEText(f.read(), text_subtype)
msg['Subject'] = 'Python Script'
msg['From'] = SENDER
msg['To'] = RECIPIENT
try:
connection = SMTP(Host, PORT)
connection.login(USERNAME, PASSWORD)
connection.sendmail(SENDER, RECIPIENT, msg.as_string())
except Exception, e:
print(e)
上記のコードは私にとってはうまくいきます。ご覧のとおり、この例ではSSL
を使用しているため、PORT = 465
が使用されています。ポート587
を使用する場合は、TLS
が必要です。
おそらく間違ったポート? 587smtp.gmail.comを使用していますが、機能します。
あなたはあなたのポートをチェックするべきです、私はグーグルのSMTPポートが65であることを確信していません、それはタイムアウトを説明するでしょう。
ソースをそのように変更します。
smtplib.SMTP_SSL( 'smtp.google.com'、465)
ただし、動作するはずであるのに動作しないことが確かな場合は、smtplib.SMTP_SSLにいくつかの問題があり、それに利用可能なパッチがあるようです here 。
import smtplib
content = 'example email stuff here'
mail = smtplib.SMTP('smtp.gmail.com', 587)
mail.ehlo()
mail.starttls()
mail.login('[email protected]','password')
mail.sendmail('[email protected]', '[email protected]', content)
mail.close()