1. ホーム
  2. パイソン

[解決済み】Pythonでメールを送信する方法は?

2022-04-10 08:25:03

質問

このコードは正常に動作し、私に電子メールを送信します。

import smtplib
#SERVER = "localhost"

FROM = '[email protected]'

TO = ["[email protected]"] # must be a list

SUBJECT = "Hello!"

TEXT = "This message was sent with Python's smtplib."

# Prepare actual message

message = """\
From: %s
To: %s
Subject: %s

%s
""" % (FROM, ", ".join(TO), SUBJECT, TEXT)

# Send the mail

server = smtplib.SMTP('myserver')
server.sendmail(FROM, TO, message)
server.quit()

しかし、このように関数でくくろうとすると。

def sendMail(FROM,TO,SUBJECT,TEXT,SERVER):
    import smtplib
    """this is some test documentation in the function"""
    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 "C:/Python31/mailtest1.py", line 8, in <module>
    sendmail.sendMail(sender,recipients,subject,body,server)
  File "C:/Python31\sendmail.py", line 13, in sendMail
    server.sendmail(FROM, TO, message)
  File "C:\Python31\lib\smtplib.py", line 720, in sendmail
    self.rset()
  File "C:\Python31\lib\smtplib.py", line 444, in rset
    return self.docmd("rset")
  File "C:\Python31\lib\smtplib.py", line 368, in docmd
    return self.getreply()
  File "C:\Python31\lib\smtplib.py", line 345, in getreply
    raise SMTPServerDisconnected("Connection unexpectedly closed")
smtplib.SMTPServerDisconnected: Connection unexpectedly closed

なぜなのか、どなたか教えてください。

解決方法は?

おすすめは、標準パッケージの email smtplib を併用することで、メールを送信することができます。次の例をご覧ください(「Security」からの転載です)。 Pythonのドキュメント ). このアプローチに従えば、"simple" タスクは確かにシンプルで、より複雑なタスク(バイナリオブジェクトのアタッチやプレーン/HTMLマルチパートメッセージの送信など)は非常に迅速に達成されることに注意してください。

# Import smtplib for the actual sending function
import smtplib

# Import the email modules we'll need
from email.mime.text import MIMEText

# Open a plain text file for reading.  For this example, assume that
# the text file contains only ASCII characters.
with open(textfile, 'rb') as fp:
    # Create a text/plain message
    msg = MIMEText(fp.read())

# me == the sender's email address
# you == the recipient's email address
msg['Subject'] = 'The contents of %s' % textfile
msg['From'] = me
msg['To'] = you

# Send the message via our own SMTP server, but don't include the
# envelope header.
s = smtplib.SMTP('localhost')
s.sendmail(me, [you], msg.as_string())
s.quit()

また、複数の宛先にメールを送信する場合は、例として Pythonのドキュメント :

# Import smtplib for the actual sending function
import smtplib

# Here are the email package modules we'll need
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart

# Create the container (outer) email message.
msg = MIMEMultipart()
msg['Subject'] = 'Our family reunion'
# me == the sender's email address
# family = the list of all recipients' email addresses
msg['From'] = me
msg['To'] = ', '.join(family)
msg.preamble = 'Our family reunion'

# Assume we know that the image files are all in PNG format
for file in pngfiles:
    # Open the files in binary mode.  Let the MIMEImage class automatically
    # guess the specific image type.
    with open(file, 'rb') as fp:
        img = MIMEImage(fp.read())
    msg.attach(img)

# Send the email via our own SMTP server.
s = smtplib.SMTP('localhost')
s.sendmail(me, family, msg.as_string())
s.quit()

ご覧の通り、ヘッダー To の中にある MIMEText オブジェクトは、カンマで区切られた電子メールアドレスからなる文字列でなければなりません。一方、第2引数の sendmail 関数は、文字列のリストでなければなりません(各文字列はメールアドレスです)。

つまり、3つのメールアドレスがある場合 [email protected] , [email protected] および [email protected] であれば、以下のようにすることができます(明らかな部分は省略)。

to = ["[email protected]", "[email protected]", "[email protected]"]
msg['To'] = ",".join(to)
s.sendmail(me, to, msg.as_string())

その ",".join(to) の部分は、カンマで区切られたリストの中から一つの文字列を作ります。

質問から察するに、あなたはまだ Pythonチュートリアル - Pythonを使いこなしたいのであれば、これは必須です。