blob: 3ffe34e2038b813b9a257943decdc9ed32428eb9 [file] [log] [blame]
#!/usr/bin/python2.4
#
# Copyright 2011 Google Inc. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Sample app for Google Apps Email Migration features.
EmailMigrationSample: Demonstrates the use of the Email Migration API
"""
__author__ = 'pti@google.com (Prashant Tiwari)'
from optparse import OptionParser
import os
from gdata.apps.migration import service
class EmailMigrationSample(object):
"""Sample application demonstrating use of the Email Migration API."""
def __init__(self, domain, email, password):
"""Constructor for the EmailMigrationSample object.
Construct an EmailMigrationSample with the given args.
Args:
domain: The domain name ("domain.com")
email: The email account of the user or the admin ("john@domain.com")
password: The domain admin's password
"""
self.service = service.MigrationService(
email=email,
password=password,
domain=domain,
source='googlecode-migrationsample-v1')
self.service.ProgrammaticLogin()
# Sample mail properties
self.mail_item_properties = ['IS_INBOX', 'IS_UNREAD']
self.mail_labels = ['EmailMigrationSample']
def Migrate(self, path):
"""Migrates messages at the given path.
Args:
path: The file or directory path where messages are stored
"""
if os.path.isfile(path):
if os.path.splitext(path)[1] != '.txt':
print "The input file is not a .txt file"
return
self._MigrateOneMail(path)
elif os.path.isdir(path):
if path.endswith(os.sep):
path = path[0: len(path) - 1]
txt_file_paths = []
filenames = os.listdir(path)
for filename in filenames:
# Filter out the non-txt files in the directory
filepath = path + os.sep + filename
if os.path.isfile(filepath) and os.path.splitext(filepath)[1] == '.txt':
txt_file_paths.append(filepath)
if not txt_file_paths:
print "Found no .txt file in the directory"
return
elif len(txt_file_paths) == 1:
# Don't use threading if there's only one txt file in the dir
self._MigrateOneMail(txt_file_paths[0])
else:
self._MigrateManyMails(txt_file_paths)
def _MigrateOneMail(self, path):
"""Imports a single message via the ImportMail service.
Args:
path: The path of the message file
"""
print "Attempting to migrate 1 message..."
content = self._ReadFileAsString(path)
self.service.ImportMail(user_name=options.username,
mail_message=content,
mail_item_properties=self.mail_item_properties,
mail_labels=self.mail_labels)
print "Successfully migrated 1 message."
def _MigrateManyMails(self, paths):
"""Imports several messages via the ImportMultipleMails service.
Args:
paths: List of paths of message files
"""
print "Attempting to migrate %d messages..." % (len(paths))
for path in paths:
content = self._ReadFileAsString(path)
self.service.AddMailEntry(mail_message=content,
mail_item_properties=self.mail_item_properties,
mail_labels=self.mail_labels,
identifier=path)
success = self.service.ImportMultipleMails(user_name=options.username)
print "Successfully migrated %d of %d messages." % (success, len(paths))
def _ReadFileAsString(self, path):
"""Reads the file found at path into a string
Args:
path: The path of the message file
Returns:
The file contents as a string
Raises:
IOError: An error occurred while trying to read the file
"""
try:
input_file = open(path, 'r')
file_str = []
for eachline in input_file:
file_str.append(eachline)
input_file.close()
return ''.join(file_str)
except IOError, e:
raise IOError(e.args[1] + ': ' + path)
def main():
"""Demonstrates the Email Migration API using EmailMigrationSample."""
usage = 'usage: %prog [options]'
global options
parser = OptionParser(usage=usage)
parser.add_option('-d', '--domain',
help="the Google Apps domain, e.g. 'domain.com'")
parser.add_option('-e', '--email',
help="the email account of the user or the admin, \
e.g. 'john.smith@domain.com'")
parser.add_option('-p', '--password',
help="the account password")
parser.add_option('-u', '--username',
help="the user account on which to perform operations. for\
non-admin users this will be their own account name. \
e.g. 'jane.smith'")
parser.add_option('-f', '--file',
help="the system path of an RFC822 format .txt file or\
directory containing multiple such files to be migrated")
(options, args) = parser.parse_args()
if (options.domain is None
or options.email is None
or options.password is None
or options.username is None
or options.file is None):
parser.print_help()
return
options.file = options.file.strip()
if not os.path.exists(options.file):
print "Invalid file or directory path"
return
sample = EmailMigrationSample(domain=options.domain,
email=options.email,
password=options.password)
sample.Migrate(options.file)
if __name__ == '__main__':
main()