Pythonの自動操作とメンテナンス1

[ TOC]

0 x00クイックスタート####

システムの基本情報####

psutil-システムパフォーマンス情報モジュール#####

psutilは、Pythonで実行されているプロセスとシステム使用率(CPU、メモリ、ディスク、ネットワーク、センサー)に関する情報を取得するために使用されるクロスプラットフォームライブラリです。サポートプラットフォーム:

ダウンロードして使用する:

pip install psutil
>>> help(psutil)

使用例:

#! /usr/bin/env python3
# - *- coding:utf-8-*-
# 機能:システム基本情報モジュール収集
import psutil
import datetime
from subprocess import PIPE

def Memory():
 mem = psutil.virtual_memory()
 swap = psutil.swap_memory()
 total =round(mem.total /pow(1024,3),2)
 free =round(mem.available /pow(1024,3),2)
 use = total - free
 print("システムメモリ情報:")print("\tTotal:{1:.2f} {0} \n\tUse:{2:.2f} {0} \n\tFree: {3:.2f} {0} \
   \ n\tメモリ使用率:{4:.2f}% \n".format("GB",total,use,free,mem.percent))  #データをフォーマットする
 print("\tswapTotal:{1:.2f} {0} \n\tswapUse:{2:.2f} {0} \n\tswapFree: {3:.2f} {0} \
   \ n\Tスワップパーティションの使用率:{4:.2f}% \n".format("GB",swap.total /pow(1024,3),swap.used /pow(1024,3),swap.free /pow(1024,3),swap.percent))  #データをフォーマットする

def Cpu():
 cpu = psutil.cpu_times()
 cpucount = psutil.cpu_count()print("システムプロセッサ情報:")print("\tUser:{1:.2f} \n\
  Sysetm:{2:.2f} \n\
  idle: {3:.2f} \n\
  CPUロジックの数:{4:d} \n\t".format("",cpu.user,cpu.system,cpu.idle,cpucount))  #データをフォーマットする

def Disk():
 disk = psutil.disk_partitions();
 diskio = psutil.disk_io_counters()print("システムディスク情報:")for i in disk:print(i.device,i.fstype,i.opts,end="\n")
  diskname = psutil.disk_usage(i.device)
  diskvalue =[]for j in diskname:
   diskvalue.append(j)print("Total: {1:.2f}{0} Used: {2:.2f}{0} Free: {3:.2f}{0}100%のディスク使用量:{4:.2f}%\n".format("GB",diskvalue[0]/pow(1024,3),diskvalue[1]/pow(1024,3),diskvalue[2]/pow(1024,3),diskvalue[3]))print("ディスクIO情報:読み取り:",diskio.read_count," Read_time: ",diskio.read_time,"\tWrite:",diskio.write_count," Write_time: ",diskio.write_time,"\n")       

def Net():
 ip = psutil.net_if_addrs()
 netio = psutil.net_io_counters()print("システムネットワークカード情報:")for i in ip:print("\t",i,end="\t")for x in ip[i]:print(x.address,end="  ")print("")print("\n\t Bytes_sent : {0:d}  Bytes_recv : {1:d} \n\t packets_sent(パケットを送信する) : {2:d}  packets_recv(パケットを受信する):{3:d}\n".format(netio.bytes_sent,netio.bytes_recv,netio.packets_sent,netio.packets_recv))
    

def Info():
 users = psutil.users()print("システムユーザー情報:")for i in users:print("\t",i,end=" ")print("\時間通りのtSystem:",datetime.datetime.fromtimestamp(users[0].started).strftime("%Y-%m-%d %H:%M:%S"))print("\t起動時間:",datetime.datetime.fromtimestamp(psutil.boot_time()).strftime("%Y-%m-%d %H:%M:%S"),end="\n\n")

def Process():print("システムプロセス情報:")
 pid = psutil.pids();for pidnum in pid:print("\t",psutil.Process(pidnum).pid,":",psutil.Process(pidnum).name())

# システムパフォーマンス情報:メモリ/ CPU /ディスク/インターネット/その他
def systemPerformance():Cpu()Memory()Disk()Net()Info()Process()
   
 # psutil経由のPopen()アプリケーションを起動する方法,実行中のプログラムに関するすべての関連情報を追跡できます
 p = psutil.Popen(["python","-c","print('Hello World!')"],stdout=PIPE)print(p)print(p.username(),p.communicate())if __name__ =="__main__":systemPerformance()

システム監視####

dnspython-ドメイン名ポーリングビジネスモニタリング#####

説明:一般的に使用されるDNS解決は、1つのドメイン名が1つのIPアドレスに対応することですが、DNSポーリング技術により、1つのドメイン名が複数のIPに対応します。

実際のケース:
[+ Githubで表示](https://github.com/WeiyiGeek/Study-Promgram/blob/master/Python3/Python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90% E7%BB%B4 / dnsmonitorweb.py)

#! /usr/bin/env python
# - *- coding: utf-8-*-
# @ File : dnsmonitorweb.py.py
# @ CreateTime :2019/7/1016:58
# @ Author : WeiyiGeek
# @ Function :DNSドメイン名ポーリングサービスの監視を実現
# @ Software: PyCharm

import dns.resolver
import os
import urllib.request
import ssl

iplist=[]
domain="www.qq.com.cn"

def get_ip(domain=""):try:
  A = dns.resolver.query(domain,'A')
 except Exception as e:print("DNS resolver error : %s "%str(e))return False
 for i in A.response.answer:for j in i.items:if j.address not in iplist:
    iplist.append(j.address)print("DNS Aレコード:%s"%j)return True

def checkweb(ipaddr):
 url ="http://"+ipaddr
 content =""try:
  response = urllib.request.urlopen(url,timeout=5,context=ssl._create_unverified_context())  #15秒のhttpリンクタイムアウト時間を定義します,httpsリクエストをサポート
 except Exception as e:print("[URLリクエストエラー]: \n%s"%str(e))finally:print("リクエストURL:", response.geturl())print("ステータスコード:", response.getcode())print("戻りメッセージヘッダー:\n%s"%response.info())ifint(response.getcode())==200:print(ipaddr +" [alive]")else:print(ipaddr +" [Error]")if __name__ =='__main__':ifget_ip(domain) and len(iplist)>0:for ip in iplist:checkweb(ip)else:print("モニタリングが完了しました")else:print("DNS Resolver Error!")

WeiyiGeek.webの例

ファイル比較####

ファイル内容の違いの比較#####

(1) difflibモジュール
説明:Pythonの標準ライブラリモジュールとして、difflibを使用してファイル間の違いを比較し、結果をHTMLドキュメントに出力します。

# '- ': 頭の中はシーケンスで示されていますが、2番目のシーケンス行には含まれていません,それが一番下にあるとき、それは余分な違いを意味します;
# '+': 先頭は2つのシーケンスで示されていますが、最初のシーケンス行には含まれていません
# ' ': 2つのシーケンスは同一です
# '?': 2つのシーケンスライン間の増分差をマークします
# '^': 2つのシーケンスラインの違いをマークします

実際のケース:(この方法は、Linux構成ファイルの違いを比較するために使用できます)

#! /usr/bin/env python
# - *- coding: utf-8-*-
# @ File : difflibfile.py
# @ CreateTime :2019/7/1117:34
# @ Author : WeiyiGeek
# @ Function :2つのテキスト間の文字列比較を実現します
# @ Software: PyCharm

import difflib

t1 ="""text1
this is a demo!
front not diff file 
add string
"""

t2 ="""text2
this is a demo!
front diff file
del string
"""
    
def main():
 t1line = t1.splitlines()  #行動によってセグメント化
 t2line = t2.splitlines()

 # 例1.シェルへの出力
 diff = difflib.Differ()  #Differオブジェクトを作成する
 result = diff.compare(t1line,t2line)
 # print("\n".join(list(result)))  #同上
 for i inlist(result):     #結果を標準入力にゆっくり出力する
  print(i)

 ## 出力結果##
 # - text1
    # ?^
    #
 # + text2
    # ?^
    #
 # this is a demo!

 # - front not diff file
    # ?-----
    #
 # + front diff file  #ここでは増分の違いはありません
 # - add string
    # ?-^
    #
 # + del string
    # ?^^

 # 例2.美しくコントラストのあるHTMLドキュメントを作成する
 d = difflib.HtmlDiff()withopen("diff.html",'w+')as f:
  f.writelines(d.make_file(t1line,t2line))if __name__ =='__main__':main()

WeiyiGeek.difflibの例

(2) filecmpモジュール
説明:filecmpはPythonの組み込みモジュールであり、ファイル/ディレクトリ/トラバースサブディレクトリの差分比較機能を実現できます。
たとえば、レポートでは、出力ターゲットディレクトリが元のファイルまたはサブディレクトリよりも多く、ファイルの名前が同じであっても、同じファイルであるかどうかが判断されます(コンテンツレベルの比較)。

filecmpの3つの操作方法:

(1) 単一ファイルの比較:filecmp.cmp(f1,f2[,shallow]) #f1を比較する,f2ファイルは同じですかTrue/Fasle
 - 浅い:デフォルトはTrueです。これは、osに基づいていないことを意味します.stat()このメソッドは、アクセス時間や変更時間など、比較と判断のためにファイルの基本情報を返します。,Fasleがに基づいている場合(2)複数ファイルの比較:filecmp.cmp(dir1,dir2,common[,shallow]) #2つのディレクトリ内のファイルを比較し、一致、不一致、エラーの3つのリストを返します
- common :リストには、比較するファイルが示されています[f1,f2,f3,f4]-一致には、一致したファイルのリストが含まれますが、それ以外の場合は一致しません。エラーリストは、ディレクトリに存在しないファイルのリストと、アクセス許可などのために比較できないファイルリストを表します。

[ dir1]
ee38a408f20702ccc05fb39a04ee251c  f1
1139929 d8855ced585631c0e3fe8ad8d  f2
c35957891d72c0c32b53a01911224e13  f3

[ dir2]
ee38a408f20702ccc05fb39a04ee251c  f1
9939929 d8855ced625631c0e3fe8ad8d  f2
c35957891d72c0c32b53a01911224e13  f4

# の結果(['f1'],['f2'],['f3'])(3)ディレクトリ比較:dircmp(a,b[,ignore [,hide]]) #ディレクトリ比較オブジェクトを作成します。再帰をサポートすると、ディレクトリ内のファイルとabが存在するサブディレクトリを含む一致するファイルが表示されます。
- ignore :ファイル名無視リスト['RCS',cvs,'tags']- hide :リストのデフォルトを非表示[os.curdir,os.pardir]
# python -c "import os;print (os.curdir,os.pardir)"
# ('.','..')

補足:

実際のケース:

#! /usr/bin/env python
# - *- coding: utf-8-*-
# @ File : filedircmp.py
# @ CreateTime :2019/7/1210:21
# @ Author : WeiyiGeek
# @ Function :ファイル/ディレクトリ間の比較
# @ Software: PyCharm

import filecmp
import pprint

file1 ="./diff.html"
file2 ="./difflibfile.py"
dir1 ="../"
dir2 ="../../"

def main():
 # 例1.ファイル比較が異なります
 print("ファイルは同じですか:%s"%str(filecmp.cmp(file1,file2,False)))print("ファイルは同じですか:%s"%str(filecmp.cmp(file1,file2,True)))

 # 例2.ディレクトリ差分比較機能を実現
 # 現在指定されているディレクトリの内容を比較します
 dirobj = filecmp.dircmp(dir1,dir2,['diff.html']) #ディレクトリ比較、テストを無視.pyファイル
 print("\n[*]  report ")
 dirobj.report()

 # 現在指定されているディレクトリと第1レベルのサブディレクトリの内容を比較します
 print("\n[*]  report partial closure ")
 dirobj.report_partial_closure()

 # 指定されたすべてのディレクトリの内容を再帰的に比較します
 print("\n[*]  report full closure ")
 dirobj.report_full_closure()

 # dircmpクラスの他の属性については、上記を参照してください。
 print("dircmpクラスが残っています_リスト属性:"+str(dirobj.left_list))print("dircmpクラスが残っています_唯一の属性:")
 pprint.pprint(dirobj.left_only)if __name__ =='__main__':main()

# 補足結果:
dircmpクラスが残っています_リスト属性:['.gitignore','.idea','Day1','Day2','Day3','Day4','Day5','Day6','Day7','Pythonセキュリティプラットフォームの構築','Pythonの自動操作とメンテナンス']
dircmpクラスが残っています_唯一の属性:
['. gitignore','.idea','Day1','Day2','Day3','Day4','Day5','Day6','Day7','Pythonセキュリティプラットフォームの構築','Pythonの自動操作とメンテナンス']

WeiyiGeek.filecmpの例

メッセージ送信####

メール送信#####

smtplib送信メールモジュール
説明:SMTP(Simple Mail Transfer Protocol)は、送信元アドレスから宛先アドレスへのメール転送の一連のルールである単純な転送プロトコルです。

②smtplibモジュール:メールの送信を担当します

# オブジェクトSMTPをインスタンス化します
SMTP = smtplib.SMTP(host='', port=0, local_hostname=None,[timeout,]source_address=None)   #初期化により、非SSLsmtpオブジェクトのデフォルトポート25が返されます
SMTP =  smtplib.SMTP_SSL(host='', port=0, local_hostname=None, keyfile=None, certfile=None,[timeout,]context=None, source_address=None) #SSLsmtpオブジェクト、デフォルトポート465を返します

LMTP = smtplib.LMTP(host='', port=LMTP_PORT, local_hostname=None, source_address=None) #LMTPプロトコルはESMTPと非常によく似ており、主に標準のSMTPクライアントに基づいています。

# 例外がスローされました
exception smtplib.SMTPException  #OSErrorのサブクラスであり、このモジュールによって提供される他のすべての例外の基本例外クラスです。

exception smtplib.SMTPServerDisconnected  #この例外は、サーバーが誤って切断した場合、またはサーバーに接続する前にSMTPインスタンスを使用しようとした場合にスローされます。

exception smtplib.SMTPResponseException  #SMTPエラーコードを含むすべての例外の基本クラス。これらの例外は、SMTPサーバーがエラーコードを返したときに生成されます。
# エラーコードが間違ったsmtpに保存されている_コード属性で、smtp_error属性はエラーメッセージに設定されます。

exception smtplib.SMTPSenderRefused  #送信者アドレスは拒否されました。 SMTPResponseException例外によって設定されたすべての属性に加えて、' sender 'SMTPサーバーによって拒否された文字列に設定します。

exception smtplib.SMTPRecipientsRefused #すべての受信者アドレスは拒否されます。各受信者のエラーは、属性受信者を介してアクセスできます。属性受信者はSMTPと同じです。.sendmail()返される辞書はまったく同じ順序です。

exception smtplib.SMTPDataError  #SMTPサーバーはメッセージデータの受け入れを拒否しました。

exception smtplib.SMTPConnectError  #サーバーとの接続の確立中にエラーが発生しました。
exception smtplib.SMTPAuthenticationError   #サーバーとの認証を確立するときにエラーが発生しました

exception smtplib.SMTPHeloError  #サーバーはHELOメッセージを拒否しました。
exception smtplib.SMTPNotSupportedError  #サーバーは、試行されたコマンドまたはオプションをサポートしていません。

# SMTP代表オブジェクト
SMTP.connect(host='localhost', port=0)  #初期化が設定されていない場合ホストとデフォルトポート=25に設定する必要があります。LMTPでUnixソケットを使用することは非常に一般的であるため、接続します()メソッドはこれをサポートする必要があります
SMTP.helo(name='') #HELOを使用して、SMTPサーバーに対して自分自身を識別します。 hostnameパラメータのデフォルトは、ローカルホストの完全修飾ドメイン名です。サーバーから返されたメッセージは、オブジェクトのヘリとして保存されます_resp属性。
SMTP.ehlo(name='') #EHLOを使用して、ESMTPサーバーに対して自分自身を識別します。 hostnameパラメータのデフォルトは、ローカルホストの完全修飾ドメイン名です。
SMTP.login(user, password,*, initial_response_ok=True)  #認証が必要なSMTPサーバーにログインします。パラメータは認証されるユーザー名とパスワードであり、エラーが発生した場合は例外が返されます
SMTP.auth(mechanism, authobject,*, initial_response_ok=True) #サポートされている認証方法のリストについては、authを参照してください。()
SMTP.starttls(keyfile=None, certfile=None, context=None) #SMTP接続をTLSに入れます(トランスポート層のセキュリティ)モード。以降のすべてのsmtpコマンドは暗号化されます。その後、ehloを再度呼び出す必要があります() 
SMTP.sendmail(from_addr, to_addrs, msg, mail_options=(), rcpt_options=())  #郵送,msgは、ASCII範囲の文字を含む文字列、またはバイト文字列にすることができます
SMTP.send_message(msg, from_addr=None, to_addrs=None, mail_options=(), rcpt_options=()) #これはsendmailを呼び出しています()メールを使う便利な方法.メッセージで表されるメッセージ。からの場合_addrがNoneまたはto_addrsがNoneの場合、msg内のアドレスが抽出されます
SMTP.set_debuglevel(level)  #デバッグ出力レベル1を設定します/true/2(バージョン3では.0add)
SMTP.quit() #SMTPセッションを終了し、接続を閉じます
SMTP.close()
# パーソナライズされたメールフォーマット方法をカスタマイズする
•email.message  #メールの構造
 - email.message.EmailMessage()  #オブジェクトmsgを返し、送信テキストを作成して配列に格納します
•email.parser  #メール情報を解析する

•email.mime #電子メールとMIMEオブジェクトを最初から作成する(HTMLをサポート)- email.mime.text.MIMEText(""" HTML """,_subtype='plain', _charset=None,*, policy=compat32)  #HTML/subtype:テキストタイプ(プレーンまたはhtml)/文字コード
 - email.mime.multipart.MIMEMultipart(_subtype='mixed', boundary=None, _subparts=None,*, policy=compat32,**_params) #メール本文の複数の部分を含むMIMEオブジェクトを生成します,サブタイプの3つのサブタイプ:混合)(添付ファイル付きのメッセージ本文),related(埋め込みリソースのメール本文を作成する),alternative(プレーンテキストとハイパーテキストが共存するメール本文を作成する);- email.mime.audio.MIMEAudio(_audiodata, _subtype=None, _encoder=email.encoders.encode_base64,*, policy=compat32,**_params) #オーディオデータ、audiodatarawバイナリオーディオデータバイト文字列を含むメッセージ本文を作成します;
 email.mime.image.MIMEImage(_imagedata, _subtype=None, _encoder=email.encoders.encode_base64,*, policy=compat32,**_params) #画像データ、imagedata、生のバイナリ画像データのバイト文字列を含むメッセージ本文を作成します;

モジュールの例:

# 例1.SMTPクラスはwithステートメントをサポートします。この使用後に終了すると、SMTP QUITコマンドが自動的に発行されます(はい、接続が正常かどうかを判断します)
>>> with smtplib.SMTP("smtp.qq.com",25)as smtp: 
 smtp.noop()  #ポート25非SSL
 smtp.helo('[email protected]')(250, b'Ok')(250, b'smtp.qq.com')>>>with smtplib.SMTP_SSL("smtp.qq.com",465)as smtp:  
 smtp.noop()  #465ポートSSL
 smtp.helo('[email protected]')(250, b'Ok')(250, b'smtp.qq.com')

# 例外がスローされ、heloがそれ自体を識別します
>>> try:
 smtp = smtplib.SMTP("smtp.sina.com",25)
 smtp.helo('[email protected]')
 smtp.ehlo("[email protected]")
 smtp.quit('flag') 

except smtplib.SMTPException as connect:print("+ [ Error ]:"+connect)(250, b'smtp-5-123.smtpsmail.fmail.xd.sinanode.com')(221, b'smtp-5-123.smtpsmail.fmail.xd.sinanode.com')(250, b'smtp.sina.com\nPIPELINING\nSIZE 73400320\nSTARTTLS\nAUTH LOGIN PLAIN\nAUTH=LOGIN\nMAILCOMPRESS\n8BITMIME')

# ログインと例外がスローされました
>>> smtp = smtplib.SMTP("smtp.qq.com",25)>>>try:
 res = smtp.login('[email protected]','itfbbfqxnbhda')print(res)
except smtplib.SMTPException as test:print("Error:"+str(test))
# 認証は成功しました(235, b'Authentication successful')  

# 例外がスローされました
>>> smtp = smtplib.SMTP("smtp.qq.com",25)>>>try:
 res = smtp.login('[email protected]','itfbbfqxnbhda')print(res)
except smtplib.SMTPException as test:print("Error:"+str(test))

Error:(535, b'Error: \xc7\xeb\xca\xb9\xd3\xc3\xca\xda\xc8\xa8\xc2\xeb\xb5\xc7\xc2\xbc\xa1\xa3\xcf\xea\xc7\xe9\xc7\xeb\xbf\xb4: http://service.mail.qq.com/cgi-bin/help?subtype=1&&id=28&&no=1001256')

# 認定プロセス
# SMTP(host,port)-> login
# SMTP()->connect(host,port)->ehlo('[email protected]')-> login
>>> smtp = smtplib.SMTP("smtp.qq.com",25)>>>try:
 res = smtp.login('[email protected]','iocztfbbfqxnbhda')print(res)
 smtp.close()
 smtp.connect("smtp.qq.com",25)
 smtp.ehlo("[email protected]")
 res = smtp.login('[email protected]','iocztfbbfqxnbhda')print(res)
except smtplib.SMTPException as test:print("Error:"+str(test))(235, b'Authentication successful')(220, b'smtp.qq.com Esmtp QQ Mail Server')(250, b'smtp.qq.com\nPIPELINING\nSIZE 73400320\nSTARTTLS\nAUTH LOGIN PLAIN\nAUTH=LOGIN\nMAILCOMPRESS\n8BITMIME')(235, b'Authentication successful')

メール送信例

import smtplib
from email.message import EmailMessage
msg =EmailMessage()
msg['Subject']='Login Smtp Succeeful'
msg['From']='WeiyiGEEK'
msg['To']='[email protected]'
msg.set_content("接続サーバーをテストする(1)")
smtp = smtplib.SMTP("smtp.qq.com",25)try:
 res = smtp.login('WeiyiGEEK','iocztfbbfqxnbhda') 
 smtp.send_message(msg)print(res)
 smtp.close()
except smtplib.SMTPException as test:print("Error:"+str(test))

実際のケース(1)テキストHTML情報の送信:

#! /usr/bin/env python
# - *- coding: utf-8-*-
# @ File : stmpDemo.py
# @ CreateTime :2019/7/2616:17
# @ Author : WeiyiGeek
# @ Function :メールの送信を実現
# @ Software: PyCharm

import smtplib
import socket
from email.mime.text import MIMEText

SMTPHOST ="smtp.qq.com"
SMTPUSER =""
SMTPPASS ="jxgovvrd"
FROM =""
TO =""
Subject ="smtplib送信モジュールをテストします"

def info():
 # コンピューター名を取得する
 hostname = socket.gethostname()
 # ローカルIPを取得する
 ip = socket.gethostbyname(hostname)return hostname + ip

def sendmail(From,To,boby):try:
  # server = smtplib.SMTP() #SMTPオブジェクトを作成する
  # server = smtplib.connect(SMTPHOST,"25") #非SSLモードでsmtpホストに接続します
  server = smtplib.SMTP_SSL(SMTPHOST)     #SSL方式でsmtpホストに接続するには、デフォルトでポート465を使用します
  # server.starttls()  #安全な転送モードを有効にする
  server.login(SMTPUSER, SMTPPASS)  #アカウントのメール確認
  server.sendmail(From, To, boby)
  server.quit()print("成功! dindong")
 except Exception as e:print("[送信に失敗しました]!:"+str(e))

def main():
 Content =info()+"\r\n私はコンピューター技術の愛好家であり、Pythonの操作と保守を学んでいます。"
 msg =MIMEText("""
 # MIMEtextオブジェクトを作成し、HTMLコンテンツを個別に挿入します/の種類/テキスト/文字コード、
 < table width="400" border="1px solid red"><th>No.1</th><th>2位</th><tr><td>ホスト名</td><td>IPアドレス</td><tr></table>"""+Content, "HTML" ,"UTF-8") #sendmailのメインコンテンツを組み立てます

 msg['Subject']= Subject  #MIMETextの後に配置する必要があります
 msg['From']= FROM
 msg['To']= TO
 sendmail(FROM, TO, msg.as_string())if __name__ =='__main__':main()

WeiyiGeek。テストの送信

実例(2)画像フォーマットと添付ファイル送信:

#! /usr/bin/env python
# - *- coding: utf-8-*-
# @ File : stmplibsimple3.py
# @ CreateTime :2019/7/3016:07
# @ Author : WeiyiGeek
# @ Function :スクリーンショットを送信し、添付ファイル形式でメールを送信します
# @ Software: PyCharm

import smtplib,os
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from PIL import ImageGrab

SMTPHOST ="smtp.qq.com"
SMTPUSER ="[email protected]"
SMTPPASS ="iocztfbbfqxnbhda"
SUBJECT = u"スクリーンショット送信および添付ファイル形式の電子メール送信テスト"
FROM = SMTPUSER
TO ="[email protected]"

def captrue():
 img = ImageGrab.grab(bbox=(0,0,1141,610))
 img.save('captrue.jpg','JPEG')
 os.system("ipconfig > ip.txt")

def addimg(src, imgid):"""
 mimeiMAGEオブジェクトに画像とiDを追加します
 : param src:ピクチャーパス
 : param imgid:画像ID
 : return:imgImageオブジェクトに戻る
    """
 withopen(src,'rb')as img:
  msgimage =MIMEImage(img.read())  #MIMEImageオブジェクトを作成して、画像の内容をパラメーターとして読み取ります
  msgimage.add_header('Content-ID', imgid) #画像ファイルの内容を指定します-ID,imgタグで使用
  return msgimage  #MIMEImageオブジェクトを返します

def addacc():
 # MIMETextオブジェクトを作成して、ドキュメントを電子メールに添付します
 attach =MIMEText(open('./ip.txt','r').read(),"plain","utf-8")
 attach["Context-type"]="text/plain"  #ファイルタイプを指定します
 attach["Content-Disposition"]="attachment; filename='ip.txt'"  #ダウンロードダイアログの設定
 return attach

def sendmain(msg):try:
  server = smtplib.SMTP_SSL(SMTPHOST)
  server.login(SMTPUSER, SMTPPASS)
  server.sendmail(FROM, TO, msg.as_string())
  server.quit()print("メールは正常に送信されました")
 except Exception as err:print("送信に失敗しました:"+str(err))

def emailContent():
 message =MIMEMultipart('related')  #MIMEutilpartオブジェクトを作成し、relatedを使用して埋め込みリソースのメッセージ本文を定義します
 msgtext =MIMEText("""
  < font color=red>公式サイトビジネス添付</font><table border="0" cellspacing="0" cellpadding="2"><tr bgcolor="#CECFAD" height="20" style="front-size:14px"><td colspan="2">電子メールで送信されたシステムスクリーンショット画像</td></tr><tr><td><a href="www.weiyigeek.github.io"><img src="cid:captrue" alt="Pythonのスクリーンショット"></a></td></tr></table>""",'html','utf-8')  #imgタグの画像はコンテンツ経由です-IDで参照
 message.attach(msgtext)
 message.attach(addimg("./captrue.jpg","captrue"))
 message.attach(addacc())
 message['Subject']= SUBJECT
 message['From']= FROM
 message['To']= TO
 sendmain(message)  #郵送

def main():captrue()  #スクリーンショット
 emailContent() #メールの構造

if __name__ =='__main__':main()

WeiyiGeek。写真やドキュメントをメールで送信

# See also:
Module smtplib :SMTP(Simple Mail Transport Protocol) client
Module poplib :POP(Post Office Protocol) client
Module imaplib :IMAP(Internet Message Access Protocol) client
Module nntplib :NNTP(Net News Transport Protocol) client
Module mailboxTools :さまざまな標準形式を使用して、ディスク上のメッセージコレクションを作成、読み取り、および管理するためのツール。
Module smtpd  : SMTP server framework(primarily useful for testing)
 テスト環境

クライアントで.jaylin.comでメールを送信する:

# telnet mail.jaylin.com 25

Trying 192.168.1.9...

Connected to mail.jaylin.com(192.168.1.9).

Escape character is '^]'.220 mail.jaylin.com ESMTP Sendmail 8.13.8/8.13.8; Wed,21 Oct 200905:12:41+0800

EHLO mail.jaylin.com

250- mail.jaylin.com Hello [192.168.1.7], pleased to meet you

250- ENHANCEDSTATUSCODES

250- PIPELINING

250- 8 BITMIME

250- SIZE

250- DSN

250- ETRN

250- DELIVERBY

250 HELP

MAIL FROM:[email protected]2502.1.0[email protected] Sender ok

RCPT TO:[email protected]2502.1.5[email protected] Recipient ok

DATA

354 Enter mail, end with"." on a line by itself

SUBJECT xinxin

lala~.2502.0.0 n9KLCfJo004052 Message accepted for delivery

quit

2212.0.0 mail.jaylin.com closing connection

Connection closed by foreign host.

クライアントで.xin.comでメールを受信する:# telnet mail.xin.com 110

Trying 192.168.2.11...

Connected to mail.xin.com(192.168.2.11).

Escape character is '^]'.+OK Dovecot ready.

User xin

+ OK

Pass ******+OK Logged in.

List

+ OK 12 messages:162126243619461956206841783987579738107371174212740.

retr 12+OK 740 octets

Return-Path:<[email protected]>

Received:from smarthost.jaylin.com(smarthost.jaylin.co [192.168.1.6](may be forged))

  by mail.xin.com(8.13.8/8.13.8)with ESMTP id n9KLDC2H004460

  for<[email protected]>; Wed,21 Oct 200905:13:12+0800

Received:from mail.jaylin.com(mail.jaylin.com [192.168.1.9])

  by smarthost.jaylin.com(8.13.8/8.13.8)with ESMTP id n9KLD7VC006062

  for<[email protected]>; Wed,21 Oct 200905:13:07+0800

Received:from mail.jaylin.com([192.168.1.7])

  by mail.jaylin.com(8.13.8/8.13.8)with ESMTP id n9KLCfJo004052

  for[email protected]; Wed,21 Oct 200905:12:54+0800

Date: Wed,21 Oct 200905:12:41+0800

From:[email protected]

Message-Id:<[email protected]>

 

SUBJECT xinxin

lala~.

quit

+ OK Logging out.

Connection closed by foreign host.

 

 

Smarthostが有効であることを確認するために、3つのSendmailサーバーを確認しましょう。/var/log/メールログログファイル。

送信者メール.jaylin.com:

Oct 2105:13:02 mail sendmail[4052]: n9KLCfJo004052:[email protected], size=21,class=0, nrcpts=1, msgid=<[email protected]>, proto=ESMTP, daemon=MTA, relay=[192.168.1.7]

Oct 2105:13:02 mail sendmail[4054]: n9KLCfJo004052:[email protected],[email protected](501/501), delay=00:00:08, xdelay=00:00:00, mailer=relay, pri=120021, relay=smarthost.jaylin.com [192.168.1.6], dsn=2.0.0, stat=Sent(n9KLD7VC006062 Message accepted for delivery)

SmarthostとしてのSmarthost.jaylin.com:

Oct 2105:13:07 client1 sendmail[6062]: n9KLD7VC006062:from=<[email protected]>, size=304,class=0, nrcpts=1, msgid=<[email protected]>, proto=ESMTP, daemon=MTA, relay=mail.jaylin.com [192.168.1.9]

Oct 2105:13:07 client1 sendmail[6064]: n9KLD7VC006062: to=<[email protected]>, delay=00:00:00, xdelay=00:00:00, mailer=esmtp, pri=120304, relay=mail.xin.com.[192.168.2.11], dsn=2.0.0, stat=Sent(n9KLDC2H004460 Message accepted for delivery)

受信者のメール.xin.com:

Oct 2105:13:12 mail sendmail[4460]: n9KLDC2H004460:from=<[email protected]>, size=489,class=0, nrcpts=1, msgid=<[email protected]>, proto=ESMTP, daemon=MTA, relay=smarthost.jaylin.co [192.168.1.6](may be forged)

Oct 2105:13:12 mail sendmail[4461]: n9KLDC2H004460: to=<[email protected]>, delay=00:00:00, xdelay=00:00:00, mailer=local, pri=30702, dsn=2.0.0, stat=Sent

Oct 2105:13:35 mail dovecot: pop3-login: Login: user=<xin>, method=PLAIN, rip=::ffff:192.168.2.8, lip=::ffff:192.168.2.11

Oct 2105:13:41 mail dovecot:POP3(xin): Disconnected: Logged out top=0/0, retr=1/756, del=0/12, size=8497

Recommended Posts

Pythonの自動操作とメンテナンス2
Pythonの自動操作とメンテナンス1
Pythonファイル操作
Python and Go
python操作kafka
Pythonファイルとディレクトリの操作コードの概要
Pythonの自動化された操作と保守のLinuxの概要、および仮想マシンのインストールと使用に関する究極のガイド
Pythonの内省と考察
[python] ubuntuの下のpython2とpython3
Python操作yaml命令
Pythonの分解とパッケージ化
Python3の構成とentry.md
Pythonの紹介と環境のインストール
Python操作Excelマージセル
Pythonはクローラーとアンチクローラーを知っています
centos7はpython3とipythonをインストールします
Centos6.10はpythonとyumを再インストールします
Pythonオープン読み取りおよび書き込み
CentOS7はpython3とpip3をインストールします
Pythonのデータ構造とアルゴリズム
Pythonマルチプロセスおよびマルチスレッドの基本
CentOS6.9はpythonをコンパイルしてインストールします
クイックスタートPythonファイル操作
CentOS6はpython3をコンパイルしてインストールします
Pythonのジェネレーターとイテレーター
Pythonファイルの読み取りおよび書き込み操作
Pythonとjsのインタラクティブな呼び出しメソッド
魔法の方法とPythonの使用
Pythonは正と負の数を判断します
pythonftpアップロードファイルとフォルダー
Pythonクローラー|コグニティブクローラーのリクエストとレスポンス
CentOS7のインストールとGitlabのメンテナンス
Pythonは文字列と数値のスプライシングを実装します
Pythonリスト理解操作例の概要
Pythonファイル操作の基本的なプロセス分析
Python関数の定義とパラメーターの説明
pythonselenium操作cookieの実装
CentOSはPython3とpip3をすばやくインストールします
pythonクローラーのMongodbとpythonの相互作用
Python3をインストールし、CentOS8でansible
PDFおよびCDFの例を処理するPython
株で遊んでPythonを学んだ
centos7でpython3環境を構成し、
python操作redisのいくつかの例
Pythonはjsonファイルを読み書きします
pythonアクセスAlipayの操作例
Pythonはユーザー名とパスワードの検証を実装しています
CentOS7の下にPython3とPyをインストールします
python accesshdfsの操作
Pythonは実行する操作コードを処理します
Pythonの基本的な構文と数値タイプ
Python学習OSモジュールと使用法