今日はセキュリティ上の理由からTelnetが使用できないあるいはnc
コマンドがうまく動作しない場合に特定のファイルを添付したメールを送信するためのPythonの使用方法を紹介します。
30日間返金保証でITが学べるUdemy
ITパスポートなど資格取得にも最適なので興味があれば申し込んでみて下さい。
問題の背景
- Telnetのセキュリティ上の問題: Telnetプロトコルはセキュリティ上のリスクがあるため多くの企業環境で使用が制限されています。
- ncコマンドの限界:
nc
コマンドも一部の状況で想定通りに動作しないことがあるため代替手段が求められることがあります。
解決策: Pythonを使用したメール送信
以下はPythonでSMTPサーバーを使用してメールを送信するスクリプトです。
このスクリプトはPython 3.5以前のバージョンでも動作しテキストファイルからメール本文を読み込み指定したファイルを添付してメールを送信します。
※Python2.7にて確認済み
以下のスクリプト(send_email.py
)はメールを送信する際にTO, CC, BCCを指定できる機能とファイル添付機能を持たせています。
import smtplib import sys from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.mime.base import MIMEBase from email import encoders import os SMTP_SERVER = "smtp.lowe-ssol.com" SMTP_PORT = 25 FROM = "sender@lowe-ssol.com" def parse_recipients(input_string): return [email.strip() for email in input_string.split(",") if email.lower() != "none" and email.strip()] TO = parse_recipients(sys.argv[1]) CC = parse_recipients(sys.argv[5]) BCC = parse_recipients(sys.argv[6]) SUBJECT = sys.argv[2] FILE_PATH = sys.argv[3] FILE_NAME = os.path.basename(FILE_PATH) BODY_FILE_PATH = sys.argv[4] # BODY_TEXT を定義 with open(BODY_FILE_PATH, "r") as body_file: BODY_TEXT = body_file.read() message = MIMEMultipart() message['From'] = FROM message['To'] = ", ".join(TO) message['Cc'] = ", ".join(CC) # BCCはヘッダに追加しない message['Subject'] = SUBJECT # BODY_TEXT をメール本文として追加 message.attach(MIMEText(BODY_TEXT, 'plain')) with open(FILE_PATH, "rb") as attachment_file: base64_file = MIMEBase('application', 'octet-stream') base64_file.set_payload(attachment_file.read()) encoders.encode_base64(base64_file) base64_file.add_header('Content-Disposition', "attachment; filename=\"{}\"".format(FILE_NAME)) message.attach(base64_file) text_message = message.as_string() recipients = TO + CC + BCC server = smtplib.SMTP(SMTP_SERVER, SMTP_PORT) server.sendmail(FROM, recipients, text_message) server.quit()
スクリプトの使用方法
このスクリプトを使用するためには以下のようにコマンドラインから引数を渡します。
※TO ,CC,BCC部分の省略したい時は「none」を代入するとPythonで無視するようにしています。
※複数の宛先を指定したい場合はカンマ”,”で区切って下さい。
send_email.py
recipient@lowe-ssol.com "Subject Here" /path/to/attachment.txt /path/to/body.txt cc@lowe-ssol.com bcc@lowe-ssol.com
まとめ
今回の記事ではTelnetやnc
コマンドが使用できない状況での対処法としてPythonを使用したメール送信の方法を紹介しました。この手法は異なるシステム間での通信が必要な場合や自動化された通知が必要なシナリオで特に役立つでしょう。
この記事がお役に立てれば幸いです。
それでは、今日も楽しい1日をお過ごし下さい!