不能,Outlook 模組無法讀取本機檔案。
撰寫程式,先讀取 Excel 檔案內容、然後在程式中處理數值、並使用數值渲染報表模板、接上寄送電郵的功能,最後定時觸發程式,即可實現定時寄送報表電郵。
以 Python 為例:
from openpyxl import load_workbook
from jinja2 import Environment, FileSystemLoader
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
import smtplib
import ssl
# -------------------------
# 1. 讀取 Excel
# -------------------------
def load_report_data(excel_path):
wb = load_workbook(excel_path, data_only=True)
ws = wb["Report"]
return {
"sales": ws["B2"].value,
"orders": ws["B3"].value,
"avg_order_value": ws["B4"].value,
}
# -------------------------
# 2. Jinja2 渲染 HTML
# -------------------------
def render_email(template_name, data):
env = Environment(
loader=FileSystemLoader("templates"),
autoescape=True,
)
template = env.get_template(template_name)
return template.render(**data)
# -------------------------
# 3. SMTP 寄送
# -------------------------
def send_email(
smtp_host,
smtp_port,
username,
password,
sender,
recipients,
subject,
html_body,
):
message = MIMEMultipart("alternative")
message["From"] = sender
message["To"] = ", ".join(recipients)
message["Subject"] = subject
html_part = MIMEText(html_body, "html", "utf-8")
message.attach(html_part)
context = ssl.create_default_context()
with smtplib.SMTP(smtp_host, smtp_port) as server:
server.starttls(context=context)
server.login(username, password)
server.sendmail(
sender,
recipients,
message.as_string(),
)
# -------------------------
# 4. Main
# -------------------------
if __name__ == "__main__":
report_data = load_report_data("report.xlsx")
html = render_email(
"report_email.html",
report_data,
)
send_email(
smtp_host="smtp.example.com",
smtp_port=587,
username="report@example.com",
password="YOUR_PASSWORD",
sender="report@example.com",
recipients=[
"user1@example.com",
"user2@example.com",
],
subject="每週報表",
html_body=html,
)
print("Email sent")
Jinja 2 模板的渲染結果為 HTML,可以直接作為電郵內容發送。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body style="font-family: Arial, sans-serif;">
<h2>每週報表</h2>
<table
cellpadding="8"
cellspacing="0"
border="1"
style="border-collapse: collapse;"
>
<tr>
<th>指標</th>
<th>數值</th>
</tr>
<tr>
<td>營收</td>
<td>
{{ "{:,.0f}".format(sales) }}
</td>
</tr>
<tr>
<td>訂單數</td>
<td>
{{ "{:,}".format(orders) }}
</td>
</tr>
<tr>
<td>平均客單價</td>
<td>
{{ "{:,.0f}".format(avg_order_value) }}
</td>
</tr>
</table>
<p>
本郵件由系統自動產生,請勿直接回覆。
</p>
</body>
</html>