web-dev-qa-db-ja.com

Pythonの例でメールを送信できない

私は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 "、ここではある種のフォーマット処理が行われています。

23
Chatter

次のコードは私のために働きます:

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がしない)のかを知りたいです。

28

SSLを使用してGMailに接続する正しい方法は次のとおりです。

server = smtplib.SMTP('smtp.gmail.com', 587)

ポート465が遅延を引き起こしているようです。どちらのポートも GMail FAQ で指定されています。

SMTP over SSLでは、ポート587の使用がより一般的ですが、これは簡単な情報ですが、他の実用的な用途はありません。

この回答は、「the」回答として選択するためにコミュニティWikiとして提供されています。必要に応じて改善してください。

7
tzot

問題は Pythonのバグ によるものです。 SMTP_SSLで接続を作成しようとすると、「SMTPServerDisconnected:最初にconnect()を実行してください」というエラーで失敗します。

修正がコミットされたので、ローカルコピーにパッチを適用できます。 「smtplib_72551.diff」という名前の添付ファイルを参照してください。

(注:SMTP_SSLは、Python 2.6/3.0以降に追加された新しいクラスです。)

6
keithb

これは簡単な使い捨てソリューションです。これを先に貼り付けるつもりでしたが、私の椅子で寝てしまいました。


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 を参照してください。

6
EndUsr

さて、このコード行がうまくいくことがわかりました!

server = smtplib.SMTP( 'smtp.gmail.com'、587)

GMAILがポート25でSSLをサポートしていないことが判明しました(ポート465が何らかの理由でハングしました)。

みんなありがとう!

2
Chatter
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が必要です。

1
jetbird13

おそらく間違ったポート? 587smtp.gmail.comを使用していますが、機能します。

1
Abgan

あなたはあなたのポートをチェックするべきです、私はグーグルのSMTPポートが65であることを確信していません、それはタイムアウトを説明するでしょう。

ソースをそのように変更します。

smtplib.SMTP_SSL( 'smtp.google.com'、465)

ただし、動作するはずであるのに動作しないことが確かな場合は、smtplib.SMTP_SSLにいくつかの問題があり、それに利用可能なパッチがあるようです here

1
EndUsr
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()
0
Super Saiyan