#!/usr/bin/env python3
# coding: utf-8


#
# v25.05-1
#
#
# LICENSE
#
#  このソフトウェアは、無権利創作宣言に基づき著作権放棄されています。
#  営利・非営利を問わず、自由にご利用いただくことが可能です。
#
#   https://www.2pd.jp/license/
#


import sys
import os
import traceback
import datetime
import base64
import email
import ssl
from smtplib import SMTP
from smtplib import SMTP_SSL


LOG_DIR = "mail_log"

SENDER_ADDR = "hoge@example.jp"
SMTP_HOST = "smtp.example.jp"
SMTP_PORT = 465
SMTP_USER = "hoge"
SMTP_PASS = "abcd1234"


app_dir = os.path.dirname(os.path.abspath(__file__))
os.chdir(app_dir)


mail_data = sys.stdin.read()
msg = email.message_from_string(mail_data)

if SENDER_ADDR is not None and len(SENDER_ADDR) >= 1:
    del msg["From"]
    msg["From"] = SENDER_ADDR


if SMTP_HOST is not None and len(SMTP_HOST) >= 1:
    try:
        if SMTP_PORT == 465:
            context = ssl.create_default_context()
            server = SMTP_SSL(SMTP_HOST, SMTP_PORT, context=context)
        else:
            server = SMTP(SMTP_HOST, SMTP_PORT)
            
            if SMTP_PORT == 587:
                server.starttls()
        
        server.login(SMTP_USER, SMTP_PASS)
        
        server.send_message(msg)
        
        server.quit()
    except:
        send_result = "送信失敗 " + traceback.format_exc()
    else:
        send_result = "送信成功"
    
else:
    send_result = "送信先サーバが設定されていません"


if LOG_DIR is not None and len(LOG_DIR) >= 1:
    if not os.path.exists(LOG_DIR):
        os.mkdir(LOG_DIR)
        os.chmod(LOG_DIR, 0o777)
    
    dt_now = datetime.datetime.now()
    log_dir_path = LOG_DIR + "/" + dt_now.strftime("%Y%m%d")
    
    if not os.path.exists(log_dir_path):
        os.mkdir(log_dir_path)
        os.chmod(log_dir_path, 0o777)
    
    log_file_path = log_dir_path + "/mail_" + dt_now.strftime("%H%M%S.%f") + ".txt"
    
    log_text = ""
    
    msg_encoding = email.header.decode_header(msg.get("Subject"))[0][1] or "iso-2022-jp"
    
    body_is_base64_encoded = False
    
    for header_name in msg.keys():
        header_data = email.header.decode_header(msg.get(header_name))
        
        log_text += "[" + header_name + "] "
        
        if header_name == "Content-Transfer-Encoding" and header_data[0][0] == "BASE64":
            body_is_base64_encoded = True
        
        for data_item in header_data:
            if isinstance(data_item[0], bytes):
                log_text += data_item[0].decode(msg_encoding)
            else:
                log_text += data_item[0] + " "
        
        log_text += "\n"
    
    log_text += "\n[本文]\n"
    
    if msg.is_multipart():
        for payload in msg.get_payload():
            if payload.get_content_type() == "text/plain":
                body_text = payload.get_payload()
    else:
        if msg.get_content_type() == "text/plain":
            body_text = msg.get_payload()
    
    if body_is_base64_encoded:
        log_text += base64.b64decode(body_text).decode()
    else:
        log_text += body_text
    
    log_text += "\n\n[送信結果] " + send_result
    
    with open(log_file_path, "w", encoding="utf-8") as fp:
        fp.write(log_text)
        fp.close
    
    os.chmod(log_file_path, 0o766)

