J'ai essayé de rendre possible l'envoi automatique d'un e-mail en double-cliquant simplement sur l'icône [Python]

Synopsis

J'ai décidé de l'automatiser car il est difficile d'envoyer des courriels régulièrement.

Pour l'automatisation, nous avons décidé d'en créer un qui répond aux exigences suivantes.

    1. Je souhaite joindre automatiquement un fichier spécifique
  1. Je souhaite importer des fichiers joints aux e-mails sur Google Drive en même temps
    1. Je souhaite me connecter uniquement lors de l'envoi d'un e-mail et me déconnecter immédiatement après l'envoi

J'ai donc décidé de créer un outil en Python qui répond aux exigences ci-dessus.

Tout d'abord, j'ai examiné si les trois exigences ci-dessus étaient réellement réalisées.

Condition 1: je souhaite joindre automatiquement un fichier spécifique

J'ai découvert qu'imaplib, un package pour l'envoi d'e-mails avec Python, peut également joindre des fichiers, j'ai donc décidé de l'utiliser.

Condition 2: je souhaite télécharger des fichiers joints à des e-mails sur Google Drive en même temps

Après avoir également étudié cela, j'ai trouvé qu'il existe un package appelé PyDrive qui gère Google Drive à partir de Python, j'ai donc décidé de l'utiliser. Python est trop pratique. ..

Condition 3: Je souhaite me connecter uniquement lors de l'envoi d'un e-mail et me déconnecter immédiatement après l'envoi

J'ai pensé à la légère que Python serait un package qui pourrait facilement connecter / déconnecter le Wi-Fi, mais malheureusement je ne l'ai pas trouvé.

Cependant, j'ai trouvé que PowserShell facilite l'utilisation du Wi-Fi et que les scripts PowerShell peuvent également être facilement appelés du côté Python, j'ai donc décidé d'effectuer une opération Wi-Fi avec PowerShell.

Résultats de la mise en œuvre

Placez le script Python et le script PowerShell créés à l'endroit approprié, placez le raccourci .py sur le bureau et appuyez dessus pour exécuter l'envoi automatique de courrier. Pour référence, les résultats de la mise en œuvre sont les suivants.

キャプチャ.JPG

La source

    1. Python: partie principale

auto_mail_tool.py


import os
import time
import email
import imaplib
import smtplib
import datetime
from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive
from os.path import basename
from email.header import Header
from email.utils import formatdate
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication


#Connectez-vous au wifi/Déconnecter
def wifi(mode):

    if mode == 'connect':  #Connectez-vous au wifi du SSID spécifié (le SSID lui-même est défini dans PowerShell)
        os.system('powershell -Command' + ' ' + \
                  'powershell -ExecutionPolicy RemoteSigned .\\wifi_on.ps1')

        time.sleep(5)

    elif mode == 'disconnect':  #Se déconnecter du wifi connecté

        os.system('powershell -Command' + ' ' + \
                  'powershell -ExecutionPolicy RemoteSigned .\\wifi_off.ps1')


#Téléchargez le fichier que vous souhaitez joindre au courrier sortant sur Google Drive
def up_file_on_drive():

    print('Je télécharge un fichier sur Google Drive.')

    #Définissez le chemin et le nom du fichier où se trouve le fichier à télécharger
    tgtfolder = 'Chemin du fichier (sans le nom du fichier)'
    tgtfile = 'Le nom du fichier que vous souhaitez télécharger'
    dlttgt = 'title = ' + '"' + tgtfile + '"'  #Utilisé pour obtenir l'ID de fichier

    #Processus d'authentification pour l'utilisation de l'API Google Drive
    gauth = GoogleAuth()
    drive = GoogleDrive(gauth)

    #Si un fichier du même nom est déjà stocké, supprimez-le
    file_id = drive.ListFile({'q': dlttgt}).GetList()[0]['id']
    f = drive.CreateFile({'id': file_id})
    f.Delete()

    time.sleep(3)

    #Téléverser un fichier
    folder_id = '1kCwhAtoPIi2TAUK0wiAr9ecYifyve7TW'
    f = drive.CreateFile({'title': tgtfile,
                         'mimeType': 'excel/xlsx',
                         'parents': [{'kind': 'drive#fileLink', 'id': folder_id}]})
    f.SetContentFile(tgtfolder + tgtfile)
    f.Upload()

    print('Le téléchargement du fichier est terminé.')


#Envoyer un e-mail avec des pièces jointes
def send_mail_with_file():

    st = get_mail_settings()  #Obtenez le contenu du courrier envoyé

    #Définir le contenu de l'e-mail à envoyer
    msg = MIMEMultipart()
    msg["Subject"] = st['subject']
    msg["To"] = st['to_addr']
    msg["From"] = u'%s<%s>' % (str(Header(st['send_name'].encode(st['charset']), st['charset'])), st['from_addr'])
    msg['Bcc'] = st['bcc_addr']
    msg['Date'] = formatdate()
    msg.attach(MIMEText(st['body']))

    #Pièce jointe
    with open(st['file'], "rb") as f:
        part = MIMEApplication(f.read(), Name=basename(st['file']))
    part['attached_file'] = 'attachment; filename="%s"' % basename(st['file'])
    msg.attach(part)

    #Envoyer un e-mail
    smtpobj = smtplib.SMTP_SSL('smtp.gmail.com', 465, timeout=10)  #Spécifiez le numéro de port du serveur SMTP de Gmail
    smtpobj.login(st['from_addr'], st['mypass'])
    smtpobj.send_message(msg=msg)
    smtpobj.close()


#Obtenir les paramètres de messagerie
def get_mail_settings():
    info = {
        'charset': 'iso-2022-jp',
        'send_name': u'Nom de l'expéditeur',
        'from_addr': 'L'adresse de l'expéditeur',
        'mypass': 'Mot de passe du compte Gmail',
        'bcc_addr': 'Destination 1,Destination 2',
        'to_addr': 'Destination 1,Destination 2',
        'subject': 'Sujet du courriel' + get_today(),
        'body': 'le contenu de l'e-mail',
        'file': 'Chemin du fichier que vous souhaitez joindre+nom de fichier'
    }
    return info


#Vérifiez si l'e-mail a été envoyé
def confirm_mail_sent():

    print('J'envoie un email.')

    st = get_mail_settings()  #Obtenez le contenu du courrier envoyé

    tgtac = imaplib.IMAP4_SSL('imap.gmail.com', 993)  #gmail Nom d'hôte du serveur de courrier entrant (IMAP) et numéro de port de réception du courrier utilisant SSL
    tgtac.login(st['from_addr'], st['mypass'])

    waitsec = 10  #Délai d'expiration de la logique de confirmation de la transmission du courrier[sec]

    #Vérifiez à partir du dernier courrier toutes les secondes pour voir si le courrier envoyé automatiquement est reçu
    for i in range(waitsec, 0, -1):

        lamtitle = get_latest_mail_title(tgtac)  #Obtenez l'objet du dernier e-mail

        time.sleep(1)  #1 boucle 1 seconde

        if lamtitle == st['subject']:  #Si l'objet du dernier e-mail est celui d'un e-mail envoyé automatiquement
            print('\n La transmission automatique du courrier est terminée.\n')
            return

    #Si le délai de confirmation expire
    print('\n Échec de l'envoi automatique du courrier.\n')


#Obtenez l'objet du dernier e-mail
def get_latest_mail_title(mail):
    mail.select('inbox')  #Sélection de la boîte aux lettres
    data = mail.search(None, 'ALL')[1]  #Récupérez toutes les données de votre boîte mail
    tgt = data[0].split()[-1]  #Recevez la dernière commande par correspondance
    x = mail.fetch(tgt, 'RFC822')[1]  #Obtenir des informations par e-mail (spécifier une norme pouvant être lue par Gmail)
    ms = email.message_from_string(x[0][1].decode('iso-2022-jp'))  #Perspective et obtenir

    sb = email.header.decode_header(ms.get('Subject'))
    ms_code = sb[0][1]  #Acquisition de code de caractère

    #Obtenez uniquement l'objet du dernier e-mail
    if ms_code != None:
        mtitle = sb[0][0].decode(ms_code)
    else:
        mtitle = sb[0][0]

    return mtitle


#Obtenez la date du jour
def get_today():
    now = datetime.date.today()
    tdy = str(now.year) + '/' + str(now.month) + '/' + str(now.day)  #Affichage par date
    wknum = now.weekday()  #Obtenez le numéro du jour du jour (0:Mois... 6:Journée)
    wk = get_now_weekday(wknum)  #Obtenez le jour d'aujourd'hui

    return tdy + '(' + wk + ')'


#Obtenez le jour d'aujourd'hui
def get_now_weekday(key):
    wkdict = {0: 'Mois', 1: 'Feu', 2: 'eau', 3: 'bois', 4: 'Argent', 5: 'sol', 6: 'journée'}
    return (wkdict[key])


if __name__ == '__main__':

    wifi('connect')        # 1.Connectez le wifi avec le SSID spécifié
    up_file_on_drive()     # 2.Téléchargez le fichier que vous souhaitez joindre à Google Drive
    send_mail_with_file()  # 3.Envoyer un e-mail avec un fichier en pièce jointe
    confirm_mail_sent()    # 4.Vérifiez si l'e-mail envoyé par GAS est bien arrivé
    wifi('disconnect')     # 5.Connectez le wifi avec le SSID spécifié

    os.system('PAUSE')     #Arrêtez la console

  1. PowerShell: pour la connexion / déconnexion Wi-Fi

2-1. Lors de la connexion

wifi_on.ps1


netsh wlan connect name="Wi-fi que vous souhaitez connecter-SSID Fi"

2-2. Lors de la déconnexion

wifi_off.ps1


netsh wlan disconnect

Remarques: si vous souhaitez appeler .py depuis MATLAB

Écrivez ce qui suit en .m à l'aide de la fonction système.

system('Envie de courir.chemin py')

Informations qui ont servi de référence

En particulier, j'étais redevable aux sites suivants. Merci beaucoup.

Contenu Lier la destination
Télécharger des fichiers sur Google Drive avec PyDrive https://note.nkmk.me/python-pydrive-download-upload-delete/ https://qiita.com/akabei/items/f25e4f79dd7c2f754f0e
Script PowerShell de Python (.ps1) appel https://tkstock.site/2019/10/07/python-powershell-shellscript-activate/
Connexion / déconnexion au wifi par PowerShell https://qiita.com/mindwood/items/22e0895473578c4e0c7e http://wgg.hatenablog.jp/entry/20161111/1478846489
Supprimer des fichiers sur Google Drive https://note.nkmk.me/python-pydrive-download-upload-delete/
Obtenez des informations sur les e-mails entrants Gmail avec imaplib https://py.minitukuc.com/2017/11/07/gmailhonbun/
Masquer la fenêtre racine lors de l'utilisation de la boîte de dialogue Tkinter https://stackoverflow.com/questions/1406145/how-do-i-get-rid-of-python-tkinter-root-window
Envoyer Gmail avec Python https://qiita.com/nakasuke_/items/607cf74d8841f76e59c6
Joindre un fichier lors de l'envoi de Gmail avec Python https://time-space.kddi.com/ict-keywords/kaisetsu/20170824/2081
Définissez le nom de l'expéditeur lors de l'envoi de Gmail en Python https://teratail.com/questions/128993

dernier

Nous apprécions vos suggestions, suggestions d'amélioration et suggestions d'erreurs. Je suis content si tu peux le faire.

Recommended Posts

J'ai essayé de rendre possible l'envoi automatique d'un e-mail en double-cliquant simplement sur l'icône [Python]
J'ai essayé de rendre possible l'envoi automatique d'un e-mail en double-cliquant simplement sur l'icône [GAS / Python]
Exportez le rapport au format PDF à partir de DB avec Python et attachez-le automatiquement à un e-mail et envoyez-le
Pour envoyer automatiquement des e-mails avec des pièces jointes à l'aide de l'API Gmail en Python
J'ai essayé d'envoyer automatiquement la littérature du nouveau virus corona à LINE avec Python
[Python] Japonais simple ⇒ J'ai essayé de créer un outil de traduction en anglais
J'ai essayé de créer une fonction de similitude d'image avec Python + OpenCV
[Python] J'ai essayé de résumer le type collectif (ensemble) d'une manière facile à comprendre.
Lorsque j'ai essayé d'exécuter Python, j'ai été ignoré dans le Microsoft Store
J'ai essayé de vérifier et d'analyser l'accélération de Python par Cython
[Outlook] J'ai essayé de créer automatiquement un e-mail de rapport quotidien avec Python
[Zaif] J'ai essayé de faciliter le commerce de devises virtuelles avec Python
J'ai essayé d'analyser la carte du Nouvel An par moi-même en utilisant python
J'ai essayé de créer un système pour acquérir automatiquement le guide des programmes → l'enregistrer dans le calendrier en un jour
J'ai essayé d'obtenir une image en grattant
Envoyez un email à l'adresse de Spushi avec python
J'ai essayé d'utiliser le module Datetime de Python
J'ai essayé d'envoyer un email avec SendGrid + Python
J'ai essayé de récupérer les données de l'ordinateur portable en le démarrant sur Ubuntu
J'ai fait de mon mieux pour créer une fonction d'optimisation, mais cela n'a pas fonctionné.
J'ai essayé de représenter graphiquement les packages installés en Python
[Introduction] J'ai essayé de l'implémenter moi-même tout en expliquant l'arbre de dichotomie
J'ai essayé de créer un générateur de dialogue de personnage automatique par chaîne Markov N étage
J'ai essayé de faire sonner le téléphone lorsqu'il a été publié sur le poste IoT
J'ai essayé de toucher un fichier CSV avec Python
Un débutant en python a tenté de faire un stage dans une entreprise informatique [Jour 3 vers les nuages ...]
J'ai essayé de résoudre Soma Cube avec python
Suite ・ J'ai essayé de créer Slackbot après avoir étudié Python3
J'ai essayé d'implémenter le perceptron artificiel avec python
[Python] J'ai essayé de représenter graphiquement le top 10 des ombres à paupières
Les débutants en Python ont créé un chat BOT alors j'ai essayé de résumer comment le faire
J'ai essayé de résoudre le problème avec Python Vol.1
Je souhaite envoyer automatiquement un e-mail de création d'entreprise
[Introduction] J'ai essayé de l'implémenter moi-même tout en expliquant pour comprendre la dichotomie
J'ai essayé de créer une application OCR avec PySimpleGUI
J'ai essayé de faciliter la modification du paramètre du proxy authentifié sur Jupyter
J'ai essayé de résumer les opérations de chaîne de Python
[Python] J'ai essayé de faire une application qui calcule le salaire en fonction des heures de travail avec tkinter
J'ai essayé de créer une API RESTful en connectant l'API rapide du framework Python explosif à MySQL.
J'ai essayé de faire de la vidéo de diffusion Masami comme IPPON Grand Prix (OpenCV: version Python)
J'ai essayé de trouver l'entropie de l'image avec python
J'ai essayé de simuler la propagation de l'infection avec Python
J'ai essayé différentes méthodes pour envoyer du courrier japonais avec Python
J'ai essayé d'envoyer un e-mail d'Amazon SES avec Python
Code pour envoyer du courrier basé sur la liste de diffusion Excel
[Python] J'ai essayé de visualiser la relation de suivi de Twitter
J'ai essayé d'implémenter la fonction d'envoi de courrier en Python
J'ai essayé d'énumérer les différences entre java et 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
J'ai essayé de changer le script python de 2.7.11 à 3.6.0 sur Windows10
Un débutant en python a essayé de faire un stage dans une entreprise informatique
J'ai essayé de créer un site qui permet de voir facilement les informations mises à jour d'Azure