L'objectif principal est Travail quotidien de création de courrier, courrier régulier mensuel, etc. Je voulais rationaliser le travail de routine.
Le deuxième objectif est Gestion des fichiers json en Python Je voulais savoir comment fonctionne Outlook. (Franchement, si vous jouez juste avec Outlook Mettre des données sur Excel et les créer avec VBA Je pense que c'est le plus habillé)
・ Pensez aux éléments du fichier json -Créer une classe qui gère les fichiers json -Création d'une classe pour gérer Office Outlook -Développement de la méthode principale qui crée du courrier en liant les classes ci-dessus
・ Windows10 ・ Python 3.7.0 ・ Bureau2016 ・ Autres bibliothèques diverses décrites dans le code ci-dessous
Le diagramme de classes créé par pycharm ressemble à ceci.
Comme exigence, -Format (courrier texte, courrier HTML, texte enrichi) ・ Expéditeur ・ Destination (plusieurs peuvent être spécifiées) ・ CC (plusieurs spécifications autorisées) ・ BCC (plusieurs spécifications autorisées) ·matière ·Texte · Pièce jointe Je voulais quelque chose qui pourrait être réglé C'est devenu comme ça.
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 Merci pour votre travail acharné. C'est 〇〇.\n\Je vous enverrai n〇〇.\n\n ou plus.\n"
}
Choisissez mailFormat entre les nombres 1 et 3 Chacun semble correspondre à [courrier texte, courrier HTML ou texte enrichi].
JsonHandler.py
import json
class JsonHandler:
def __init__(self, jsonPath):
#Lire le fichier json
self.file = open(jsonPath, 'r', encoding="utf-8_sig")
self.jsonData = json.load(self.file)
#Obtenir les données JSON pour l'imbrication principale
def getParam_OneNest(self, args):
return self.jsonData[args]
def __del__(self):
#Fermer le fichier
self.file.close()
J'ai recherché une méthode d'encodage lors de l'importation d'un fichier, J'ai fait référence à cet article. Une histoire de difficulté à ouvrir un fichier autre que CP932 (Shift-JIS) encodé sous Windows --Qiita
Apparemment, il est nécessaire d'adopter une méthode appelée encoding = "utf-8_sig" pour le traitement de la nomenclature.
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):
# ///Paramètre d'information pour les éléments de courrier
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
#Ajouter une signature au corps (uniquement au démarrage d'Outlook)
try:
self.newMail.Body = argBody \
+ os.linesep \
+ self.newMail.GetInspector.WordEditor.Bookmarks('_MailAutoSig').Range.Text
except:
self.newMail.Body = argBody
#Obtenir le fichier joint
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
Je fais cette étrange façon.
self.newMail._oleobj_.Invoke(*(64209, 0, 8, 0, self.outlook.Session.Accounts(argSenderaddress)))
C'était une norme dans le cas de VBA Le champ «SentOnBehalfOfName» n'a pas pu être utilisé pour une raison quelconque (bien qu'il puisse s'agir d'un problème de configuration du côté des perspectives). Quand je l'ai recherché, j'ai trouvé un article comme celui-ci, alors je l'ai adopté. https://stackoverflow.com/questions/35908212/python-win32com-outlook-2013-sendusingaccount-return-exception
Cependant, cette méthode suppose que l'adresse définie dans json est enregistrée en tant qu'adresse de l'utilisateur dans Outlook. S'il n'est pas enregistré, une exception se produira, donc try catch est utilisé pour le traitement. Cela ne signifie pas que vous pouvez utiliser quelque chose qui n'est pas enregistré, tel que SentOnBehalfOfName. Par conséquent, il y a place à amélioration. (Si vous n'utilisez que l'adresse par défaut, il n'y a pas de problème)
self.newMail.Body = argBody \
+ os.linesep \
+ self.newMail.GetInspector.WordEditor.Bookmarks('_MailAutoSig').Range.Text #Signez le texte
Avec cette méthode utilisant le champ WordEditor.Bookmarks, Il y a un gros problème que "* La signature n'est donnée que lorsque l'application Outlook est démarrée". Si vous exécutez la méthode main alors qu'elle n'est pas en cours d'exécution, une exception se produira.
Par conséquent, cette fois, traitez-le avec try catch, S'il ne fonctionne pas, je renoncerai à signer.
C'est aussi une partie qui peut être améliorée, mais elle ne peut pas être aidée (car le processus de démarrage d'Outlook est assez ennuyeux).
OutloookMailCreater.py
import datetime
import sys
#Réinitialiser le chemin de recherche du module
#Rendre possible de démarrer en double-cliquant
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:
#préparation de la fenêtre de message
root = tkinter.Tk()
root.withdraw()
root.attributes("-topmost", True)
#commencer les perspectives
outlookHandler = OutlookHandler()
outlookHandler.create()
#objet de manipulation de fichier json
jsonHandler = JsonHandler(os.path.join(os.path.dirname(os.path.abspath(__file__)), 'mailSetting.json'))
#Obtenir la valeur de json et stocker dans la 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'))
#◆◆◆ Si vous souhaitez ajouter un traitement aux données de la liste, décrivez-le ici ◆◆◆
# myDate = datetime.date.today()
# if myDate.day < 16:
# myDate -= datetime.timedelta(days=15)
# settingList[5] = settingList[5].replace('$date', myDate.strftime('%Y%m'))
# ◆◆◆◆◆◆
#Créer un nouvel élément de courrier Outlook
outlookHandler.setting(*settingList)
#Afficher les éléments de courrier
outlookHandler.display()
outlookHandler.release()
#annonce
messagebox.showinfo("", "Réussite")
except:
print("Error", messagebox.showinfo("Error", "Erreur est survenue"))
traceback.print_exc()
finally:
pass
Il semble que vous devriez le définir comme suit.
root.attributes("-topmost", True)
Cliquez ici pour les outils et le code source ↓ CreateToolAndTest/Tool_Python/OutlookMailCreater at master · dede-20191130/CreateToolAndTest
Veuillez commenter si vous avez des suppléments.
Recommended Posts