出力されたテキストをメールにメールで送信するようにアプリケーションを取得しようとしています。簡単にするために、スクリプトを分離しました。
import smtplib
import sys
import os
SERVER = "localhost"
FROM = os.getlogin()
TO = [raw_input("To : ")]
SUBJECT = "Message From " + os.getlogin()
print "Message : (End with ^D)"
TEXT = ''
while 1:
line = sys.stdin.readline()
if not line:
break
TEXT = TEXT + line
# Prepare actual message
message = """\
From: %s
To: %s
Subject: %s
%s
""" % (FROM, ", ".join(TO), SUBJECT, TEXT)
# Send the mail
server = smtplib.SMTP(SERVER)
server.sendmail(FROM, TO, message)
server.quit()
このスクリプトの出力:
Traceback (most recent call last):
File "/Users/christianlaustsen/Dropbox/Apps - Python/mail/smtplib_mail.py", line 32, in <module>
server = smtplib.SMTP(SERVER)
File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/smtplib.py", line 239, in __init__
(code, msg) = self.connect(Host, port)
File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/smtplib.py", line 295, in connect
self.sock = self._get_socket(Host, port, self.timeout)
File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/smtplib.py", line 273, in _get_socket
return socket.create_connection((port, Host), timeout)
File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/socket.py", line 512, in create_connection
raise error, msg
error: [Errno 61] Connection refused
ご覧のとおり、接続は拒否されています。 Mac OS X Snow LeopardでPython 2.6を実行しています(関連する場合)。
私はよく検索してみましたが、解決策を見つけることができませんでした。任意の助けをいただければ幸いです。
私の推測では、ローカルマシンにSMTPサーバーがインストールされていません。
メールが機密事項でない場合は、Gmailアカウントを開き、 Pythonでそれを使用してメールを送信します 。
次のようにローカルサーバーを起動する場合:
python -m smtpd -n -c DebuggingServer localhost:1025
非標準のポート番号を使用するようにメール送信コードを必ず変更してください。
server = smtplib.SMTP(SERVER, 1025)
server.sendmail(FROM, TO, message)
server.quit()
PythonのようにシンプルなSMTPサーバーを起動します:
python -m smtpd -n -c DebuggingServer localhost:1025
別のサーバーを実行したくない場合、およびUnixのみを使用している場合は、 http://www.yak.net/fqa/84.html からコピーしたこの手法を使用できます=、元々Python FAQから:
Unixでは、sendmailを使用して非常に簡単です。 sendmailプログラムの場所はシステムによって異なります。時々/ usr/lib/sendmail、いつか/ usr/sbin/sendmailです。 sendmailのマニュアルページが役立ちます。サンプルコードを次に示します。
SENDMAIL = "/usr/sbin/sendmail" # sendmail location
import os
p = os.popen("%s -t" % SENDMAIL, "w")
p.write("To: [email protected]\n")
p.write("Subject: test\n")
p.write("\n") # blank line separating headers from body
p.write("Some text\n")
p.write("some more text\n")
sts = p.close()
if sts != 0:
print "Sendmail exit status", sts
コピーして貼り付けて動作させるために何かを作成したかったのですが、これが私が最も近いものです:
from email.message import EmailMessage
import smtplib
import os
def send_email(message,destination):
# important, you need to send it to a server that knows how to send e-mails for you
server = smtplib.SMTP('smtp.gmail.com', 587)
server.starttls()
# don't know how to do it without cleartexting the password and not relying on some json file that you dont git control...
server.login('[email protected]', 'password_for_gmail')
msg = EmailMessage()
msg.set_content(message)
msg['Subject'] = 'TEST'
msg['From'] = '[email protected]'
msg['To'] = destination
server.send_message(msg)
if __== '__main__':
send_email('msg','destination@email')
チュートリアルは、電子メールを送信する実行中のサーバーが既にあることを十分に伝えることなく想定しているため、誤解を招くと感じています...奇妙なことです。私のスクリプトの唯一の問題は、クリアテキストのパスワードをそこに書かなくても機能させる方法がわからないということですが、残念ながら...少なくとも送信しますか?偽のメールアドレスなどを作成するだけです...
なんらかの理由で、サーバーとポートをコンストラクターに渡すことは困難でしたが、接続関数はできませんでした。これは私のために働いてしまいました:
s = smtplib.SMTP(timeout=30) #seconds
s.connect(EMAIL_Host, EMAIL_PORT)
m = MIMEText('see subject')
m['subject'] = 'sweet subject'
m['from'] = EMAIL_FROM
m['to'] = to_list # comma-separated list of emails
s.sendmail(m['from'], m['to'].split(','), m.as_string())
s.quit()
システムのルートである場合は、opensmtpd
をインストールできます。まずこの方法では、サーバーを手動で実行する必要はありません(このサービスはデフォルトで有効になっているため、smtpd
インストール後に手動で起動するか、マシンを再起動します)。第二に、server = smtplib.SMTP(SERVER)
行を変更する必要はありません。最後に、yum install opensmtpd
または同等のapt-get
コマンドを使用します。