-
Notifications
You must be signed in to change notification settings - Fork 1
/
mailbot.py
120 lines (105 loc) · 2.98 KB
/
mailbot.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
import ssl
import smtplib
from email.mime.application import MIMEApplication
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.utils import COMMASPACE, formatdate
from email.mime.base import MIMEBase
import argparse
import keyring
import getpass
class MailBot(object):
def __init__(self, recipient, sender):
self.recipient = recipient
self.sender = sender
def send(self, msg):
port = 465
smtp_server = "smtp.gmail.com"
context = ssl.create_default_context()
pw = self.fetchSenderPassword()
if (pw == None):
print('Failed to fetch password - are you sure it exists?')
return
try:
with smtplib.SMTP_SSL(smtp_server, port, context=context) as server:
server.login(self.sender, pw)
server.sendmail(self.sender, self.recipient, msg.as_string())
except smtplib.SMTPException as e:
print(str(e))
except Exception as e:
print(e)
def fetchSenderPassword(self):
try:
pw = keyring.get_password('MailBot', self.sender)
return pw
except Exception as e:
print('Failed to fetch password for ' + self.sender)
return None
def setStaticFields(self, msg, subject):
msg['From'] = self.sender
msg['To'] = self.recipient
msg['Date'] = formatdate(localtime=True)
msg['Subject'] = subject
return msg
def sendMailWithData(self, subject, data):
if (data != ""):
msg = MIMEText(data)
msg = self.setStaticFields(msg, subject)
self.send(msg)
def sendMailWithFile(self, subject, file):
if (len(file) > 0):
msg = MIMEMultipart()
msg = self.setStaticFields(msg, subject)
part = MIMEBase('application', "octet-stream")
with open (file, "r") as f:
part.set_payload(f.read())
part.add_header('Content-Disposition', 'attachment; filename="{}"'.format(file))
msg.attach(part)
self.send(msg)
def storeSenderPassword(address):
try:
# Testing...
keyring.set_password('MailBot', address, getpass.getpass())
keyring.get_password('MailBot', address)
print('Successfully stored password for ' + address)
except Exception as e:
print('Failed to store password for ' + address)
pass
def deleteSenderPassword(address):
try:
keyring.delete_password('MailBot', address)
print('Deleted password for ' + address)
except Exception as e:
print('Failed to delete password - are you sure it exists?')
print(e)
if __name__ == "__main__":
parser = argparse.ArgumentParser(
description="MailBot",
)
required_group = parser.add_mutually_exclusive_group(required=True)
required_group.add_argument(
'-s',
'--store',
action='store_true',
dest='store',
help='Store a sender account password.',
)
required_group.add_argument(
'-d',
'--delete',
action='store_true',
dest='delete',
help='Delete a sender account password.',
)
parser.add_argument(
'--sender',
help='Email address of the sender account.',
type=str,
required=True
)
args = parser.parse_args()
sender = args.sender
if args.store:
storeSenderPassword(sender)
elif args.delete:
deleteSenderPassword(sender)