iT邦幫忙

2023 iThome 鐵人賽

DAY 24
0

情境說明

  • 前面三篇,說明了如何使用容器進行測試
  • docker run 反覆地用不同組合跑跑爛,跑爛的重來而已
  • 設想好如何快速轉移執行環境,兼顧機敏資料不外流
  • 把不重要的東西、可外流的內容,包進容器映像檔(貨櫃屋?!)
  • 在搬到新家後,將機敏資料透過系統變數扔進去
    • ASANA_TOKEN
  • 接著要做將檔案傳出的功能

調查公司信箱支援的方法

https://ithelp.ithome.com.tw/upload/images/20230925/20141784Pn9i62XQ1P.png

  • 在不同家公司,都會有不同的電子郵件系統,所以要先調查有哪些 protocol 是被允許使用的

實作部分

  • 原本直接採 ex.xxxxxxx.com ,不過在 TLS 部分卡住了
  • 經過調查,可能是憑證沒搞好,這是公司網管在負責的部分,可能沒做好,我先假裝不知道
  • SMTP 部分的參考原始碼
import smtplib

def prompt(prompt):
    return input(prompt).strip()

fromaddr = prompt("From: ")
toaddrs  = prompt("To: ").split()
print("Enter message, end with ^D (Unix) or ^Z (Windows):")

# Add the From: and To: headers at the start!
msg = ("From: %s\r\nTo: %s\r\n\r\n"
       % (fromaddr, ", ".join(toaddrs)))
while True:
    try:
        line = input()
    except EOFError:
        break
    if not line:
        break
    msg = msg + line

print("Message length is", len(msg))

server = smtplib.SMTP('localhost')
server.set_debuglevel(1)
server.sendmail(fromaddr, toaddrs, msg)
server.quit()

實作內容

sendmail.py

import re
import smtplib
from configparser import ConfigParser
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText


class MailSender:

    def __init__(self, title=None, content=None, revicer_addr=None):
        # 從指定路徑讀取信箱登入資訊
        cfg = ConfigParser()
        cfg.read('users/mail.ini')
        # 設定信件內文格式
        self.content = MIMEMultipart()
        self.host = cfg['DEFAULT']['Host']
        self.sender = cfg['DEFAULT']['SenderAddress']
        self.sender_secret = cfg['DEFAULT']['SenderSecret']
        if not revicer_addr:
            receiver_str = cfg['DEFAULT']['ReceiverAddress']
        else:
            receiver_str = reciver_addr
        self.receiver = re.findall(r"[\w\+]+@\w+[^,\s]*", receiver_str)
        # Setup receiver(s)
        self.content['from'] = self.sender
        self.content['to'] = ','.join(self.receiver)

        # Load mail title if value
        if title:
            self.content['subject'] = title
        else:
            self.content['subject'] = 'Asana 工作彙整'

        # Load mail content if value
        if content:
            self.content.attach(MIMEText(content, 'plain', 'utf-8'))

    def set_content(self, mail_content):
        self.content.attach(MIMEText(mail_content, 'plain', 'utf-8'))

    def send_mail(self):
        with smtplib.SMTP(host=self.host) as smtp:  # 設定SMTP伺服器
            try:
                smtp.ehlo()
                #smtp.starttls()
                smtp.login(self.sender, self.sender_secret)
                smtp.send_message(self.content)
                print("Send to: "+str(self.receiver))
                smtp.close()
            except Exception as e:
                print("Error message: ", e)

user/mail.ini

[DEFAULT]
Host = <ex.xxx.com>
SenderAddress = <sender@mail.com>
ReceiverAddress = <reciver@mail.com>
SenderSecret = <secret>

解析說明

  • 避免在程式碼裡面寫入機敏資料
  • 我在開發的時候暫時先從相對路徑的 user/mail.ini 拿
  • 之後的規劃是,「密碼」要從系統變數裡面拿
  • 而 mail server 、 sender address 和 sen 寫進 local file (user/mail.ini)
  • 因為一呼叫 smtp.starttls() 就噴錯誤,所以暫時先註解掉這行
  • 這意味著程式碼運行環境和郵件伺服器之間,直接傳輸明文

測試

  • 先改 mail.ini
    https://ithelp.ithome.com.tw/upload/images/20230926/20141784HJXexYkQ8k.png
  • 再測試寄信功能
    https://ithelp.ithome.com.tw/upload/images/20230926/20141784tpzItNip3V.png
  • 去收件者信箱收信
    https://ithelp.ithome.com.tw/upload/images/20230926/20141784bQL1J70pYS.png

上一篇
Day 23 - 避免打包機敏資訊、在容器內使用系統變數
下一篇
Day 25 - SMTP / MIME 是什麼、將投影片夾檔送出
系列文
挽救肝指數 x 職場生存術 x 老闆愛看的投影片製造機30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言