Dies ist problematisch, da ständig E-Mails gesendet werden. Ich habe beschlossen, es zu automatisieren.
Für die Automatisierung haben wir uns entschieden, eine zu erstellen, die die folgenden Anforderungen erfüllt.
Daher scheint GAS (Google Apps Script) praktisch zu sein, und ich habe keine Erfahrung damit. Ich habe mich für ein Tool mit GAS entschieden, das die oben genannten Anforderungen erfüllt.
Zunächst überlegte ich, ob die oben genannten drei Anforderungen wirklich erfüllt wurden.
Soweit ich GAS tatsächlich ein wenig ausprobiert und untersucht habe, ist leider der GAS-Ausführungsauslöser Es schien nur folgendes zu geben.
① Aus der Tabelle ② Zeitgesteuert ③ Aus dem Kalender
Davon (1) Wenn Sie die Details der Triggereinstellungen in der Tabelle überprüfen
· Am Anfang ・ Beim Bearbeiten ・ Zum Zeitpunkt der Änderung ・ Beim Absenden eines Formulars
Ist es nicht möglich, "beim Start" als Auslöser zu verwenden? ich dachte Ausgelöst durch Öffnen einer Tabelle und Versuch, eine E-Mail zu senden Ich habe es mir ausgedacht.
Wenn Sie also eine Tabelle mit GAS in Pythons Selen öffnen, Ich beschloss, es als Auslöser zu verwenden.
... Ich denke, es könnte einen immer einfacheren Weg geben, Das Auslösen eines Tabellenkalkulationsstarts scheint nichts zu schaden. Es gibt auch den Zweck, ein unerfahrenes GAS zu verwenden, also habe ich mich dazu entschlossen.
Ich habe den für die Ausführung von Selenium erforderlichen Chrome-Treiber von der folgenden Seite heruntergeladen. https://sites.google.com/a/chromium.org/chromedriver/downloads
Es stellte sich als überraschend schwierig heraus, dies mit GAS zu tun.
Denn solange die Tabelle auf dem Server vorhanden ist, scheint das GAS-Skript auch auf der Serverseite ausgeführt zu werden, und es scheint schwierig zu sein, die Datei auf dem lokalen PC zu betreiben, der der Client ist.
Aus diesem Grund wusste ich beispielsweise, wie man eine lokale CSV- oder Textdatei liest und dann die in diesen Dateien beschriebenen Informationen extrahiert, aber ich wusste nicht, wie man die lokale Datei in diesem Dateiformat anfügt.
Auf der anderen Seite scheint es einfach zu sein, Dateien auf der Serverseite wie Google Drive anzuhängen.
Aus diesem Grund habe ich beschlossen, die lokale Datei, die ich an Google Drive anhängen möchte, hochzuladen und anzuhängen. Es ist etwas verwirrend, weil es einmal über Google Drive läuft. Wenn jedoch keine Betriebsprobleme vorliegen, ist dies in Ordnung.
Für das Hochladen auf Google Drive scheint Pythons PyDrive praktisch zu sein, daher habe ich mich dafür entschieden.
Ich dachte zuerst an GAS, aber wieder an Python. ..
Da GAS auf der Serverseite ausgeführt wird, ist es schwierig, sowohl die lokale Umgebung als auch die lokale Datei zu betreiben, und da Python an den obigen Anforderungen 1 und 2 beteiligt ist, dachte ich, dass Anforderung 3 auch in Python implementiert werden würde. Ich dachte leichtfertig, dass es nur ein Paket gibt, mit dem Wi-Fi problemlos verbunden / getrennt werden kann, aber leider konnte ich es nicht finden.
Ich habe jedoch festgestellt, dass PowserShell die Bedienung von Wi-Fi vereinfacht und dass PowerShell-Skripts auch von Python-Seite aus problemlos aufgerufen werden können. Daher habe ich beschlossen, Wi-Fi mit PowerShell auszuführen.
Ich stellte fest, dass die Anforderungen 1 bis 3 alle realisiert wurden, aber die Mittel zu ihrer Realisierung wurden etwas kompliziert, und so beschloss ich, sie einmal zu organisieren.
Die erste Hälfte bis zur Mitte des Prozesses ist wie bereits erwähnt, aber das Problem ist die zweite Hälfte. Wenn Sie GAS starten und eine E-Mail senden, senden Sie die Bestätigung an einen lokal ausgeführten Python und rufen Sie zu diesem Zeitpunkt ein PowerShell-Skript auf, um Wi-Fi zu trennen, es offline zu schalten und den Vorgang abzuschließen. Wie üblich ist es jedoch schwierig, sich mit der lokalen Umgebung zu verbinden, weshalb wir uns entschlossen haben, uns weiter unten damit zu befassen.
Mit den oben genannten Maßnahmen kann der Benutzer den Erfolg / Misserfolg des Versendens einer E-Mail feststellen.
In diesem Fall frage ich mich, ob es in Ordnung ist, Python für alles zu verwenden. In diesem Fall wird jedoch unter anderem versucht, "ein GAS zu verwenden, das ich noch nie verwendet habe", damit es mit GAS realisiert werden kann. Ich werde für den Teil mit GAS gehen.
Ich vermisse die Tatsache, dass die Tabelle, die als Auslöser zum Starten von GAS geöffnet wird, wirklich keine andere Rolle als nur einen Auslöser hat, und ich entschied, dass es nicht gut ist, die Zieladresse fest zu codieren, wenn die Anzahl der E-Mail-Ziele in Zukunft zunimmt. Ich habe beschlossen, die Lieferadressen in der Tabelle aufzulisten.
Schreiben Sie, wie in der Abbildung gezeigt, in der Reihenfolge von Zelle A1 nach unten.
Platzieren Sie das erstellte Python-Skript und das PowerShell-Skript an der entsprechenden Stelle, schreiben Sie GAS wie oben beschrieben, setzen Sie den Auslöser, aktivieren Sie die GoogleDrive-API, legen Sie die Verknüpfung .py auf dem Desktop ab und klicken Sie darauf, um automatisch E-Mails zu senden Du kannst senden. Als Referenz sind die Implementierungsergebnisse wie folgt.
auto_mail_tool.py
import os
import time
import email
import imaplib
import datetime
import chromedriver_binary
from selenium import webdriver
from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive
from selenium.webdriver.chrome.options import Options
#Legen Sie die Adresse und das Passwort des Google-Kontos fest
address = 'Mail Adresse'
pw = 'Passwort'
#Öffnen Sie die Tabelle, starten Sie Gas und senden Sie eine E-Mail
def generate_gas_script():
print('Eine E-Mail senden ...')
#Kopfloser Start des Browsers(Hintergrundanzeige)Einstellungen für
option = Options() #Optionen verfügbar
option.add_argument('--headless') #Geben Sie die Einstellung für den Headless-Modus an
option.add_argument('--lang=ja-JP')
#Öffnen Sie den Browser, um zu arbeiten
drv = webdriver.Chrome(options=option)
time.sleep(3)
#Öffnen Sie die Seite, um zu arbeiten
drv.get("URL der Tabelle, die Sie öffnen möchten")
#Geben Sie die Adresse in die Adressleiste ein
drv.find_element_by_id('Email').send_keys(address)
time.sleep(3)
#Klicken Sie auf die Schaltfläche "Weiter"
drv.find_element_by_id('next').click()
time.sleep(3)
#Passwort eingeben
drv.find_element_by_id('password').send_keys(pw)
time.sleep(3)
#Klicken Sie auf die Schaltfläche "Weiter"
drv.find_element_by_id('submit').click()
time.sleep(5)
drv.quit() #Die Tabelle sollte geöffnet sein, schließen Sie also den Browser
#Stellen Sie eine Verbindung zu WLAN her/Trennen
def wifi(mode):
if mode == 'connect': #Stellen Sie eine Verbindung zum WLAN der angegebenen SSID her (die SSID selbst ist in PowerShell festgelegt).
os.system('powershell -Command' + ' ' + \
'powershell -ExecutionPolicy RemoteSigned .\\wifi_on.ps1')
time.sleep(5)
elif mode == 'disconnect': #Trennen Sie das angeschlossene WLAN
os.system('powershell -Command' + ' ' + \
'powershell -ExecutionPolicy RemoteSigned .\\wifi_off.ps1')
#Laden Sie die Datei, die Sie an die ausgehende E-Mail anhängen möchten, auf Google Drive hoch
def up_file_on_drive():
#Legen Sie den Pfad und den Dateinamen fest, in dem sich die hochzuladende Datei befindet
tgtfolder = 'Der Pfad, an den sich die Datei anhängen lässt, die Sie anhängen möchten'
tgtfile = 'Der Name der Datei, die Sie anhängen möchten'
dlttgt = 'title = ' + '"' + tgtfile + '"' #Wird verwendet, um die Datei-ID abzurufen
#Authentifizierungsprozess für die Verwendung der Google Drive-API
gauth = GoogleAuth()
drive = GoogleDrive(gauth)
#Wenn eine gleichnamige Datei bereits gespeichert ist, löschen Sie sie
file_id = drive.ListFile({'q': dlttgt}).GetList()[0]['id']
f = drive.CreateFile({'id': file_id})
f.Delete()
time.sleep(3)
#Datei hochladen
folder_id = 'Google Drive-Dateispeicher-ID'
f = drive.CreateFile({'title': tgtfile,
'mimeType': 'excel/xlsx',
'parents': [{'kind': 'drive#fileLink', 'id':folder_id}]})
f.SetContentFile(tgtfolder + tgtfile)
f.Upload()
time.sleep(3)
#Überprüfen Sie, ob die E-Mail gesendet wurde
def confirm_mail_sent():
tgtac = imaplib.IMAP4_SSL('imap.gmail.com', 993) #IMAP-Hostname (Posteingangsserver) und E-Mail-Empfangsportnummer über SSL
tgtac.login(address, pw)
waitsec = 30 #Zeitüberschreitungszeit der Bestätigungslogik für die E-Mail-Übertragung[sec]
tgtmail = 'Senden Sie den auf der GAS-Seite eingestellten "Betreff"' + get_today()
#Überprüfen Sie jede Sekunde anhand der neuesten E-Mail, ob die automatisch gesendete E-Mail empfangen wird
for i in range(waitsec, 0, -1):
title = get_latest_mail_title(tgtac) #Holen Sie sich den Betreff der neuesten E-Mail
time.sleep(1) #1 Schleife 1 Sekunde
if title == tgtmail: #Wenn der Betreff der letzten E-Mail der einer automatisch gesendeten E-Mail ist
print('\n Die automatische E-Mail-Übertragung ist abgeschlossen.\n')
return
#Wenn die Bestätigungszeit abgelaufen ist
print('\n Fehler beim automatischen Senden von E-Mails.\n')
#Holen Sie sich den Betreff der neuesten E-Mail
def get_latest_mail_title(mail):
mail.select('inbox') #Mailboxauswahl
data = mail.search(None, 'ALL')[1] #Holen Sie sich alle Daten in Ihre Mailbox
tgt = data[0].split()[-1] #Holen Sie sich den neuesten Versandhandel
x = mail.fetch(tgt, 'RFC822')[1] #E-Mail-Informationen abrufen (geben Sie einen Standard an, der von Google Mail gelesen werden kann)
ms = email.message_from_string(x[0][1].decode('iso-2022-jp')) #Perspektive und bekommen
sb = email.header.decode_header(ms.get('Subject'))
ms_code = sb[0][1] #Zeichencode-Erfassung
#Erhalten Sie nur den Betreff der neuesten E-Mail
if ms_code != None:
mtitle = sb[0][0].decode(ms_code)
else:
mtitle = sb[0][0]
return mtitle
#Holen Sie sich das heutige Datum
def get_today():
now = datetime.date.today()
tdy = str(now.year) + '/' + str(now.month) + '/' + str(now.day) #Anzeige nach Datum
wknum = now.weekday() #Holen Sie sich die heutige Tagesnummer (0:Mond... 6:Tag)
wk = get_now_weekday(wknum) #Holen Sie sich den heutigen Tag
return tdy + '(' + wk + ')'
#Holen Sie sich den heutigen Tag
def get_now_weekday(key):
wkdict = {0: 'Mond', 1: 'Feuer', 2: 'Wasser', 3: 'Holz', 4: 'Geld', 5: 'Boden', 6: 'Tag'}
return(wkdict[key])
if __name__ == '__main__':
wifi('connect') # 1.Wi der angegebenen SSID-Fi verbinden
up_file_on_drive() # 2.Laden Sie die Datei hoch, die Sie an Google Drive anhängen möchten
generate_gas_script() # 3.Öffnen Sie die Tabelle und starten Sie GAS
confirm_mail_sent() # 4.Überprüfen Sie, ob die von GAS gesendete E-Mail eingetroffen ist
wifi('disconnect') # 5.Trennen Sie das WLAN
os.system('PAUSE') #Stoppen Sie die Konsole
sending_email.gs
function mail_send() {
//E-Mail-Informationen festlegen
var recip = get_recipient(); //Erhalten Sie die E-Mail-Adresse des Empfängers (in der Tabelle aufgeführt)
var subject = 'E-Mail Betreff:' + get_nowdate();
var yourname = 'An euch alle';
var myname = '○○ Gebühr';
var body = yourname + '\n\n' + myname + 'ist.\n\n' + 'Ich werde Ihnen heute ○○ senden.\n\Danke für n oder mehr.'
var filename = 'Der Name der Datei, die Sie anhängen möchten';
var foldername = 'test'
var tgtfile = DriveApp.getFilesByName(filename).next();
const options = {name: '○○ Gebühr', attachments:[tgtfile]};
//E-Mail senden
GmailApp.sendEmail(recip, subject, body, options);
}
//Rufen Sie die Ziel-E-Mail-Adresse in der Tabelle ab
function get_recipient(){
//Legen Sie das Zielblatt für die Tabelle fest
var spdsht = SpreadsheetApp.getActiveSpreadsheet();
var sheet = spdsht.getActiveSheet();
//Holen Sie sich die Adresse in der ersten Zeile aufgeführt
var tgtcell = sheet.getRange('A1');
var rcps = tgtcell.getValue();
var tgtval = rcps;
//Rufen Sie die in der zweiten und den folgenden Zeilen beschriebene Adresse ab
for (let i = 2; tgtval != ''; i++)
{
tgtcell = sheet.getRange('A' + i);
tgtval = tgtcell.getValue();
rcps = rcps + ', ' + tgtval;
}
return rcps;
// console.log(rcps) //debuggen
}
//Holen Sie sich das heutige Datum (einschließlich Tag)
function get_nowdate()
{
var da = new Date();
//Holen Sie sich das heutige Datum
var y = da.getFullYear();
var m = da.getMonth() + 1; //Der Mond-Um mit einem Wert von 1 zu bekommen
var d = da.getDate();
//Holen Sie sich den heutigen Tag
var downum = da.getDay(); //Holen Sie sich die Tagesnummer
var downow = ['Tag', 'Mond', 'Feuer', 'Wasser', 'Holz', 'Geld', 'Boden'][downum]; // 曜Tag番号に対応する曜Tagを選択
return y + '/' + m + '/' + d + '(' + downow + ')';
}
3-1. Beim Anschließen
wifi_on.ps1
netsh wlan connect name="Wi-Fi, das Sie verbinden möchten-Fi SSID"
3-2. Beim Trennen
wifi_off.ps1
netsh wlan disconnect
Schreiben Sie mit der Systemfunktion Folgendes in .m.
system('Willst du rennen.py Pfad')
-Das Öffnen des Browsers zum Öffnen der Tabelle mit Selen erfolgt kopflos. Aus irgendeinem Grund wurde beim Starten ohne Kopf ein anderer Bildschirm angezeigt als ohne, und ich litt ein wenig. (Die Tatsache, dass der Bildschirm anders ist, wurde durch Screenshot mit save_screenshot entdeckt.) Das Obige ist schließlich das Ergebnis der Aufteilung auf verschiedene Bildschirme.
Referenz: https://teratail.com/questions/276976
・ Ich frage mich, ob GAS keine Funktion hat, die dem interaktiven Modus von Python entspricht. .. Ich denke, es wäre sehr praktisch, wenn es einen gäbe.
Insbesondere war ich den folgenden Seiten verpflichtet. Vielen Dank.
Inhalt | Linkziel |
---|---|
Mail per GAS senden | https://tonari-it.com/gas-gmail-sendemail/ |
Einstellung des GAS-Ausführungsauslösers | https://takakisan.com/gas-trigger-introduction/ |
Holen Sie sich Datum und Tag mit GAS | http://www.googleappsscript.info/2017-07-27/get_now.html |
Greifen Sie mit GAS auf Tabellenkalkulationen zu | https://qiita.com/negito6/items/c64a7a8589faaffcfdcf |
Hängen Sie eine Datei an, wenn Sie eine E-Mail mit GAS senden | https://qiita.com/tanaike/items/94c263d3906ee23ad522 https://news.mynavi.jp/article/gas-11/ |
GAS+Laden Sie Dateien mit HTML auf Google Drive hoch | https://officeforest.org/wp/2018/12/30/google-apps-script%E3%81%A7%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%A2%E3%83%83%E3%83%97%E3%83%AD%E3%83%BC%E3%83%80%E3%82%92%E4%BD%9C%E3%82%8B/ https://tonari-it.com/gas-web-app-google-script-run/ https://www.pre-practice.net/2018/01/google-drive.html |
Laden Sie Dateien mit PyDrive auf Google Drive hoch | https://note.nkmk.me/python-pydrive-download-upload-delete/ https://qiita.com/akabei/items/f25e4f79dd7c2f754f0e |
PowerShell-Skript von Python (.ps1) aufrufen | https://tkstock.site/2019/10/07/python-powershell-shellscript-activate/ |
Verbinden / Trennen mit WLAN über PowerShell | https://qiita.com/mindwood/items/22e0895473578c4e0c7e http://wgg.hatenablog.jp/entry/20161111/1478846489 |
Löschen Sie Dateien auf Google Drive | https://note.nkmk.me/python-pydrive-download-upload-delete/ |
Erhalten Sie mit imaplib Informationen zu eingehenden E-Mails in Google Mail | https://py.minitukuc.com/2017/11/07/gmailhonbun/ |
Stammfenster ausblenden, wenn Sie das Tkinter-Dialogfeld verwenden | https://stackoverflow.com/questions/1406145/how-do-i-get-rid-of-python-tkinter-root-window |
Wie man Selen kopflos startet | https://watlab-blog.com/2019/08/18/selenium-chrome-background/ https://qiita.com/memakura/items/20a02161fa7e18d8a693 |
Screenshot zum Debuggen von Selenium Headless Boot | https://qiita.com/orangain/items/6a166a65f5546df72a9d |
Fehlerbehandlung beim Starten von Selen ohne Kopf | https://qiita.com/yukanashi/items/c7e954130029fe708b79 |
Wir freuen uns über Ihre Vorschläge, Verbesserungsvorschläge und Fehlervorschläge. Bitte zögern Sie nicht. Ich freue mich sehr, die Lotterie 100.000 Yen zu gewinnen.