[Python] À propos de la création d'un outil pour créer un nouveau courrier Outlook basé sur les données du fichier JSON et de la partie qui a été interceptée

1. À propos de cet article

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é)

[* Les outils et le code source sont publiés sur Github (décrit plus loin)](à la fin de # 5)

2. Ce que vous voulez faire

・ 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

3. Outils / environnement utilisés

・ Windows10 ・ Python 3.7.0 ・ Bureau2016 ・ Autres bibliothèques diverses décrites dans le code ci-dessous

4. Code créé et explication

Diagramme de classe

Le diagramme de classes créé par pycharm ressemble à ceci. OutlookMailCreater.png

Contenu du fichier json

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].

classe de gestion json

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()

Point (1): encodage

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.

classe de gestion Outlook

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


Point (2): À propos de la définition de l'adresse e-mail de l'expéditeur

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)

Point ③: Comment mettre une signature sur le texte

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).

méthode principale

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


Point ④: Comment amener la fenêtre de message au premier plan

Il semble que vous devriez le définir comme suit.

root.attributes("-topmost", True)

5. À la fin

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

[Python] À propos de la création d'un outil pour créer un nouveau courrier Outlook basé sur les données du fichier JSON et de la partie qui a été interceptée
[Python] À propos de la création d'un outil pour afficher toutes les pages du site Web enregistrées dans le fichier JSON et où il a été pris
[Python] Création d'un outil qui peut lister, sélectionner et exécuter des fichiers python avec tkinter et à propos de la partie qui a été interceptée
[Python] Créez un script qui utilise FeedParser et LINE Notify pour informer LINE des dernières informations sur le nouveau virus corona du ministère de la Santé, du Travail et des Affaires sociales.
[Note] Sur la base de la latitude et de la longitude du fichier CSV, nous avons créé un script qui extrait les données dans la plage cible et ajoute un code de maillage.
Une histoire bloquée lors de la tentative de mise à niveau de la version Python avec GCE
[Python] Un bloc-notes qui traduit et télécharge le fichier ipynb de GitHub en japonais.
Script Python qui crée un fichier JSON à partir d'un fichier CSV
Recueillez des tweets sur "Corona" avec python et détectez automatiquement les mots qui sont devenus un sujet brûlant en raison de l'influence de "Corona"
Python --Lisez des données à partir d'un fichier de données numériques pour trouver des matrices, des valeurs propres et des vecteurs propres distribués co-distribués
[Python] Création d'un outil GUI qui traite automatiquement le CSV des données d'élévation de température dans Excel
[Python] Un programme pour trouver le nombre de pommes et d'oranges qui peuvent être récoltées
Créer un nouveau csv avec des pandas basé sur le csv local
Créer un environnement Python et transférer des données vers le serveur
L'histoire de la création d'un outil qui fonctionne sur Mac et Windows sur le site de développement de jeux
[Python scraping] Affiche l'URL et le titre du site contenant un mot-clé spécifique dans un fichier texte
Créez un script shell pour exécuter le fichier python plusieurs fois
À propos de Boxplot et Violinplot qui visualisent la variation des données indépendantes
Python vba pour créer une chaîne de date pour créer un nom de fichier
Creusez le répertoire et créez une liste de chemins de répertoire + noms de fichiers
[python] Une note que j'ai commencé à comprendre le comportement de matplotlib.pyplot
[Python] Un programme qui fait pivoter le contenu de la liste vers la gauche
[Python / Jupyter] Traduisez le commentaire du programme copié dans le presse-papiers et insérez-le dans une nouvelle cellule.
Comment exécuter le code pratique du livre "Making Profitable AI with Python" sur Google Colaboratory
Introduction de "scikit-mobility", une bibliothèque qui vous permet d'analyser facilement les données de flux humain avec Python (Partie 1)
J'ai essayé d'obtenir et d'analyser les données statistiques de la nouvelle Corona avec Python: données de l'Université John's Hopkins
Utilisez AWS lambda pour récupérer les actualités et notifier régulièrement LINE des mises à jour [python]
Créez un bot qui publie sur Slack le nombre de personnes positives pour le nouveau virus corona à Tokyo
Une histoire sur la création d'un programme qui augmentera le nombre d'abonnés Instagram de 0 à 700 en une semaine
Mettez à jour les données en les téléchargeant sur s3 d'aws avec une commande, et supprimez les données utilisées (en chemin)
[Python] Un programme qui calcule le nombre de chaussettes jumelées
[Python] Créez un linebot pour écrire le nom et l'âge sur l'image
Comment créer un wrapper qui préserve la signature de la fonction à envelopper
[Outlook] J'ai essayé de créer automatiquement un e-mail de rapport quotidien avec Python
J'ai fait un programme pour vérifier la taille d'un fichier avec Python
<Python> Un quiz pour convertir par lots les noms de fichiers séparés par une chaîne de caractères spécifique dans le cadre du nom de fichier
L'histoire de la création de Botonyan qui renvoie le contenu de Google Docs en réponse à un mot-clé spécifique sur Slack
(Journal 1) Comment créer, parcourir et enregistrer des données dans la base de données SQL du service Microsoft Azure avec python
GAE --Avec Python, faites pivoter l'image en fonction des informations de rotation d'EXIF et importez-la dans Cloud Storage.
Différentes façons de lire la dernière ligne d'un fichier csv en Python
J'ai essayé de créer une classe qui peut facilement sérialiser Json en Python
À propos du point où python 3.x est resté bloqué en raison d'une erreur due à caching_sha2_password
Python --Lisez les données d'un fichier de données numériques et recherchez la ligne de régression multiple.
Script Python qui lit les fichiers SQL, exécute BigQuery et enregistre le csv
Utilisez la commande [shell] pour compresser par zip n'importe quel fichier pour créer un fichier et supprimer le fichier d'origine.
Créez un BOT qui affiche le nombre de personnes infectées dans le nouveau Corona
Créez un environnement python pour apprendre la théorie et la mise en œuvre de l'apprentissage profond
Je souhaite créer une application WEB en utilisant les données de League of Legends ①
J'ai créé un outil pour générer du Markdown à partir du fichier JSON Scrapbox exporté
[Python] Un programme qui calcule le nombre de mises à jour des enregistrements les plus élevés et les plus faibles
Du fichier Excel à l'exe et sortie de l'outil qui crache le CSV
Outil pour insérer le nom du pays et le code du pays dans une partie de l'adresse IP
[Introduction à Python] Comment obtenir l'index des données avec l'instruction for