[ TOC]
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()
説明:一般的に使用される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)"
# ('.','..')
補足:
report():現在指定されているディレクトリの内容を比較します
report_partial_closure():現在指定されているディレクトリと第1レベルのサブディレクトリの内容を比較します
report_full_closure():指定されたすべてのディレクトリの内容を再帰的に比較します
左:左ディレクトリ
右:右のディレクトリ
left_list:左側のフォルダー内のファイルとフォルダーのリスト。
right_list:適切なフォルダー内のファイルとフォルダーのリスト。
left_only:左側のフォルダーにのみ存在するファイルまたはフォルダー。
right_only:適切なフォルダーにのみ存在するファイルまたはフォルダー。
共通:両方のフォルダーに存在するファイルまたはフォルダー。
common_dirs:両方のフォルダーに存在するサブフォルダー。
common_files:両方のフォルダーに存在するサブファイル。
common_funny:両方のフォルダーに存在するサブフォルダー。
same_files:一致するファイル;
diff_files:一致しないファイル。
Funny_files:両方のフォルダーに存在するが、比較できないファイル。
subdirs:common_dirsディレクトリ名を辞書タイプの形式で新しいdircmpオブジェクトにマップします
実際のケース:
#! /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