十個超級Python腳本,生活辦公更高效
在這個快節(jié)奏、高效率的時代,掌握時間管理和信息整理的藝術(shù)尤為重要。今天分享一系列Python自動化腳本,幫助提升工作效率和信息處理能力。從時間管理到數(shù)據(jù)整理,從內(nèi)容創(chuàng)作到郵件分析,這些腳本覆蓋了日常工作和生活中的多個方面,助你以更智能、更高效的方式完成任務(wù)。
1.番茄鐘(Pomodura)
番茄工作法是提高生產(chǎn)力的最簡單方法之一。將工作時間劃分為25分鐘的工作段,每段之間用5分鐘的短暫休息來分隔。
這個Python自動化腳本進一步強化了番茄工作法,在計時器結(jié)束時會自動鎖定你的設(shè)備,確保你的休息時間。
import tkinter as tk
import time
import ctypes
import os
from threading import Timer
class PomodoroTimer:
def __init__(self, root):
self.root = root
self.root.title("Pomodoro Timer")
self.root.geometry("300x200")
self.time_var = tk.StringVar()
self.time_var.set("25:00")
self.running = False
self.paused = False
self.remaining_time = 25 * 60 # 25 minutes
self.label = tk.Label(root, textvariable=self.time_var, font=("Helvetica", 48))
self.label.pack(pady=20)
self.start_button = tk.Button(root, text="Start", command=self.start_timer)
self.start_button.pack(side=tk.LEFT, padx=10)
self.pause_button = tk.Button(root, text="Pause", command=self.pause_timer)
self.pause_button.pack(side=tk.LEFT, padx=10)
self.reset_button = tk.Button(root, text="Reset", command=self.reset_timer)
self.reset_button.pack(side=tk.LEFT, padx=10)
def update_time(self):
if self.running:
minutes, seconds = divmod(self.remaining_time, 60)
self.time_var.set(f"{minutes:02}:{seconds:02}")
if self.remaining_time > 0:
self.remaining_time -= 1
self.root.after(1000, self.update_time)
else:
self.running = False
self.lock_screen()
def start_timer(self):
if not self.running:
self.running = True
self.paused = False
self.update_time()
def pause_timer(self):
if self.running:
self.running = False
self.paused = True
def reset_timer(self):
self.running = False
self.paused = False
self.remaining_time = 25 * 60
self.time_var.set("25:00")
def lock_screen(self):
if os.name == 'nt': # Windows
ctypes.windll.user32.LockWorkStation()
elif os.name == 'posix': # macOS and Linux
# 這是一個占位符,因為在macOS/Linux上鎖定屏幕通常需要不同的處理
# 對于macOS,使用:os.system('/System/Library/CoreServices/Menu\ Extras/User.menu/Contents/Resources/CGSession -suspend')
# 對于Linux,使用:os.system('gnome-screensaver-command --lock')
print("Locking screen on macOS/Linux is not implemented in this script.")
if __name__ == "__main__":
root = tk.Tk()
app = PomodoroTimer(root)
root.mainloop()
2 今日視野(TodayScope)
這個自動化腳本能夠自動為你匯總當天的頭條新聞、歷史事件和星座運勢,一并呈現(xiàn),一目了然。
import tkinter as tk
from tkinter import ttk
import requests
from bs4 import BeautifulSoup
def get_trending_news():
"""Fetch and return trending news headlines."""
url = "http://newsapi.org/v2/top-headlines?country=us&apiKey=CREATE_YOUR_OWN"
page = requests.get(url).json()
articles = page["articles"]
results = [ar["title"] for ar in articles[:10]]
headlines = "\n".join(f"{i + 1}. {title}" for i, title in enumerate(results))
return headlines
def get_horoscope(sign_name):
"""Fetch and return horoscope for the specified sign."""
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}
signs = {
'aries':1, 'taurus':2, 'gemini':3, 'cancer':4,
'leo':5, 'virgo':6, 'libra':7, 'scorpio':8,
'sagittarius':9, 'capricorn':10, 'aquarius':11, 'pisces':12
}
sign_id = signs.get(sign_name.lower())
if sign_id is None:
return "Sign not found."
url = f'https://www.horoscope.com/us/horoscopes/general/horoscope-general-daily-today.aspx?sign={sign_id}'
res = requests.get(url, headers=headers)
soup = BeautifulSoup(res.text, 'html.parser')
try:
horoscope_text = soup.select('.main-horoscope p')[0].getText().strip().capitalize()
sign = soup.select('h1')[0].getText().strip().capitalize()
return f"{sign} Horoscope: {horoscope_text}"
except:
return "Could not fetch the horoscope."
def get_history_today():
"""Fetch and return historical events that happened on this day."""
url = 'https://www.onthisday.com/'
res = requests.get(url)
soup = BeautifulSoup(res.text, 'html.parser')
history_list = soup.select('.event')[:5] # 限制為5個事件
events = [event.getText().strip() for event in history_list]
history_text = "\n".join(events)
return history_text
def show_popup():
# 從每個函數(shù)獲取信息
news = get_trending_news()
horoscope = get_horoscope('aries') # 將'aries'替換為所需星座
history = get_history_today()
# 創(chuàng)建主Tkinter窗口
root = tk.Tk()
from datetime import datetime
# 獲取當前日期以顯示在GUI上
current_date = datetime.now()
formatted_date = current_date.strftime("%d %b %Y")
root.title(f"Daily Update: {formatted_date}")
root.geometry("500x600")
root.configure(bg="#f0f0f5") # 設(shè)置背景顏色
# 設(shè)置帶滾動條的畫布
canvas = tk.Canvas(root, bg="#f0f0f5")
scrollbar = ttk.Scrollbar(root, orient="vertical", command=canvas.yview)
scrollable_frame = tk.Frame(canvas, bg="#f0f0f5")
scrollable_frame.bind(
"<Configure>",
lambda e: canvas.configure(scrollregion=canvas.bbox("all")))
canvas.create_window((0, 0), window=scrollable_frame, anchor="nw")
canvas.configure(yscrollcommand=scrollbar.set)
# 定義畫布、滾動條和顏色
canvas.pack(side="left", fill="both", expand=True)
scrollbar.pack(side="right", fill="y")
header_font = ("Arial", 14, "bold")
text_font = ("Arial", 12)
colors_list = ["#E4E0E1","#FFDDC1", "#D4E157", "#81D4FA", "#FFAB91", "#A5D6A7", "#FFF59D", "#CE93D8", "#B39DDB", "#90CAF9", "#FFE082", "#FFCCBC", "#AED581", "#FFE0B2", "#80CBC4", "#F48FB1"]
section_bg = random.choice(colors_list)
# 創(chuàng)建一個部分的函數(shù)
def create_section(parent, title, content, color):
frame = tk.Frame(parent, bg=color, pady=10, padx=10)
frame.pack(fill="x", pady=5, padx=5)
title_label = tk.Label(frame, text=title, font=header_font, bg=color, fg="#333333")
title_label.pack(anchor="w", pady=(0, 5))
content_label = tk.Label(frame, text=content, justify="left", wraplength=450, bg=color, fg="#000000")
content_label.pack(anchor="w")
return frame
# 添加熱門新聞部分
create_section(scrollable_frame, "Trending News", news, section_bg)
# 添加星座運勢部分
create_section(scrollable_frame, "Horoscope", horoscope, section_bg)
# 添加歷史事件部分
create_section(scrollable_frame, "On This Day", history, section_bg)
# 在底部添加關(guān)閉按鈕
close_button = ttk.Button(scrollable_frame, text="Close", command=root.destroy)
close_button.pack(pady=20)
root.mainloop()
# 運行腳本并在啟動時顯示彈出窗口
if __name__ == "__main__":
show_popup()
3.潮流股票(TrendyStocks)
股市里,公眾關(guān)注度往往與股價波動息息相關(guān)。這個自動化腳本能追蹤股票的流行趨勢,幫你捕捉市場熱點,從而做出更精準的投資選擇。它能夠幫助你快速了解哪些股票正受到市場關(guān)注,哪些則不然,是投資研究的得力助手。
#!pip install pytrends
from pytrends.request import TrendReq
import matplotlib.pyplot as plt
# 函數(shù):獲取趨勢數(shù)據(jù)
def get_google_trends_data(keywords, timeframe='today 3-m', geo='US'):
pytrends = TrendReq(hl='en-US', tz=360)
# 構(gòu)建請求數(shù)據(jù)
pytrends.build_payload(keywords, cat=0, timeframe=timeframe, geo=geo, gprop='')
# 獲取隨時間變化的興趣度數(shù)據(jù)
interest_over_time_df = pytrends.interest_over_time()
return interest_over_time_df
# 示例關(guān)鍵詞,與你的文章相關(guān)
STOCKS = ["AMZN", "MSFT", "NVDA", "AAPL", "GOOG"]
# 獲取趨勢數(shù)據(jù)
trends_data = get_google_trends_data(STOCKS)
# 繪制數(shù)據(jù)圖表
plt.figure(figsize=(20, 12))
trends_data.plot(title='Google Trends for STOCKS')
plt.xlabel('Date')
plt.ylabel('Interest Over Time')
plt.show()
4.整潔化(Neatify)
你是否有面對雜亂無章的下載文件夾感到頭疼的時候?是否有急需文件卻找不到的時候?并且嘗試整理卻總是失敗。
這個自動化腳本幾分鐘內(nèi)幫你解決文件管理難題。只需指定路徑,就會自動:
- 分類整理:按文件擴展名自動分類存放。
- 去除重復(fù):通過哈希值檢測,刪除重復(fù)文件。
- 時間排序:根據(jù)文件日期自動歸檔,方便查找。
import os
import shutil
import hashlib
from datetime import datetime
def get_file_hash(file_path):
"""Calculate the SHA-256 hash of a file."""
with open(file_path, 'rb') as f:
return hashlib.sha256(f.read()).hexdigest()
def organize_by_date_and_extension(folder_path):
"""Organize files by date, then by extension, and handle duplicates."""
# 在根目錄創(chuàng)建“Duplicates”文件夾
duplicates_folder = os.path.join(folder_path, '_Duplicates')
os.makedirs(duplicates_folder, exist_ok=True)
# 字典,用于存儲文件哈希值以檢測重復(fù)文件
file_hashes = {}
# 遍歷目錄中的所有文件
all_files = [os.path.join(folder_path, f) for f in os.listdir(folder_path) if os.path.isfile(os.path.join(folder_path, f))]
for file_path in all_files:
# 獲取文件的修改日期
modification_time = os.path.getmtime(file_path)
modification_date = datetime.fromtimestamp(modification_time).strftime('%Y-%m-%d')
# 如不存在,則創(chuàng)建修改日期對應(yīng)的文件夾
date_folder = os.path.join(folder_path, modification_date)
os.makedirs(date_folder, exist_ok=True)
# 計算文件哈希值
file_hash = get_file_hash(file_path)
# 檢測重復(fù)文件
if file_hash in file_hashes:
# 文件是重復(fù)的,移動到“Duplicates”文件夾
shutil.move(file_path, os.path.join(duplicates_folder, os.path.basename(file_path)))
print(f"Moved duplicate file {os.path.basename(file_path)} to Duplicates folder.")
else:
# 存儲文件哈希值以避免將來的重復(fù)
file_hashes[file_hash] = file_path
# 將文件移動到日期文件夾
new_path = os.path.join(date_folder, os.path.basename(file_path))
shutil.move(file_path, new_path)
# 在日期文件夾內(nèi)按擴展名組織文件
_, extension = os.path.splitext(new_path)
extension = extension.lower()
extension_folder = os.path.join(date_folder, extension[1:]) # 從擴展名中去除點
os.makedirs(extension_folder, exist_ok=True)
# 將文件移動到其擴展名對應(yīng)的文件夾
shutil.move(new_path, os.path.join(extension_folder, os.path.basename(new_path)))
print(f"Moved {os.path.basename(new_path)} to {extension_folder}.")
print("Files organized by date, extension, and duplicates handled successfully!")
if __name__ == "__main__":
# 指定要組織整理的目錄
folder_path = input("Enter the path to the folder to organize: ")
organize_by_date_and_extension(folder_path)
5.時鐘工作(ClockWork)
時間追蹤是提升效率的關(guān)鍵,幫助我們發(fā)現(xiàn)工作模式、優(yōu)化流程并保持專注。但手動記錄易出錯、打斷工作。這個自動化腳本簡化了流程,自動追蹤任務(wù)時間,實時監(jiān)控并記錄日志,讓你專注于核心工作。
應(yīng)用場景:
- 時間追蹤器:提高工作效率。
- 模型訓練追蹤器:優(yōu)化研發(fā)流程。
import tkinter as tk
from tkinter import ttk, messagebox
import csv
import time
from datetime import datetime
class TaskTrackerApp:
def __init__(self, root):
self.root = root
self.root.title("ClockWork: Time Tracking Made Easy")
self.task_name_var = tk.StringVar()
self.probable_time_var = tk.IntVar()
self.start_time = None
# UI元素配置
self.setup_ui()
# 如果日志文件不存在,則創(chuàng)建
self.create_log_file()
def setup_ui(self):
style = ttk.Style()
style.configure("TLabel", font=("Helvetica", 12))
style.configure("TButton", font=("Helvetica", 12, 'bold'), padding=6)
# UI元素
ttk.Label(self.root, text="Task Name:", foreground="blue").grid(row=0, column=0, padx=10, pady=10)
ttk.Entry(self.root, textvariable=self.task_name_var, width=30).grid(row=0, column=1, padx=10, pady=10)
ttk.Label(self.root, text="Probable Time (minutes):", foreground="blue").grid(row=1, column=0, padx=10, pady=10)
ttk.Entry(self.root, textvariable=self.probable_time_var, width=30).grid(row=1, column=1, padx=10, pady=10)
ttk.Button(self.root, text="Start Task", command=self.start_task).grid(row=2, column=0, padx=10, pady=10)
self.stop_button = ttk.Button(self.root, text="Stop Task", command=self.stop_task, state=tk.DISABLED)
self.stop_button.grid(row=2, column=1, padx=10, pady=10)
ttk.Button(self.root, text="Reset", command=self.reset_task).grid(row=3, column=0, padx=10, pady=10)
ttk.Button(self.root, text="View Time Logs", command=self.view_time_logs).grid(row=3, column=1, padx=10, pady=10)
self.timer_label = ttk.Label(self.root, text="00:00:00", font=("Helvetica", 18, 'bold'), foreground="green")
self.timer_label.grid(row=4, column=0, columnspan=2, padx=10, pady=20)
def create_log_file(self):
with open("time_log.csv", "a", newline="") as file:
writer = csv.writer(file)
if file.tell() == 0:
writer.writerow(['Task Name', 'Probable Time (minutes)', 'Start Time', 'End Time', 'Time Spent (minutes)', 'Time Difference (minutes)'])
def start_task(self):
task_name = self.task_name_var.get()
if task_name:
self.start_time = time.time()
self.start_button.config(state=tk.DISABLED)
self.stop_button.config(state=tk.NORMAL)
self.update_timer()
def stop_task(self):
self.stop_button.config(state=tk.DISABLED)
self.start_button.config(state=tk.NORMAL)
time_spent = round((time.time() - self.start_time) / 60, 2)
self.log_time(time_spent)
def update_timer(self):
if self.start_time:
time_spent = time.time() - self.start_time
time_str = time.strftime('%H:%M:%S', time.gmtime(time_spent))
self.timer_label.config(text=time_str)
self.root.after(1000, self.update_timer)
def log_time(self, time_spent):
end_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
time_diff = round(time_spent - self.probable_time_var.get(), 2)
with open("time_log.csv", "a", newline="") as file:
writer = csv.writer(file)
writer.writerow([self.task_name_var.get(), self.probable_time_var.get(), self.start_time, end_time, time_spent, time_diff])
def reset_task(self):
self.task_name_var.set("")
self.probable_time_var.set("")
self.timer_label.config(text="00:00:00")
self.start_button.config(state=tk.NORMAL)
self.stop_button.config(state=tk.DISABLED)
def view_time_logs(self):
try:
with open("time_log.csv", "r") as file:
logs = list(csv.reader(file))
if len(logs) > 1:
log_window = tk.Toplevel(self.root)
log_window.title("Time Logs")
text_area = tk.Text(log_window, height=20, width=120)
text_area.pack(padx=10, pady=10)
for log in logs[1:]:
task_name, probable_time, start_time, end_time, time_spent, time_diff = log
color = "green" if float(time_diff) < 0 else "red"
text_area.insert(tk.END, f"Task: {task_name}, Probable: {probable_time} min, Time Spent: {time_spent} min, Diff: {time_diff} min\n", color)
text_area.config(state=tk.DISABLED)
text_area.tag_config("green", foreground="green")
text_area.tag_config("red", foreground="red")
else:
messagebox.showinfo("No Logs", "No task logs found.")
except Exception as e:
messagebox.showerror("Error", f"Could not read time logs: {e}")
if __name__ == "__main__":
root = tk.Tk()
app = TaskTrackerApp(root)
root.mainloop()
6.剪貼板翻譯(ClipTranslate)
你是否常因復(fù)制的文本太多而難以追蹤粘貼的內(nèi)容,甚至不小心丟失了重要信息?是否在遇到外語文本時,總是不得不頻繁求助于翻譯工具?
現(xiàn)在,有了這個自動化腳本,你就能輕松管理剪貼板。它不僅能監(jiān)控你復(fù)制的所有文本,還能自動將其翻譯成英文,讓工作更加高效。
import tkinter as tk
from tkinter import ttk
import pyperclip # 需要安裝Pyperclip
from deep_translator import GoogleTranslator
from langdetect import detect
def detect_and_translate(text):
try:
# 檢測文本語言
detected_language = detect(text)
print(f"Detected language: {detected_language}")
if detected_language != 'en':
translated_text = GoogleTranslator(source=detected_language, target='en').translate(text)
print(f"Translated text: {translated_text}")
return translated_text
else:
print("The text is already in English.")
return text
except Exception as e:
print(f"Error: {e}")
return text
## 更新GUI,顯示新復(fù)制的文本
def update_listbox():
new_item = pyperclip.paste()
new_item = detect_and_translate(new_item)
if new_item not in X:
X.append(new_item)
listbox.insert(tk.END, new_item)
listbox.insert(tk.END, "----------------------")
listbox.yview(tk.END)
root.after(1000, update_listbox)
## 檢查復(fù)制的內(nèi)容
def copy_to_clipboard(event):
selected_item = listbox.get(listbox.curselection())
if selected_item:
pyperclip.copy(selected_item)
X = []
root = tk.Tk()
root.title("Clipboard Manager")
root.geometry("500x500")
root.configure(bg="#f0f0f0")
frame = tk.Frame(root, bg="#f0f0f0")
frame.pack(padx=10, pady=10)
label = tk.Label(frame, text="Clipboard Contents:", bg="#f0f0f0")
label.grid(row=0, column=0)
scrollbar = tk.Scrollbar(root)
scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
listbox = tk.Listbox(root, width=150, height=150, yscrollcommand=scrollbar.set)
listbox.pack(pady=10)
scrollbar.config(command=listbox.yview)
update_listbox()
listbox.bind("<Double-Button-1>", copy_to_clipboard)
root.mainloop()
7.視頻轉(zhuǎn)GIF(Video2GIF)
對于內(nèi)容創(chuàng)作者來說,GIF在內(nèi)容表達上具有不可替代的作用。雖然視頻適合分享和展示,但在文章中嵌入GIF往往更為合適。這個自動化腳本能夠?qū)⒁曨l轉(zhuǎn)換成無水印的GIF,僅需幾行代碼即可完成。
from moviepy.editor import VideoFileClip
def convert_video_to_gif(video_path, gif_path, start_time=0, duration=None):
# 加載視頻剪輯
clip = VideoFileClip(video_path)
# 如果指定了時長,則裁剪GIF的視頻片段;否則使用整個視頻
if duration:
clip = clip.subclip(start_time, start_time + duration)
else:
clip = clip.subclip(start_time, clip.duration)
# 將裁剪的視頻片段寫為GIF
clip.write_gif(gif_path)
print(f"GIF saved to {gif_path}")
video_path = "Sample_Video.mp4" # 視頻文件路徑
gif_path = "output.gif" #GIF保存路徑
convert_video_to_gif(video_path, gif_path, start_time=0, duration=15)
8.字數(shù)統(tǒng)計(WordCounter)
這個自動化腳本能夠追蹤你每天寫了多少字,還能在達到寫作目標時給予鼓勵。
import pynput
from pynput.keyboard import Key, Listener
from win10toast import ToastNotifier
# 初始化ToastNotifier對象
toaster = ToastNotifier()
keys = []
word_count_session = 0
word_count = 1000 # 累計寫作字數(shù)
target_word_count = 1000 # 每日目標字數(shù)
def on_press(key):
global word_count_session, keys
if key == Key.space:
word_count_session += 1
elif key == Key.esc:
return False
keys.append(key)
write_file(keys)
if word_count_session >= 1000:
session_info()
def session_info():
global word_count, word_count_session
word_count += word_count_session
word_count_session = 0
if word_count > target_word_count:
# 提示消息
message = f"Congrats! You have achieved your {target_word_count} Words Daily Target"
toaster.show_toast("Counter ??", message, duration=10)
def write_file(keys):
with open('log.txt', 'w') as f:
for key in keys:
if key == Key.space:
f.write(' ')
else:
k = str(key).replace("'", "")
if k[0:3] == 'Key':
pass
else:
f.write(k)
with Listener(on_press=on_press) as listener:
listener.join()
9.假數(shù)據(jù)填充(FakeFill)
對于數(shù)據(jù)科學家來說,測試模型時需要生成逼真的假數(shù)據(jù)集;對于普通人來說,填寫表格時也需要隨機信息。
這個Python自動化腳本能夠滿足這些需求,快速創(chuàng)建看起來真實的假數(shù)據(jù),非常適合測試、開發(fā)和模擬用途。無論是姓名、電子郵件還是電話號碼,這個工具都能高效地產(chǎn)出樣本數(shù)據(jù)。
import streamlit as st
import pandas as pd
from mimesis import Person, Address
from mimesis.enums import Gender
from io import StringIO
# 可用數(shù)據(jù)生成器字典
generators = {
"Name": lambda: person.full_name(),
"Email": lambda: person.email(),
"Address": lambda: address.address(),
"Phone Number": lambda: person.telephone(),
"Job": lambda: person.occupation(),
}
# 生成數(shù)據(jù)的函數(shù)
def generate_data(columns, rows):
data = {col: [generators[col]() for _ in range(rows)] for col in columns}
return pd.DataFrame(data)
# Streamlit界面
st.title("Test Data Generator ??")
# 設(shè)置側(cè)邊欄
st.sidebar.header("Data Generation Settings")
selected_columns = st.sidebar.multiselect("Select Columns:", list(generators.keys()))
num_rows = st.sidebar.number_input("Number of Rows:", min_value=1, max_value=1000, value=10)
if st.sidebar.button("Generate Data"):
if selected_columns:
person = Person() # 初始化Mimesis人物提供者
address = Address() # 初始化Mimesis地址提供者
df = generate_data(selected_columns, num_rows)
st.write("### Generated Data")
st.dataframe(df)
# 將DataFrame轉(zhuǎn)換為CSV并創(chuàng)建下載鏈接
csv = df.to_csv(index=False)
st.download_button(label="Download CSV", data=csv, file_name="random_data.csv", mime="text/csv")
else:
st.warning("Please select at least one column.")
10.郵件頭偵探(HeaderSpy)
電子郵件頭承載著揭示郵件來源、傳輸路徑和內(nèi)容的重要元數(shù)據(jù)。雖然這些信息默認對收件人隱藏,但可以通過郵件客戶端或特定工具查看。每個郵件頭字段都有其特定功能,對電子郵件系統(tǒng)的順暢運作起著重要作用,它們幫助驗證郵件真實性,提供發(fā)送者信息透明度,并在防止垃圾郵件、驗證身份和解決投遞問題上發(fā)揮著重要作用。
這個自動化腳本能從郵件頭中提取關(guān)鍵信息,助你辨別郵件是否偽造、反彈或有潛在惡意。
import email
import quopri
from email import policy
from email.parser import BytesParser
def parse_email(file_path):
with open(file_path, 'rb') as file:
msg = BytesParser(policy=policy.default).parse(file)
print("From:", msg.get("From", "N/A"))
print("To:", msg.get("To", "N/A"))
print("Subject:", msg.get("Subject", "N/A"))
print("Date:", msg.get("Date", "N/A"))
print("Message ID:", msg.get("Message-ID", "N/A"))
print("X-Mailer:", msg.get("X-Mailer", "N/A"))
# 打印附加信息
print("\n--- Additional Information ---\n")
print("SPF:", msg.get("Received-SPF", "N/A"))
print("DKIM:", msg.get("DKIM-Signature", "N/A"))
print("DMARC:", msg.get("DMARC-Filter", "N/A"))
print("SENDERIP:", msg.get("X-Sender-IP", "N/A"))
print("RETURN PATH:", msg.get("Return-Path", "N/A"))
print("Reply-To:", msg.get("Reply-To", "N/A"))
print('Authentication Results:\n', msg.get('Authentication-Results','N/A'))
print('Message ID', msg.get('Message-Id','N/A'))
def main():
email_file_path = "/content/Sample.eml" ## 郵件文件路徑
parse_email(email_file_path)
if __name__ == "__main__":
main()