[Python] Informationen zum Erstellen eines Tools zum Erstellen einer neuen Outlook-E-Mail basierend auf den Daten der JSON-Datei und dem Teil, der abgefangen wurde

1. Über diesen Artikel

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)

[* Tools und Quellcode werden auf Github veröffentlicht (später beschrieben)](am Ende von # 5)

2. Was Sie tun möchten

・ Denken Sie an Elemente in der JSON-Datei

3. Verwendete Tools / Umgebung

・ Windows10 ・ Python 3.7.0 ・ Office2016 ・ Andere verschiedene Bibliotheken, die im folgenden Code beschrieben sind

4. Code und Erklärung erstellt

Klassen Diagramm

Das von pycharm erstellte Klassendiagramm sieht folgendermaßen aus. OutlookMailCreater.png

Inhalt der JSON-Datei

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.

JSON-Handling-Klasse

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

Punkt ①: Informationen zur Codierung

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.

Outlook-Handling-Klasse

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


Punkt (2): Informationen zum Festlegen der E-Mail-Adresse des Absenders

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)

Punkt ③: So unterschreiben Sie den Text

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

Hauptmethode

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


Punkt ④: So bringen Sie das Nachrichtenfenster nach vorne

Es scheint, dass Sie es wie folgt einstellen sollten.

root.attributes("-topmost", True)

5. Am Ende

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.

Recommended Posts

[Python] Informationen zum Erstellen eines Tools zum Erstellen einer neuen Outlook-E-Mail basierend auf den Daten der JSON-Datei und dem Teil, der abgefangen wurde
[Python] Informationen zum Erstellen eines Tools zum Anzeigen aller Seiten der Website, die in der JSON-Datei registriert sind und auf denen sie abgefangen wurden
[Python] Erstellen eines Tools, mit dem Python-Dateien mit tkinter & über den Teil, der abgefangen wurde, aufgelistet, ausgewählt und ausgeführt werden können
[Python] Erstellen Sie ein Skript, das FeedParser und LINE Notify verwendet, um LINE über die neuesten Informationen zum neuen Koronavirus des Ministeriums für Gesundheit, Arbeit und Soziales zu informieren.
[Hinweis] Basierend auf dem Breiten- und Längengrad der CSV-Datei haben wir ein Skript erstellt, das Daten im Zielbereich extrahiert und einen Netzcode hinzufügt.
Eine Geschichte, die beim Versuch, die Python-Version mit GCE zu aktualisieren, hängen blieb
[Python] Ein Notizbuch, das die ipynb-Datei von GitHub ins Japanische übersetzt und herunterlädt.
Python-Skript, das eine JSON-Datei aus einer CSV-Datei erstellt
Sammeln Sie Tweets über "Corona" mit Python und erkennen Sie automatisch Wörter, die aufgrund des Einflusses von "Corona" zu einem heißen Thema geworden sind.
Python - Lesen Sie Daten aus einer numerischen Datendatei, um die verteilte, gemeinsam verteilte Matrix, Eigenwerte und Eigenvektoren zu finden
[Python] Erstellen eines GUI-Tools, das die CSV von Temperaturanstiegsdaten in Excel automatisch verarbeitet
[Python] Ein Programm, um die Anzahl der Äpfel und Orangen zu ermitteln, die geerntet werden können
Erstellen Sie eine neue CSV mit Pandas basierend auf der lokalen CSV
Erstellen Sie eine Python-Umgebung und übertragen Sie Daten auf den Server
Die Geschichte, ein Tool zu erstellen, das auf Mac und Windows auf der Spieleentwicklungsseite ausgeführt wird
[Python-Scraping] Geben Sie die URL und den Titel der Site mit einem bestimmten Schlüsselwort in eine Textdatei ein
Erstellen Sie ein Shell-Skript, um die Python-Datei mehrmals auszuführen
Über Boxplot und Violinplot, die die Variation unabhängiger Daten visualisieren
Python vba zum Erstellen einer Datumszeichenfolge zum Erstellen eines Dateinamens
Durchsuchen Sie das Verzeichnis und erstellen Sie eine Liste mit Verzeichnispfaden und Dateinamen
[Python] Ein Hinweis, dass ich das Verhalten von matplotlib.pyplot zu verstehen begann
[Python] Ein Programm, das den Inhalt der Liste nach links dreht
[Python / Jupyter] Übersetzen Sie den Kommentar des in die Zwischenablage kopierten Programms und fügen Sie ihn in eine neue Zelle ein.
So führen Sie den Übungscode des Buches "Profitable KI mit Python erstellen" in Google Colaboratory aus
Einführung von "Scikit-Mobility", einer Bibliothek, mit der Sie menschliche Flussdaten mit Python einfach analysieren können (Teil 1)
Ich habe versucht, die statistischen Daten der neuen Corona mit Python abzurufen und zu analysieren: Daten der Johns Hopkins University
Verwenden Sie AWS Lambda, um Nachrichten zu kratzen und LINE regelmäßig über Updates zu informieren [Python]
Erstellen Sie einen Bot, der die Anzahl der Personen, die für das neue Corona-Virus in Tokio positiv sind, an Slack sendet
Eine Geschichte über das Erstellen eines Programms, mit dem die Anzahl der Instagram-Follower in einer Woche von 0 auf 700 erhöht wird
Laden Sie Daten mit einem Befehl und einer Aktualisierung auf s3 von aws hoch und löschen Sie die verwendeten Daten (unterwegs).
[Python] Ein Programm, das die Anzahl der gepaarten Socken berechnet
[Python] Erstellen Sie einen Linebot, um den Namen und das Alter auf das Bild zu schreiben
So erstellen Sie einen Wrapper, der die Signatur der zu umschließenden Funktion beibehält
[Outlook] Ich habe versucht, mit Python automatisch eine tägliche Berichtsmail zu erstellen
Ich habe ein Programm erstellt, um die Größe einer Datei mit Python zu überprüfen
<Python> Ein Quiz zum Batch-Konvertieren von Dateinamen, die durch eine bestimmte Zeichenfolge als Teil des Dateinamens getrennt sind
Die Geschichte der Erstellung von Botonyan, das den Inhalt von Google Text & Tabellen als Antwort auf ein bestimmtes Keyword in Slack zurückgibt
(Tagebuch 1) Erstellen, Durchsuchen und Registrieren von Daten in der SQL-Datenbank des Microsoft Azure-Dienstes mit Python
GAE - Drehen Sie mit Python das Bild basierend auf den Rotationsinformationen von EXIF und laden Sie es in den Cloud-Speicher hoch.
Verschiedene Möglichkeiten, die letzte Zeile einer CSV-Datei in Python zu lesen
Ich habe versucht, eine Klasse zu erstellen, mit der Json in Python problemlos serialisiert werden kann
Über den Punkt, an dem Python 3.x aufgrund eines Fehlers aufgrund von caching_sha2_password hängen blieb
Python - Lesen Sie Daten aus einer numerischen Datendatei und suchen Sie die multiple Regressionslinie.
Python-Skript, das SQL-Dateien liest, BigQuery ausführt und CSV speichert
Verwenden Sie den Befehl [shell], um eine beliebige Datei zu komprimieren, um eine Datei zu erstellen und die Originaldatei zu löschen.
Erstellen Sie einen BOT, der die Anzahl der infizierten Personen in der neuen Corona anzeigt
Erstellen Sie eine Python-Umgebung, um die Theorie und Implementierung von Deep Learning zu erlernen
Ich möchte eine WEB-Anwendung mit den Daten von League of Legends ① erstellen
Ich habe ein Tool zum Generieren von Markdown aus der exportierten Scrapbox-JSON-Datei erstellt
[Python] Ein Programm, das die Anzahl der Aktualisierungen der höchsten und niedrigsten Datensätze berechnet
Von der Excel-Datei zur Exe und Freigabe des Tools, das CSV ausspuckt
Tool zum Einfügen des Ländernamens und des Ländercodes in einen Teil der IP-Adresse
[Einführung in Python] So erhalten Sie den Datenindex mit der for-Anweisung