Python--SMTPでメールを送信


SMTP(Simple Mail Transfer Protocol)は、ソースアドレスから宛先アドレスへのメールを転送するためのルールのセットであり、メッセージの転送方式を制御する簡単なメール転送プロトコルである.
pythonのsmtplibは、Eメールを送信するのに便利な方法を提供しています.smtpプロトコルを簡単にパッケージ化しました.
Pythonが作成したSMTPオブジェクト構文は以下の通りです.
import smtplib
smtpObj = smtplib.SMTP( [host [, port [, local_hostname]]] )

パラメータの説明:
  • host:SMTPサーバホスト.ホストのipアドレスやドメイン名、例えばw 3 cschoolを指定できます.cc、これはオプションパラメータです.
  • port:hostパラメータを指定した場合、SMTPサービスで使用されるポート番号を指定する必要があります.一般的にSMTPポート番号は25です.
  • local_hostname:SMTPが本体にある場合は、サーバアドレスをlocalhostと指定するだけです.

  • Python SMTPオブジェクトはsendmailメソッドを使用してメールを送信します.構文は次のとおりです.
    SMTP.sendmail(from_addr, to_addrs, msg[, mail_options, rcpt_options]

    パラメータの説明:
  • from_addr:メール送信者アドレス.
  • to_addrs:文字列リスト、メール送信アドレス.
  • msg:メッセージを送信
  • ここで3番目のパラメータに注意してください.msgは文字列で、メールを表します.メールは一般的にタイトル、送信者、受信者、メール内容、添付ファイルなどで構成されていることを知っています.メールを送信するときは、msgのフォーマットに注意してください.このフォーマットはsmtpプロトコルで定義されたフォーマットです.
    ≪インスタンス|Instance|emdw≫
    以下に、Pythonを使用してメールを送信する簡単な例を示します.
    #!/usr/bin/python
    
    import smtplib
    
    sender = '[email protected]'
    receivers = ['[email protected]']
    
    message = """From: From Person <[email protected]>
    To: To Person <[email protected]>
    Subject: SMTP e-mail test
    
    This is a test e-mail message.
    """
    
    try:
       smtpObj = smtplib.SMTP('localhost')
       smtpObj.sendmail(sender, receivers, message)         
       print "Successfully sent email"
    except SMTPException:
       print "Error: unable to send email"

    PythonでHTML形式のメールを送る
    PythonがHTML形式のメールを送信するのと純粋なテキストメッセージを送信するメールの違いはMIMETextで_subtypeはhtmlに設定されています.具体的なコードは以下の通りです.
    import smtplib  
    from email.mime.text import MIMEText  
    mailto_list=["[email protected]"] 
    mail_host="smtp.XXX.com"  #     
    mail_user="XXX"    #   
    mail_pass="XXXX"   #   
    mail_postfix="XXX.com"  #      
      
    def send_mail(to_list,sub,content):  #to_list:   ;sub:  ;content:    
        me="hello"+"<"+mail_user+"@"+mail_postfix+">"   #   hello      ,    ,       
        msg = MIMEText(content,_subtype='html',_charset='gb2312')    #      ,     html    
        msg['Subject'] = sub    #    
        msg['From'] = me  
        msg['To'] = ";".join(to_list)  
        try:  
            s = smtplib.SMTP()  
            s.connect(mail_host)  #  smtp   
            s.login(mail_user,mail_pass)  #     
            s.sendmail(me, to_list, msg.as_string())  #    
            s.close()  
            return True  
        except Exception, e:  
            print str(e)  
            return False  
    if __name__ == '__main__':  
        if send_mail(mailto_list,"hello","<a href='http://www.cnblogs.com/xiaowuyi'>   </a>"):  
            print("    ")
        else:  
            print("    ")

    あるいは、次の例のように、メッセージボディにContent-typeをtext/htmlとして指定することもできます.
    #!/usr/bin/python
    
    import smtplib
    
    message = """From: From Person <[email protected]>
    To: To Person <[email protected]>
    MIME-Version: 1.0
    Content-type: text/html
    Subject: SMTP HTML e-mail test
    
    This is an e-mail message to be sent in HTML format
    
    <b>This is HTML message.</b>
    <h1>This is headline.</h1>
    """
    
    try:
       smtpObj = smtplib.SMTP('localhost')
       smtpObj.sendmail(sender, receivers, message)         
       print("Successfully sent email")
    except SMTPException:
       print("Error: unable to send email")

    Python添付ファイル付きメール送信
    添付ファイル付きメールを送信するには、まずMIMEMultipart()インスタンスを作成し、次に添付ファイルを構築し、複数の添付ファイルがある場合は順次構築し、最後にsmtplibを利用する.smtp送信.
    from email.mime.text import MIMEText
    from email.mime.multipart import MIMEMultipart
    import smtplib
    
    #          
    msg = MIMEMultipart()
    
    #    1
    att1 = MIMEText(open('d:\\123.rar', 'rb').read(), 'base64', 'gb2312')
    att1["Content-Type"] = 'application/octet-stream'
    att1["Content-Disposition"] = 'attachment; filename="123.doc"'#   filename     ,     ,         
    msg.attach(att1)
    
    #    2
    att2 = MIMEText(open('d:\\123.txt', 'rb').read(), 'base64', 'gb2312')
    att2["Content-Type"] = 'application/octet-stream'
    att2["Content-Disposition"] = 'attachment; filename="123.txt"'
    msg.attach(att2)
    
    #    
    msg['to'] = '[email protected]'
    msg['from'] = '[email protected]'
    msg['subject'] = 'hello world'
    #    
    try:
        server = smtplib.SMTP()
        server.connect('smtp.XXX.com')
        server.login('XXX','XXXXX')#XXX    ,XXXXX   
        server.sendmail(msg['from'], msg['to'],msg.as_string())
        server.quit()
        print '    '
    except Exception, e:  
        print(str(e))

    以下の例ではContent-type headerがmultipart/mixedであることを指定し、/tmp/testを送信.txtテキストファイル:
    #!/usr/bin/python
    
    import smtplib
    import base64
    
    filename = "/tmp/test.txt"
    
    #           base64   
    fo = open(filename, "rb")
    filecontent = fo.read()
    encodedcontent = base64.b64encode(filecontent)  # base64
    
    sender = '[email protected]'
    reciever = '[email protected]'
    
    marker = "AUNIQUEMARKER"
    
    body ="""
    This is a test email to send an attachement.
    """
    #       
    part1 = """From: From Person <[email protected]>
    To: To Person <[email protected]>
    Subject: Sending Attachement
    MIME-Version: 1.0
    Content-Type: multipart/mixed; boundary=%s
    --%s
    """ % (marker, marker)
    
    #       
    part2 = """Content-Type: text/plain
    Content-Transfer-Encoding:8bit
    
    %s
    --%s
    """ % (body,marker)
    
    #       
    part3 = """Content-Type: multipart/mixed; name=\"%s\"
    Content-Transfer-Encoding:base64
    Content-Disposition: attachment; filename=%s
    
    %s
    --%s--
    """ %(filename, filename, encodedcontent, marker)
    message = part1 + part2 + part3
    
    try:
       smtpObj = smtplib.SMTP('localhost')
       smtpObj.sendmail(sender, reciever, message)
       print("Successfully sent email")
    except Exception:
       print("Error: unable to send email")