自動化パッケージ継続(Python送信メール)
6666 ワード
の原因となる
機械の運行はますます遅くなって、毎日シミュレータを起動するのに十数分かかります.一部のソフトウェアを再インストールした後、私のパッケージスクリプトメールが個別のメールボックスに送信された場合、メールが時間通りに到着できないことがあります.当時、どのように環境を送信する資料を配置しても、コンピュータのフォーマットに従って消えてしまった.更に振り返る道を歩き直したくなくて、もとの方法によって一歩一歩配置します.最近ではPythonについても勉強しているので、Pythonを使ってメールを送る機会を逃すことはできないようです.
需要 1.メールを送信します.タイトル、本文、添付ファイル付きのメールを正常、時間通り、安定して送信できます. 2.Mac端末でコマンドライン操作操作が可能です.Shellパッケージスクリプトとの間のパラメータ伝達 3.メール送信時に送信の進捗が直感的にわかる、アップロードされたネットワークレート(現時点では実現していない)など .
インプリメンテーションプロセス
添付ファイル付きメールを送信
pythonはsmtpを使用してメールを送信します.これについては何も言うことはないと思いますが、詳しくは菜鳥チュートリアルとPython 2.7チュートリアルを参照してください.
メール送信の進捗状況とネットワーク速度の取得
時々メールの送信進捗を見たいのですが、smtp自体はメールの送信進捗を直接表示できません.ファイルデータの合計パーセントを毎秒読み出すことで、ニーズを達成できます.ソースコードを読むと、次のコードを見つけて、私たちのニーズを満たすことができるようになります.
送信中に毎秒監視する送信バイト数を取得して出力ことで、送信進捗とネットワーク速度を取得することができる.
完全なコードは次のとおりです.
注意:
デバッグモード
参考記事リンク
Pythonがフォルダ全体の内容を添付したメールを送信するチュートリアル
smtplib
機械の運行はますます遅くなって、毎日シミュレータを起動するのに十数分かかります.一部のソフトウェアを再インストールした後、私のパッケージスクリプトメールが個別のメールボックスに送信された場合、メールが時間通りに到着できないことがあります.当時、どのように環境を送信する資料を配置しても、コンピュータのフォーマットに従って消えてしまった.更に振り返る道を歩き直したくなくて、もとの方法によって一歩一歩配置します.最近ではPythonについても勉強しているので、Pythonを使ってメールを送る機会を逃すことはできないようです.
需要
インプリメンテーションプロセス
添付ファイル付きメールを送信
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