22

Python 経由でメールを送信する方法を見つけようと試みました (そして失敗しました)。

ここから例を試してみてください: http://docs.python.org/library/smtplib.html#smtplib.SMTP

server = smtplib.SMTP_SSL('smtp.gmail.com', 465)SSL接続がないことについてバウンスバックを受けた後 、行を追加しました。

今、私はこれを得ています:

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 = 'MYEMAIL@gmail.com'

mailpasswd = 'MYPASSWORD'

fromaddr = 'MYEMAIL@gmail.com'

toaddrs = 'MYEMAIL2@gmail.com'

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.SMTPアンダースコアSSLアンダースコアPORT=587" であることに注意してください。ここでは何らかのフォーマット処理が行われています。

4

10 に答える 10

29

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

import smtplib

FROMADDR = "my.real.address@gmail.com"
LOGIN    = FROMADDR
PASSWORD = "my.real.password"
TOADDRS  = ["my.real.address@gmail.com"]
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()

Python2.5.2を使用しています。

編集:ΤΖΩΤΖΙΟΥによって提案されたようにポートを25から587に変更し、2番目のehlo()を削除しました。ここで、ポート25が私のマシンで完全に機能する理由を知りたいと思います(ポート465は機能しませ)。

于 2008-12-30T00:48:19.343 に答える
8

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

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

ポート 465 で遅延が発生しているようです。両方のポートは、GMail の FAQで指定されています。

SMTP over SSL ではポート 587 の使用がより一般的であることに注意してください。

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

于 2008-12-31T01:41:13.730 に答える
6

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

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

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

于 2009-06-05T11:01:06.077 に答える
6

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


import smtplib
import email
import os

username = "user@gmail.com"
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を参照してください。

于 2008-12-30T05:35:03.350 に答える
2

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

サーバー = smtplib.SMTP('smtp.gmail.com', 587)

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

みんなありがとう!

于 2008-12-30T17:30:53.437 に答える
1
from smtplib import SMTP_SSL as SMTP
from email.mime.text import MIMEText

HOST = 'smtp.gmail.com'
PORT = 465

USERNAME = 'oltjano13@gmail.com'
PASSWORD = ''

SENDER = 'oltjano13@gmail.com'
RECIPIENT = 'oltjano13@gmail.com'

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)

上記のコードは私にとってはうまくいきます。ご覧のとおりPORT = 465、この例では を使用しているため、 が使用されていSSLます。ポートを使用する予定がある場合587は、TLS必須です。

于 2015-06-02T12:04:50.657 に答える
1

ポートが間違っている可能性がありますか?smtp.gmail.comに587を使用していますが、動作します。

于 2008-12-29T23:59:19.457 に答える
1

ポートを確認する必要があります。Google の SMTP ポートが 65 であるかどうかはわかりません。これでタイムアウトが説明されます。

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

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

ただし、動作するはずなのに動作しない場合は、smtplib.SMTP_SSL に問題があるようで、ここに利用可能なパッチがあります

于 2008-12-29T23:59:31.343 に答える