Python之SMTP詳解

fmms 12年前發布 | 60K 次閱讀 Python Python開發

這段代碼解釋了SMTP在python中的基本應用。

  1. 獲得服務器的特性,如:允許發送的郵件大小。
  2. 查看服務器是否支持SSL和TLS安全傳輸。
  3. 查看在發送郵件之前是否需要認證。
  4. </ol>

    #!/usr/bin/env python
    #-*-coding = UTF-8-*-
    #SMTP_email.py
    #auth@:xfk
    #date@:2012-04-30
    
    import sys
    import smtplib
    import socket
    from getpass import getpass
    
    if len(sys.argv) < 4:
        print "[*]usage:%s server fromaddr toaddr " % sys.argv[0]
        sys.exit(1)
    
    server = sys.argv[1]
    fromaddr = sys.argv[2]
    toaddr = sys.argv[3]
    
    message = """
    TO: %s
    From: %s
    Subject: Test Message from SMTP_mail.py
    
    Hello ,This a simple SMTP_mail example.
    """ % (','.join(toaddr),fromaddr)
    
    def get_size():
        """獲得服務器允許發送郵件的大小"""
        try:
            s = smtplib.SMTP(server)     #連接到服務器
            code = s.ehlo()[0]      #返回服務器的特性
            usesesmtp = 1
            if not (200 <= code <=299):         #在200到299之間都是正確的返回值
                usesesntp = 0
                code = s.helo()[0]
                if not (200 <= code <=299):
                    raise SMTPHeloError(code,resp)
            if usesesmtp and s.has_extn('size'):         #獲得服務器允許發送郵件的大小
                print "Maxinum message size is ",s.esmtp_features['size']
                if len(message) > int(s.esmtp_features['size']):
                    print "Message too large;aborting."
                    sys.exit(2)
            s.sendmail(fromaddr,toaddr,message)
        except(socket.gaierror,socket.error,socket.herror,smtplib.SMTPException),e:
            print "***Your message may not have been sent!"
            print e
            sys.exit(1)
        else:
            print "***Message successful sent to %d recipient(s)" % len(toaddr)
    
    def ssl_tls():
        """使用SSL安全套階層和TLS安全傳輸層進行郵件傳輸,確保密碼在傳輸中的安全"""
        try:
            s = smtplib.SMTP(server)     #連接到服務器
            code = s.ehlo()[0]      #返回服務器的特性
            usesesmtp = 1
            if not (200 <= code <=299):         #在200到299之間都是正確的返回值
                usesesntp = 0
                code = s.helo()[0]
                if not (200 <= code <=299):
                    raise SMTPHeloError(code,resp)
            if usesesmtp and s.has_extn('starttls'):         #查看服務器是否支持TLS
                print "Negotiating TLS......"
                s.starttls()
                code = s.ehlo()[0]
                if not (200 <= code <=299):             #在支持TLS的服務器上是否連接回話成功
                    print "Couldn't EHLO after STARTTLS."
                    sys.exit(5)
                print "Using TLS connection."
            else:
                print "Server does not suport TLS; using normal connection."
            s.sendmail(fromaddr,toaddr,message)         #如果連接TLS成功則使用加密傳輸;若連接TLS出錯則使用普通的傳輸
        except(socket.gaierror,socket.error,socket.herror,smtplib.SMTPException),e:
            print "***Your message may not have been sent!"
            print e
            sys.exit(1)
        else:
            print "***Message successful sent to %d recipient(s)" % len(toaddr)
    
    def auth_login():
        """當發送郵件時,服務器需要驗證,則輸入用戶名密碼方可發送郵件"""
        sys.stdout.write("Enter username: ")
        username = sys.stdin.readline().strip()
        password = getpass("Enter password: ")
        try:
            s = smtplib.SMTP(server)     #連接到服務器
            code = s.ehlo()[0]      #返回服務器的特性
            usesesmtp = 1
            if not (200 <= code <=299):         #在200到299之間都是正確的返回值
                usesesntp = 0
                code = s.helo()[0]
                if not (200 <= code <=299):
                    raise SMTPHeloError(code,resp)
            if usesesmtp and s.has_extn('auth'):         #查看服務器是否支持認證
                print "Using Authentication connect."
                try:
                    s.login(username,password)
                except smtplib.SMTPException,e:
                    print "Authentication failed:",e
                    sys.exit(1)
            else:
                print "Server does not suport Authentication; using normal connect."
            s.sendmail(fromaddr,toaddr,message)         #如果支持認證則輸入用戶名密碼進行認證;不支持則使用普通形式進行傳輸
        except(socket.gaierror,socket.error,socket.herror,smtplib.SMTPException),e:
            print "***Your message may not have been sent!"
            print e
            sys.exit(1)
        else:
            print "***Message successful sent to %d recipient(s)" % len(toaddr)
    
    if __name == "__mian__":
        get_size()
        ssl_tls()
        auth_login()

 本文由用戶 fmms 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!