-
Notifications
You must be signed in to change notification settings - Fork 0
/
SendEmail.py
136 lines (103 loc) · 4.43 KB
/
SendEmail.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
import stat
import shutil
import os
import smtplib
from zipfile import ZipFile, ZIP_DEFLATED
from pathlib import Path
from datetime import date, timedelta
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication
from email.mime.text import MIMEText
# import config
'''
SendEmail performs the clean up and update by removing images
and relaying the images through email
'''
# checks if a folder exists, if not it makes one
def check_folder_exists(out_folder):
if not os.path.exists(out_folder):
os.makedirs(out_folder)
# https://stackoverflow.com/questions/26124281/convert-a-str-to-path-type
# turns folders into a zip file
def zip_dir(dir, zip_path, zip_filname):
"""Zip the provided directory without navigating to that directory using `pathlib` module"""
filename = os.path.join(zip_path, zip_filname)
# Convert to Path object
dir = Path(dir)
# creating zip file
with ZipFile(filename, "w", ZIP_DEFLATED) as zip_file:
for entry in dir.rglob("*"):
zip_file.write(entry, entry.relative_to(dir))
# https://stackoverflow.com/questions/1889597/deleting-read-only-directory-in-python
# to bypass [WinErorr 5] Access denied when trying to delete a folder
def remove_readonly(func, path, excinfo):
os.chmod(path, stat.S_IWRITE)
func(path)
def remove_folder_contents(content_folder):
def delete_file(file_path):
# check if its a file
if os.path.isfile(file_path) or os.path.islink(file_path):
os.unlink(file_path)
# check if its a folder
elif os.path.isdir(file_path):
shutil.rmtree(file_path, onerror=remove_readonly)
# https://stackoverflow.com/questions/29206384/python-folder-names-in-the-directory
folders = [os.path.join(content_folder, directory) for directory in os.listdir(
content_folder) if os.path.isdir(content_folder)]
for folder in folders:
# listdir(folder) of zip isnt a directory so it produces err
try:
for filename in os.listdir(folder):
file_path = os.path.join(folder, filename)
# if os.path.isfile is a directory, OSError occurs
try:
delete_file(file_path)
except OSError as e:
print('Failed to delete %s. Reason: %s' % (file_path, e))
except NotADirectoryError as e:
# if there are no directory inside data or zip, just delete whatever is inside
delete_file(folder)
print(f'{os.path.split(folder)[1]} content deleted.')
# https://docs.python.org/3/library/email.examples.html
# https://djangocentral.com/sending-email-with-zip-files-using-python/
def send_email(zip_folder, zip_filename, EMAIL_ADDRESS, EMAIL_PASSWORD, CC_EMAIL_ADDRESS):
msg = MIMEMultipart()
body = MIMEText('Weekly Update', 'plain')
msg['Subject'] = 'TrashTaste Twitter Bot'
msg['From'] = EMAIL_ADDRESS
msg['To'] = EMAIL_ADDRESS
msg['Cc'] = CC_EMAIL_ADDRESS
# Add body to email
msg.attach(body)
# open and read the zip file in binary
with open(os.path.join(zip_folder, zip_filename), 'rb') as file:
# Attach the file with filename to the email
msg.attach(MIMEApplication(file.read(), Name=zip_filename))
with smtplib.SMTP_SSL('smtp.gmail.com', 465) as smtp:
# SMTP_SSL identifies ourselves with the gmail server and encrypt traffic
# login to email server
smtp.login(EMAIL_ADDRESS, EMAIL_PASSWORD)
smtp.send_message(msg)
print('Email sent.')
# test function to send email on windows
def send_email_test():
# EMAIL_ADDRESS = config.EMAIL_ADDRESS
# https://support.google.com/accounts/answer/185833?hl=en
# cant just use real password, have to use gmail app passwords
# EMAIL_PASSWORD = config.GMAIL_APP_PASS
# CC_EMAIL_ADDRESS = config.CC_EMAIL_ADDRESS
# directory variables
cwd = os.getcwd()
data_folder = os.path.join(cwd, 'data')
zip_folder = os.path.join(cwd, 'zip')
# compress data dir as zip file
today = date.today()
last_week = date.today() - timedelta(days=7)
zip_filename = f'TT-Data-{last_week}-{today}.zip'
zip_dir(data_folder, zip_folder, zip_filename)
# remove_folder_contents(data_folder)
# send_email(zip_folder, zip_filename, EMAIL_ADDRESS,
# EMAIL_PASSWORD, CC_EMAIL_ADDRESS)
# remove_folder_contents(zip_folder)
if __name__ == '__main__':
send_email_test()