自動化パッケージ継続(Python送信メール)

6666 ワード

の原因となる
機械の運行はますます遅くなって、毎日シミュレータを起動するのに十数分かかります.一部のソフトウェアを再インストールした後、私のパッケージスクリプトメールが個別のメールボックスに送信された場合、メールが時間通りに到着できないことがあります.当時、どのように環境を送信する資料を配置しても、コンピュータのフォーマットに従って消えてしまった.更に振り返る道を歩き直したくなくて、もとの方法によって一歩一歩配置します.最近ではPythonについても勉強しているので、Pythonを使ってメールを送る機会を逃すことはできないようです.
需要
  • 1.メールを送信します.タイトル、本文、添付ファイル付きのメールを正常、時間通り、安定して送信できます.
  • 2.Mac端末でコマンドライン操作操作が可能です.Shellパッケージスクリプトとの間のパラメータ伝達
  • 3.メール送信時に送信の進捗が直感的にわかる、アップロードされたネットワークレート(現時点では実現していない)など
  • .
    インプリメンテーションプロセス
    添付ファイル付きメールを送信
    pythonはsmtpを使用してメールを送信します.これについては何も言うことはないと思いますが、詳しくは菜鳥チュートリアルとPython 2.7チュートリアルを参照してください.
    メール送信の進捗状況とネットワーク速度の取得
    時々メールの送信進捗を見たいのですが、smtp自体はメールの送信進捗を直接表示できません.ファイルデータの合計パーセントを毎秒読み出すことで、ニーズを達成できます.ソースコードを読むと、次のコードを見つけて、私たちのニーズを満たすことができるようになります.
    def data(self,msg):
            """SMTP 'DATA' command -- sends message data to server.
    
            Automatically quotes lines beginning with a period per rfc821.
            Raises SMTPDataError if there is an unexpected reply to the
            DATA command; the return value from this method is the final
            response code received when the all data is sent.
            """
            self.putcmd("data")
            (code,repl)=self.getreply()
            if self.debugle vel >0 : print "data:", (code,repl)
            if code != 354:
                raise SMTPDataError(code,repl)
            else:
                q = quotedata(msg)
                if q[-2:] != CRLF:
                    q = q + CRLF
                q = q + "." + CRLF
                self.send(q)
                (code,msg)=self.getreply()
                if self.debuglevel >0 : print "data:", (code,msg)
                return (code,msg)
    

    送信中に毎秒監視する送信バイト数を取得して出力ことで、送信進捗とネットワーク速度を取得することができる.
              global starttime,sendByteBySec
              endtime = datetime.datetime.now()
              percent = 100. * progress / total
              stdout.write('\r')
              starttime = endtime;
              speedNum = (progress - sendByteBySec)/1024
              if (endtime - starttime).seconds >=1:
                 # starttime = endtime;
                 # speedNum = (progress - sendByteBySec)/1024
                 stdout.write("%s bytes sent of %s [%2.0f%%]|Speed: [%2.0f%%]" % (progress, total, percent,speedNum))
                 # sendByteBySec = progress
              else:
                  # starttime = endtime;
                  # speedNum = (progress - sendByteBySec)/1024
                  stdout.write("%s bytes sent of %s [%2.0f%%]|Speed: [%2.0f%%]" % (progress, total, percent,speedNum))
    
              sendByteBySec = progress
              stdout.flush()
              # print (endtime - starttime).seconds
              if percent >= 100: stdout.write('
    ')

    完全なコードは次のとおりです.
    # !/usr/bin/python
    # -*- coding: utf-8 -*-
    
    # import smtplib
    from smtplib import SMTP, quotedata, CRLF, SMTPDataError
    from email import encoders
    from email.header import Header
    from email.mime.text import MIMEText
    from email.utils import parseaddr, formataddr
    from email.MIMEMultipart import MIMEMultipart
    from email.mime.base import MIMEBase
    from sys import stderr, stdout
    import os,sys, time
    
    class ExtendedSMTP(SMTP):
      def data(self, msg):
        self.putcmd("data")
        (code,repl)=self.getreply()
        if self.debuglevel > 0 : print >> stderr, "data:", (code, repl)
        if code != 354:
          raise SMTPDataError(code,repl)
        else:
          q = quotedata(msg)
          if q[-2:] != CRLF:
            q = q + CRLF
          q = q + "." + CRLF
    
          # begin modified send code
          chunk_size = 2048
          bytes_sent = 0
    
          while bytes_sent != len(q):
            chunk = q[bytes_sent:bytes_sent+chunk_size]
            self.send(chunk)
            bytes_sent += len(chunk)
            if hasattr(self, "callback"):
              self.callback(bytes_sent, len(q))
          # end modified send code
    
          (code,msg)=self.getreply()
          if self.debuglevel >0 : print>>stderr, "data:", (code,msg)
          return (code,msg)
    
    
    def sendMail(filePath,fileName,appName):
        def _format_addr(s):
            name, addr = parseaddr(s)
            return formataddr(( \
                Header(name, 'utf-8').encode(), \
                addr.encode('utf-8') if isinstance(addr, unicode) else addr))
    
        def callback(progress, total):
              percent = 100. * progress / total
              stdout.write('\r')
              stdout.write("%s bytes sent of %s [%2.0f%%]" % (progress, total, percent))
              stdout.flush()
              if percent >= 100: stdout.write('
    ') # from_addr = "[email protected]" password = "HJ19930112" to_addr = ["[email protected]","[email protected]"] smtp_server = "smtp.yeah.net" # # content = u'%s ( ) , , '% sys.argv[3] # ( ) subject = u'%s ' % sys.argv[3] emailFrom = " " msg = MIMEMultipart() msg['From'] = _format_addr('%s' % (emailFrom,from_addr)) msg['To'] = _format_addr(u' ' % to_addr) msg['Subject'] = Header('%s' % subject, 'utf-8').encode() msg.attach(MIMEText('%s'%content, 'plain', 'utf-8')) mime = MIMEBase('application', 'octet-stream', filename=fileName) with open(filePath, 'rb') as f: # : mime.add_header('Content-Disposition', 'attachment', filename=fileName) mime.add_header('Content-ID', '<0>') mime.add_header('X-Attachment-Id', '0') mime.set_payload(f.read()) # Base64 : encoders.encode_base64(mime) # MIMEMultipart: msg.attach(mime) try: server = ExtendedSMTP() server.callback = callback server.connect(smtp_server, 25) # server.set_debuglevel(1)# , server.login(from_addr, password) server.sendmail(from_addr, to_addr, msg.as_string()) server.quit() return True except Exception as e: raise e return False if __name__ == '__main__': # print sys.argv if sendMail(sys.argv[1], sys.argv[2], sys.argv[3]): print "\033[32;1m !\033[0m" else: print " !"

    注意:
    デバッグモードserver.set_debuglevel(1)をオンにするとコード実行プロセスが出力され、大きな添付ファイルを含むメールが送信されると進行がひどく遅くなるので注意してください.
    参考記事リンク
    Pythonがフォルダ全体の内容を添付したメールを送信するチュートリアル
    smtplib