Der Hauptzweck ist Tägliche Posterstellungsarbeiten, monatliche reguläre Post usw. Ich wollte die Routinearbeit rationalisieren.
Der zweite Zweck ist Umgang mit JSON-Dateien in Python Ich wollte lernen, wie Outlook funktioniert. (Ehrlich gesagt, wenn Sie sich nur mit Outlook anlegen Daten in Excel einfügen und mit VBA erstellen Ich denke, es ist das am besten gekleidete)
・ Denken Sie an Elemente in der JSON-Datei
・ Windows10 ・ Python 3.7.0 ・ Office2016 ・ Andere verschiedene Bibliotheken, die im folgenden Code beschrieben sind
Das von pycharm erstellte Klassendiagramm sieht folgendermaßen aus.
Als Voraussetzung, -Format (Textmail, HTML-Mail, Rich Text) ・ Absender ・ Ziel (mehrere können angegeben werden) ・ CC (mehrere Spezifikationen zulässig) ・ BCC (mehrere Spezifikationen zulässig) ·Gegenstand ·Text · Angehängte Datei Ich wollte etwas, das eingestellt werden konnte Es wurde so.
mailSetting.json
{
"mailFormat": 3,
"senderAddress": "[email protected]",
"receiverAddressSet": ["[email protected]","[email protected]","[email protected]"],
"CC_AddressSet": ["[email protected]","[email protected]"],
"BCC_AddressSet": ["[email protected]","[email protected]"],
"title":"AIUEO",
"attachedFileFolderPath": "C:\\Users\\UserName\\Test",
"body": "〇〇\n\n Vielen Dank für Ihre harte Arbeit. Es ist 〇〇.\n\Ich werde dir n〇〇 schicken.\n\n oder mehr.\n"
}
Wählen Sie mailFormat aus den Nummern 1 bis 3 Jedes scheint [Textmail, HTML Mail oder Rich Text] zu entsprechen.
JsonHandler.py
import json
class JsonHandler:
def __init__(self, jsonPath):
#Json-Datei lesen
self.file = open(jsonPath, 'r', encoding="utf-8_sig")
self.jsonData = json.load(self.file)
#Holen Sie sich JSON-Daten für das primäre Nest
def getParam_OneNest(self, args):
return self.jsonData[args]
def __del__(self):
#Datei schließen
self.file.close()
Ich habe beim Importieren einer Datei nach einer Codierungsmethode gesucht. Ich habe auf diesen Artikel verwiesen. Eine Geschichte darüber, wie es schwierig ist, eine andere Datei als CP932 (Shift-JIS) zu öffnen, die unter Windows - Qiita codiert ist
Anscheinend ist es notwendig, eine Methode namens encoding = "utf-8_sig" für die Stücklistenverarbeitung anzuwenden.
OutlookHandler.py
import glob
import os
import win32com.client
class OutlookHandler:
def __init__(self):
self.outlook = win32com.client.Dispatch("Outlook.Application")
self.newMail = None
def create(self):
self.newMail = self.outlook.CreateItem(0)
def setting(self, argMailformat, argSenderaddress,
argReceiveraddressset, argCc_Addressset,
argBcc_Addressset, argTitle,
argAttachedfilefolderpath, argBody):
# ///Informationseinstellung für Postsendungen
self.newMail.BodyFormat = argMailformat
try:
self.newMail._oleobj_.Invoke(*(64209, 0, 8, 0, self.outlook.Session.Accounts(argSenderaddress)))
except:
pass
self.newMail.To = argReceiveraddressset
self.newMail.cc = argCc_Addressset
self.newMail.Bcc = argBcc_Addressset
self.newMail.Subject = argTitle
#Signatur zum Text hinzufügen (nur wenn Outlook gestartet wird)
try:
self.newMail.Body = argBody \
+ os.linesep \
+ self.newMail.GetInspector.WordEditor.Bookmarks('_MailAutoSig').Range.Text
except:
self.newMail.Body = argBody
#Erhalten Sie angehängte Datei
if os.path.isdir(argAttachedfilefolderpath):
for file in glob.glob(argAttachedfilefolderpath + '\\*'):
if os.path.isfile(file):
self.newMail.Attachments.Add(file)
def display(self):
self.newMail.Display(False)
def release(self):
self.newMail = None
self.outlook = None
Ich mache diesen seltsamen Weg.
self.newMail._oleobj_.Invoke(*(64209, 0, 8, 0, self.outlook.Session.Accounts(argSenderaddress)))
Dies war bei VBA ein Standard Das Feld "SentOnBehalfOfName" konnte aus irgendeinem Grund nicht verwendet werden (obwohl es sich möglicherweise um ein Konfigurationsproblem auf der Outlook-Seite handelt). Als ich es nachgeschlagen habe, habe ich einen Artikel wie diesen gefunden und ihn übernommen. https://stackoverflow.com/questions/35908212/python-win32com-outlook-2013-sendusingaccount-return-exception
Bei dieser Methode wird jedoch davon ausgegangen, dass die in json festgelegte Adresse in Outlook als Benutzeradresse registriert ist. Wenn es nicht registriert ist, tritt eine Ausnahme auf. Versuchen Sie daher, catch für die Verarbeitung zu verwenden. Dies bedeutet nicht, dass Sie etwas verwenden können, das nicht registriert ist, z. B. SentOnBehalfOfName. Daher gibt es Raum für Verbesserungen. (Wenn Sie nur die Standardadresse verwenden, gibt es kein Problem)
self.newMail.Body = argBody \
+ os.linesep \
+ self.newMail.GetInspector.WordEditor.Bookmarks('_MailAutoSig').Range.Text #Unterschreiben Sie den Text
Bei dieser Methode wird das Feld WordEditor.Bookmarks verwendet. Es gibt ein großes Problem: "* Die Signatur wird nur beim Starten der Outlook-Anwendung vergeben." Wenn Sie die Hauptmethode ausführen, während sie nicht ausgeführt wird, tritt eine Ausnahme auf.
Verarbeiten Sie es daher dieses Mal mit try catch, Wenn es nicht läuft, gebe ich das Signieren auf.
Dies ist auch ein Teil, der verbessert werden kann, dem jedoch nicht geholfen werden kann (da der Startvorgang für Outlook ziemlich ärgerlich ist).
OutloookMailCreater.py
import datetime
import sys
#Modul-Suchpfad zurücksetzen
#Ermöglichen Sie einen Doppelklick
sys.path.append(r"C:\Users\UserName\PycharmProjects\CreateToolAndTest")
import os
import tkinter
from tkinter import messagebox
from PrivateTool.OutlookMailCreater.JsonHandler import JsonHandler
from PrivateTool.OutlookMailCreater.OutlookHandler import OutlookHandler
import traceback
if __name__ == '__main__':
try:
#Vorbereitung des Nachrichtenfensters
root = tkinter.Tk()
root.withdraw()
root.attributes("-topmost", True)
#Ausblick starten
outlookHandler = OutlookHandler()
outlookHandler.create()
#json file manipulation object
jsonHandler = JsonHandler(os.path.join(os.path.dirname(os.path.abspath(__file__)), 'mailSetting.json'))
#Holen Sie sich den Wert von json und speichern Sie ihn in der Liste
settingList = [jsonHandler.getParam_OneNest('mailFormat'), ]
settingList.append(jsonHandler.getParam_OneNest('senderAddress'))
tempSet = jsonHandler.getParam_OneNest('receiverAddressSet')
settingList.append('; '.join(tempSet))
tempSet = jsonHandler.getParam_OneNest('CC_AddressSet')
settingList.append('; '.join(tempSet))
tempSet = jsonHandler.getParam_OneNest('BCC_AddressSet')
settingList.append('; '.join(tempSet))
settingList.append(jsonHandler.getParam_OneNest('title'))
settingList.append(jsonHandler.getParam_OneNest('attachedFileFolderPath'))
settingList.append(jsonHandler.getParam_OneNest('body'))
#◆◆◆ Wenn Sie den Listendaten eine Verarbeitung hinzufügen möchten, beschreiben Sie diese hier. ◆◆◆
# myDate = datetime.date.today()
# if myDate.day < 16:
# myDate -= datetime.timedelta(days=15)
# settingList[5] = settingList[5].replace('$date', myDate.strftime('%Y%m'))
# ◆◆◆◆◆◆
#Erstellen Sie ein neues Outlook-Mailelement
outlookHandler.setting(*settingList)
#Mail-Elemente anzeigen
outlookHandler.display()
outlookHandler.release()
#Ankündigung
messagebox.showinfo("", "Erfolgreiche Fertigstellung")
except:
print("Error", messagebox.showinfo("Error", "Ein Fehler ist aufgetreten"))
traceback.print_exc()
finally:
pass
Es scheint, dass Sie es wie folgt einstellen sollten.
root.attributes("-topmost", True)
Klicken Sie hier für Tools und Quellcode ↓ CreateToolAndTest/Tool_Python/OutlookMailCreater at master · dede-20191130/CreateToolAndTest
Bitte kommentieren Sie, wenn Sie Ergänzungen haben.