J'ai fait une application d'envoi de courrier simple avec tkinter de Python

introduction

Dans cet article, nous développerons une application utilisant Python. La bibliothèque standard tkinter est utilisée comme bibliothèque GUI. La bibliothèque standard smtplib est utilisée pour l'envoi de courrier. Si vous comprenez dans une certaine mesure python en lisant cet article, vous pourrez apprendre à utiliser tkinter et smtplib dans une certaine mesure.

Qu'est-ce que tkinter

C'est l'une des bibliothèques Python standard. Une bibliothèque pour créer des applications GUI. Une bibliothèque GUI avec une grammaire simple et un démarrage rapide.

Créer une fenêtre

Commençons par créer une fenêtre qui devient.

import tkinter as tk

if __name__ == "__main__":
    root = tk.Tk()
    root.mainloop()

01_ウィンドウ.png

Créer un écran

Nous allons créer une classe qui hérite de la classe Frame afin d'écrire avec l'orientation objet à l'esprit. Créez les éléments nécessaires (widgets) dans create_widgets (), organisez-les et créez l'écran.

import tkinter as tk

class Application(tk.Frame):
    def __init__(self, master):
        super().__init__(master)
        self.pack()

        #Définir la taille et le titre de l'écran
        master.geometry("300x200")
        master.title("Application d'envoi de courrier simple")

        self.create_widgets()

    #Méthode pour générer un widget
    def create_widgets(self):
        self.label = tk.Label(self,text="Application d'envoi de courrier simple")
        self.label.grid(row=0, column=0, columnspan=3)

        self.to_label = tk.Label(self, text="destination:")
        self.to_entry = tk.Entry(self, width=20)
        self.to_label.grid(row=1, column=0)
        self.to_entry.grid(row=1, column=1, columnspan=2)

        self.subject_label = tk.Label(self, text="matière:")
        self.subject_entry = tk.Entry(self, width=20)
        self.subject_label.grid(row=2, column=0)
        self.subject_entry.grid(row=2, column=1, columnspan=2)

        self.body_label = tk.Label(self, text="Texte:")
        self.body_text = tk.Entry(self, width=20)
        self.body_label.grid(row=3, column=0)
        self.body_text.grid(row=3, column=1, columnspan=2)

        self.button = tk.Button(self, text="Envoyer")
        self.button.grid(row=4, column=2, sticky=tk.E, pady=10)

if __name__ == "__main__":
    root = tk.Tk()
    Application(master=root)
    root.mainloop()

02_画面レイアウト完成.png

Paramètres de traitement des événements

Définissez le traitement des événements pour le bouton d'envoi. Le traitement des événements est le traitement (méthode) qui est appelé lorsque le bouton est enfoncé. Définissez le traitement des événements à l'aide d'une expression lambda dans la commande d'argument lorsque le bouton est généré. Définissez le processus pour envoyer la valeur d'entrée à la sortie standard (console) pour le moment.

    #Méthode pour générer un widget
    def create_widgets(self):
    
	#~ Omis ~
    
        self.button = tk.Button(self, text="Envoyer", command=lambda:self.click_event())
        self.button.grid(row=4, column=2, sticky=tk.E, pady=10)

    def click_event(self):
        to = self.to_entry.get()
        subject = self.subject_entry.get()
        body = self.body_text.get()

        print(f"destination:{to}")
        print(f"matière:{subject}")
        print(f"Texte:{body}")

03_イベント処理.png

Résultat d'affichage de la console

destination:[email protected]
matière:À propos de la réunion de l'autre jour
Texte:Merci pour la rencontre de l'autre jour.

Se préparer à envoyer un e-mail

Un peu de préparation est nécessaire avant de créer le processus d'envoi de courrier. Cette fois, je vais le créer en supposant qu'il sera envoyé depuis le compte Gmail. Tout d'abord, si vous n'avez pas de compte Gmail, veuillez en créer un à partir du lien ci-dessous. Si vous en avez déjà un, nous vous recommandons d'obtenir un sous-compte pour le développement. (Comme vous pouvez le voir ci-dessous, vous devez réduire un peu les paramètres de sécurité de votre compte.) https://accounts.google.com/SignUp

Si vous avez déjà un compte ou si vous avez fini d'en créer un nouveau, vous devrez apporter quelques modifications aux paramètres de votre compte pour envoyer des e-mails à partir de programmes Python. Suivez les étapes ci-dessous pour afficher «Écran de configuration du compte». 04_アカウント設定.png

Sélectionnez ensuite Sécurité dans le menu de gauche. 05_セキュリティメニュー.png

Faites défiler l'écran jusqu'en bas et réglez «Accès aux applications non sécurisées» sur «Activé». 06_安全性の低いアプリ.png

Vous êtes maintenant prêt à vous connecter à Gmail depuis votre programme Python et à envoyer votre e-mail.

Processus d'envoi d'e-mails

Je ferai partie du traitement de la transmission du courrier. Tout d'abord, importez la bibliothèque requise pour l'envoi de courrier.

from smtplib import SMTP
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart

Ensuite, nous allons créer une méthode d'envoi de courrier. La partie qui change dynamiquement chaque fois que vous envoyez un e-mail est reçue en tant qu'argument de méthode. Les valeurs qui ne changent pas à chaque fois qu'un e-mail est envoyé sont définies comme des constantes dans la méthode. L'ID et le PASS seront l'adresse e-mail et le mot de passe Gmail de l'expéditeur. Veuillez régler cela en fonction de votre propre environnement.

    #Processus d'envoi d'e-mails
    def send_mail(self, to, subject, body):
        #Définir les informations nécessaires à la transmission avec une constante
        ID = "mail_address"
        PASS = "password"
        HOST = "smtp.gmail.com"
        PORT = 587

        #Définir le corps de l'e-mail
        msg = MIMEMultipart()
        msg.attach(MIMEText(body, "html"))

        #Définir le sujet, l'adresse source, l'adresse de destination
        msg["Subject"] = subject
        msg["From"] = ID
        msg["To"] = to

        #Connectez-vous au serveur SMTP et démarrez la communication TLS
        server=SMTP(HOST, PORT)
        server.starttls()

        server.login(ID, PASS) #Processus d'authentification de connexion

        server.send_message(msg)    #Processus d'envoi d'e-mails

        server.quit()       #Fin de la communication TLS

Traitement des événements de liaison

Enfin, si vous modifiez la partie de traitement des événements pour appeler la méthode que vous avez créée précédemment, l'application d'envoi de courrier simple est terminée.

    def click_event(self):
        to = self.to_entry.get()
        subject = self.subject_entry.get()
        body = self.body_text.get()

        # print(f"destination:{to}")
        # print(f"matière:{subject}")
        # print(f"Texte:{body}")
    
        self.send_mail(to=to, subject=subject, body=body)

Code source terminé

Le code source complété est le suivant.

import tkinter as tk
from smtplib import SMTP
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart

class Application(tk.Frame):
    def __init__(self, master):
        super().__init__(master)
        self.pack()

        #Définir la taille et le titre de l'écran
        master.geometry("300x200")
        master.title("Application d'envoi de courrier simple")

        self.create_widgets()

    #Méthode pour générer un widget
    def create_widgets(self):
        self.label = tk.Label(self,text="Application d'envoi de courrier simple")
        self.label.grid(row=0, column=0, columnspan=3)

        self.to_label = tk.Label(self, text="destination:")
        self.to_entry = tk.Entry(self, width=20)
        self.to_label.grid(row=1, column=0)
        self.to_entry.grid(row=1, column=1, columnspan=2)

        self.subject_label = tk.Label(self, text="matière:")
        self.subject_entry = tk.Entry(self, width=20)
        self.subject_label.grid(row=2, column=0)
        self.subject_entry.grid(row=2, column=1, columnspan=2)

        self.body_label = tk.Label(self, text="Texte:")
        self.body_text = tk.Entry(self, width=20)
        self.body_label.grid(row=3, column=0)
        self.body_text.grid(row=3, column=1, columnspan=2)

        self.button = tk.Button(self, text="Envoyer", command=lambda:self.click_event())
        self.button.grid(row=4, column=2, sticky=tk.E, pady=10)

    def click_event(self):
        to = self.to_entry.get()
        subject = self.subject_entry.get()
        body = self.body_text.get()
    
        self.send_mail(to=to, subject=subject, body=body)

    #Processus d'envoi d'e-mails
    def send_mail(self, to, subject, body):
        #Définir les informations nécessaires à la transmission avec une constante
        ID = "mail_address"
        PASS = "password"
        HOST = "smtp.gmail.com"
        PORT = 587

        #Définir le corps de l'e-mail
        msg = MIMEMultipart()
        msg.attach(MIMEText(body, "html"))

        #Définir le sujet, l'adresse source, l'adresse de destination
        msg["Subject"] = subject
        msg["From"] = ID
        msg["To"] = to

        #Connectez-vous au serveur SMTP et démarrez la communication TLS
        server=SMTP(HOST, PORT)
        server.starttls()   #Communication TLS démarrée

        server.login(ID, PASS) #Processus d'authentification de connexion

        server.send_message(msg)    #Processus d'envoi d'e-mails

        server.quit()       #Fin de la communication TLS

if __name__ == "__main__":
    root = tk.Tk()
    Application(master=root)
    root.mainloop()

finalement

Si vous souhaitez créer une application d'envoi d'e-mails après avoir tout essayé, restaurons les paramètres de sécurité de votre compte Google.

Recommended Posts

J'ai fait une application d'envoi de courrier simple avec tkinter de Python
J'ai essayé de créer une application de notification de publication à 2 canaux avec Python
J'ai essayé de créer une application todo en utilisant une bouteille avec python
J'ai fait un chronomètre en utilisant tkinter avec python
J'ai essayé de créer une interface graphique à trois yeux côte à côte avec Python et Tkinter
[Python] J'ai essayé de créer automatiquement un rapport quotidien de YWT avec la messagerie Outlook
[5e] J'ai essayé de créer un certain outil de type Authenticator avec python
Rubyist a essayé de créer une API simple avec Python + bouteille + MySQL
[2nd] J'ai essayé de créer un certain outil de type Authenticator avec python
J'ai essayé de créer une expression régulière de "montant" en utilisant Python
J'ai essayé de créer une expression régulière de "temps" en utilisant Python
[3ème] J'ai essayé de créer un certain outil de type Authenticator avec python
J'ai essayé de créer une liste de nombres premiers avec python
J'ai essayé de créer une expression régulière de "date" en utilisant Python
J'ai essayé de faire un processus d'exécution périodique avec Selenium et Python
[4th] J'ai essayé de créer un certain outil de type Authenticator avec python
[1er] J'ai essayé de créer un certain outil de type Authenticator avec python
J'ai essayé de créer un mécanisme de contrôle exclusif avec Go
[Python] J'ai essayé de faire une application qui calcule le salaire en fonction des heures de travail avec tkinter
Je veux faire un jeu avec Python
J'ai essayé de faire un signal avec Raspeye 4 (édition Python)
J'ai essayé de créer une application OCR avec PySimpleGUI
J'ai essayé de faire un processus périodique avec CentOS7, Selenium, Python et Chrome
[Analyse des brevets] J'ai essayé de créer une carte des brevets avec Python sans dépenser d'argent
J'ai essayé de créer une API de reconnaissance d'image simple avec Fast API et Tensorflow
J'ai essayé de trouver l'entropie de l'image avec python
J'ai fait un jeu de frappe simple avec tkinter de Python
J'ai essayé de créer diverses "données factices" avec Python faker
J'ai essayé différentes méthodes pour envoyer du courrier japonais avec Python
J'ai créé une application de livre simple avec python + Flask ~ Introduction ~
J'ai essayé d'implémenter la fonction d'envoi de courrier en Python
J'ai essayé de simuler la probabilité d'un jeu de bingo avec Python
J'ai créé un éditeur de texte simple en utilisant PyQt
J'ai essayé de faire quelque chose comme un chatbot avec le modèle Seq2Seq de TensorFlow
J'ai essayé de faire une simulation de séparation de source sonore en temps réel avec l'apprentissage automatique Python
[Mac] Je souhaite créer un serveur HTTP simple qui exécute CGI avec Python
J'ai créé une fonction pour récupérer les données de la colonne de base de données par colonne en utilisant sql avec sqlite3 de python [sqlite3, sql, pandas]
[1 hour challenge] J'ai essayé de créer un site de bonne aventure qui soit trop adapté à Python
[Python] J'ai essayé d'implémenter un tri stable, alors notez
[Python] Un mémo que j'ai essayé de démarrer avec asyncio
J'ai essayé de corriger "J'ai essayé la simulation probabiliste du jeu de bingo avec Python"
J'ai essayé un langage fonctionnel avec Python
J'ai essayé de créer un générateur qui génère une classe conteneur C # à partir de CSV avec Python
[Introduction] Je veux créer un robot Mastodon avec Python! 【Débutants】
[Python] Japonais simple ⇒ J'ai essayé de créer un outil de traduction en anglais
J'ai créé une API Web
J'ai écrit un doctest dans "J'ai essayé de simuler la probabilité d'un jeu de bingo avec Python"
J'ai essayé d'améliorer l'efficacité du travail quotidien avec Python
J'ai essayé de faire une étrange citation pour Jojo avec LSTM
J'ai essayé de collecter automatiquement des images de Kanna Hashimoto avec Python! !!
J'ai fait un simple blackjack avec Python
J'ai essayé de créer une fonction de similitude d'image avec Python + OpenCV
[Python] J'ai essayé de créer un programme simple qui fonctionne sur la ligne de commande en utilisant argparse