/outlook.py

https://github.com/awangga/outlook · Python · 228 lines · 183 code · 39 blank · 6 comment · 15 complexity · 1d9bd575b48abee966de3a41fe7824c7 MD5 · raw file

  1. import email
  2. import imaplib
  3. import smtplib
  4. import datetime
  5. import email.mime.multipart
  6. import config
  7. import base64
  8. class Outlook():
  9. def __init__(self):
  10. pass
  11. # self.imap = imaplib.IMAP4_SSL('imap-mail.outlook.com')
  12. # self.smtp = smtplib.SMTP('smtp-mail.outlook.com')
  13. def login(self, username, password):
  14. self.username = username
  15. self.password = password
  16. login_attempts = 0
  17. while True:
  18. try:
  19. self.imap = imaplib.IMAP4_SSL(config.imap_server,config.imap_port)
  20. r, d = self.imap.login(username, password)
  21. assert r == 'OK', 'login failed: %s' % str (r)
  22. print(" > Signed in as %s" % self.username, d)
  23. return
  24. except Exception as err:
  25. print(" > Sign in error: %s" % str(err))
  26. login_attempts = login_attempts + 1
  27. if login_attempts < 3:
  28. continue
  29. assert False, 'login failed'
  30. def sendEmailMIME(self, recipient, subject, message):
  31. msg = email.mime.multipart.MIMEMultipart()
  32. msg['to'] = recipient
  33. msg['from'] = self.username
  34. msg['subject'] = subject
  35. msg.add_header('reply-to', self.username)
  36. # headers = "\r\n".join(["from: " + "sms@kitaklik.com","subject: " + subject,"to: " + recipient,"mime-version: 1.0","content-type: text/html"])
  37. # content = headers + "\r\n\r\n" + message
  38. try:
  39. self.smtp = smtplib.SMTP(config.smtp_server, config.smtp_port)
  40. self.smtp.ehlo()
  41. self.smtp.starttls()
  42. self.smtp.login(self.username, self.password)
  43. self.smtp.sendmail(msg['from'], [msg['to']], msg.as_string())
  44. print(" email replied")
  45. except smtplib.SMTPException:
  46. print("Error: unable to send email")
  47. def sendEmail(self, recipient, subject, message):
  48. headers = "\r\n".join([
  49. "from: " + self.username,
  50. "subject: " + subject,
  51. "to: " + recipient,
  52. "mime-version: 1.0",
  53. "content-type: text/html"
  54. ])
  55. content = headers + "\r\n\r\n" + message
  56. attempts = 0
  57. while True:
  58. try:
  59. self.smtp = smtplib.SMTP(config.smtp_server, config.smtp_port)
  60. self.smtp.ehlo()
  61. self.smtp.starttls()
  62. self.smtp.login(self.username, self.password)
  63. self.smtp.sendmail(self.username, recipient, content)
  64. print(" email sent.")
  65. return
  66. except Exception as err:
  67. print(" Sending email failed: %s" % str(err))
  68. attempts = attempts + 1
  69. if attempts < 3:
  70. continue
  71. raise Exception("Send failed. Check the recipient email address")
  72. def list(self):
  73. # self.login()
  74. return self.imap.list()
  75. def select(self, str):
  76. return self.imap.select(str)
  77. def inbox(self):
  78. return self.imap.select("Inbox")
  79. def junk(self):
  80. return self.imap.select("Junk")
  81. def logout(self):
  82. return self.imap.logout()
  83. def since_date(self, days):
  84. mydate = datetime.datetime.now() - datetime.timedelta(days=days)
  85. return mydate.strftime("%d-%b-%Y")
  86. def allIdsSince(self, days):
  87. r, d = self.imap.search(None, '(SINCE "'+self.since_date(days)+'")', 'ALL')
  88. list = d[0].split(' ')
  89. return list
  90. def allIdsToday(self):
  91. return self.allIdsSince(1)
  92. def readIdsSince(self, days):
  93. r, d = self.imap.search(None, '(SINCE "'+self.date_since(days)+'")', 'SEEN')
  94. list = d[0].split(' ')
  95. return list
  96. def readIdsToday(self):
  97. return self.readIdsSince(1)
  98. def unreadIdsSince(self, days):
  99. r, d = self.imap.search(None, '(SINCE "'+self.since_date(days)+'")', 'UNSEEN')
  100. list = d[0].split(' ')
  101. return list
  102. def unreadIdsToday(self):
  103. return self.unreadIdsSince(1)
  104. def allIds(self):
  105. r, d = self.imap.search(None, "ALL")
  106. list = d[0].split(' ')
  107. return list
  108. def readIds(self):
  109. r, d = self.imap.search(None, "SEEN")
  110. list = d[0].split(' ')
  111. return list
  112. def unreadIds(self):
  113. r, d = self.imap.search(None, "UNSEEN")
  114. list = d[0].split(' ')
  115. return list
  116. def hasUnread(self):
  117. list = self.unreadIds()
  118. return list != ['']
  119. def getIdswithWord(self, ids, word):
  120. stack = []
  121. for id in ids:
  122. self.getEmail(id)
  123. if word in self.mailbody().lower():
  124. stack.append(id)
  125. return stack
  126. def getEmail(self, id):
  127. r, d = self.imap.fetch(id, "(RFC822)")
  128. self.raw_email = d[0][1]
  129. self.email_message = email.message_from_string(self.raw_email)
  130. return self.email_message
  131. def unread(self):
  132. list = self.unreadIds()
  133. latest_id = list[-1]
  134. return self.getEmail(latest_id)
  135. def read(self):
  136. list = self.readIds()
  137. latest_id = list[-1]
  138. return self.getEmail(latest_id)
  139. def readToday(self):
  140. list = self.readIdsToday()
  141. latest_id = list[-1]
  142. return self.getEmail(latest_id)
  143. def unreadToday(self):
  144. list = self.unreadIdsToday()
  145. latest_id = list[-1]
  146. return self.getEmail(latest_id)
  147. def readOnly(self, folder):
  148. return self.imap.select(folder, readonly=True)
  149. def writeEnable(self, folder):
  150. return self.imap.select(folder, readonly=False)
  151. def rawRead(self):
  152. list = self.readIds()
  153. latest_id = list[-1]
  154. r, d = self.imap.fetch(latest_id, "(RFC822)")
  155. self.raw_email = d[0][1]
  156. return self.raw_email
  157. def mailbody(self):
  158. if self.email_message.is_multipart():
  159. for payload in self.email_message.get_payload():
  160. # if payload.is_multipart(): ...
  161. body = (
  162. payload.get_payload()
  163. .split(self.email_message['from'])[0]
  164. .split('\r\n\r\n2015')[0]
  165. )
  166. return body
  167. else:
  168. body = (
  169. self.email_message.get_payload()
  170. .split(self.email_message['from'])[0]
  171. .split('\r\n\r\n2015')[0]
  172. )
  173. return body
  174. def mailsubject(self):
  175. return self.email_message['Subject']
  176. def mailfrom(self):
  177. return self.email_message['from']
  178. def mailto(self):
  179. return self.email_message['to']
  180. def maildate(self):
  181. return self.email_message['date']
  182. def mailreturnpath(self):
  183. return self.email_message['Return-Path']
  184. def mailreplyto(self):
  185. return self.email_message['Reply-To']
  186. def mailall(self):
  187. return self.email_message
  188. def mailbodydecoded(self):
  189. return base64.urlsafe_b64decode(self.mailbody())