Skip to content

Commit

Permalink
Google takeout fixes v1
Browse files Browse the repository at this point in the history
Helps with #14

#36
  • Loading branch information
adriangibanelbtactic committed Apr 4, 2022
1 parent 9273178 commit 684cd23
Showing 1 changed file with 32 additions and 27 deletions.
59 changes: 32 additions & 27 deletions imap_upload.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@
import urllib.request, urllib.parse, urllib.error
import os
import traceback
import io
import csv
from optparse import OptionParser
from urllib.parse import urlparse
from imapclient import imap_utf7
Expand Down Expand Up @@ -295,7 +297,13 @@ def begin(self, msg):
label = sanitized_label
label = re.sub(gmail_inbox_str, "INBOX", label)
label = re.sub(gmail_sent_str, "Sent", label)
labels = label.split(",")

csv_file = io.StringIO(label)
csv_reader = csv.reader(csv_file, delimiter=',', quotechar='"')
labels = []
for csv_line in csv_reader:
for csv_label in csv_line:
labels.append(csv_label)

labels_without_categories = []
for i in range(len(labels)):
Expand Down Expand Up @@ -550,54 +558,50 @@ def __init__(self, host, port, ssl, box, user, password, retry):
self.password = password
self.retry = retry
self.box = box
self.created_directories_cache = []

def upload(self, box, delivery_time, message, flags = None, boxes = None, retry = None):
def upload(self, box, delivery_time, message, flags = None, google_takeout_box_path = None, retry = None):
if retry is None:
retry = self.retry
if flags is None:
flags = []
try:
self.open()
if boxes is not None: # Google Takeout
if type(message) == str:
message = message.encode('utf-8', 'surrogateescape').decode('utf-8')
message = bytes(message, 'utf-8')
try:
self.create_folders(boxes)
google_takeout_box = "/".join(boxes)
google_takeout_box_imap_command = '"' + google_takeout_box + '"'
res = self.imap.append(imap_utf7.encode(google_takeout_box_imap_command), flags, delivery_time, message)
except:
google_takeout_box = "/".join(boxes)
google_takeout_box_imap_command = '"' + google_takeout_box + '"'
res = self.imap.append(imap_utf7.encode(google_takeout_box_imap_command), flags, delivery_time, message)
return res
if type(message) == str:
message = message.encode('utf-8', 'surrogateescape').decode('utf-8')
message = bytes(message, 'utf-8')
if google_takeout_box_path is not None: # Google Takeout
self.create_folder(google_takeout_box_path)
google_takeout_box = "/".join(google_takeout_box_path)
google_takeout_box_imap_command = '"' + google_takeout_box + '"'
return self.imap.append(imap_utf7.encode(google_takeout_box_imap_command), flags, delivery_time, message)
else: # Default behaviour
box_imap_command = '"' + box + '"'
self.imap.create(box_imap_command)
if type(message) == str:
message = message.encode('utf-8', 'surrogateescape').decode('utf-8')
message = bytes(message, 'utf-8')
return self.imap.append(box_imap_command, flags, delivery_time, message)
self.imap_create(imap_utf7.encode(box_imap_command))
return self.imap.append(imap_utf7.encode(box_imap_command), flags, delivery_time, message)
except (imaplib.IMAP4.abort, socket.error):
self.close()
if retry == 0:
raise
print("(Reconnect)", end=' ')
time.sleep(5)
return self.upload(box, delivery_time, message, flags, boxes, retry - 1)
return self.upload(box, delivery_time, message, flags, google_takeout_box_path, retry - 1)

def create_folders(self, boxes):
def create_folder(self, google_takeout_box_path):
i = 1
while i <= len(boxes):
google_takeout_box = "/".join(boxes[0:i])
while i <= len(google_takeout_box_path):
google_takeout_box = "/".join(google_takeout_box_path[0:i])
google_takeout_box_imap_command = '"' + google_takeout_box + '"'
if google_takeout_box != "INBOX":
try:
self.imap.create(imap_utf7.encode(google_takeout_box_imap_command))
self.imap_create(imap_utf7.encode(google_takeout_box_imap_command))
except:
print ("Cannot create box %s" % google_takeout_box)
i += 1
def imap_create(self, box):
if box not in self.created_directories_cache:
self.imap.create(box)
self.created_directories_cache.append(box)

def open(self):
if self.imap:
Expand All @@ -606,9 +610,10 @@ def open(self):
self.imap = imap_class(self.host, self.port)
self.imap.socket().settimeout(60)
self.imap.login(self.user, self.password)
self.created_directories_cache = []

try:
self.imap.create(self.box)
self.imap_create(self.box)
except Exception as e:
print("(create error: )" + str(e))

Expand Down

0 comments on commit 684cd23

Please sign in to comment.