ncコマンドやTelnetが使えない状況でメールを送信するPythonの使い方

今日はセキュリティ上の理由から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日をお過ごし下さい!

タイトルとURLをコピーしました