情境說明
- 前面三篇,說明了如何使用容器進行測試
-
docker run
反覆地用不同組合跑跑爛,跑爛的重來而已
- 設想好如何快速轉移執行環境,兼顧機敏資料不外流
- 把不重要的東西、可外流的內容,包進容器映像檔(貨櫃屋?!)
- 在搬到新家後,將機敏資料透過系統變數扔進去
- 接著要做將檔案傳出的功能
調查公司信箱支援的方法
- 在不同家公司,都會有不同的電子郵件系統,所以要先調查有哪些 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
- 再測試寄信功能
- 去收件者信箱收信