#!/usr/bin/env ruby require 'rubygems' require 'optparse' require 'viewpoint' require 'base64' USERNAME = 'your user here' PASSWORD = 'your base64 encoded password here' options = { :folder => 'Deleted Items', :url => 'https://example.com/ews/exchange.asmx' } offset = 0 opts = OptionParser.new opts.on('-f FOLDER', '--folder FOLDER', 'Read the data from this mail folder. (Default: nagios)') do |f| options[:folder] = f end opts.on('-o OFFSET', '--offset OFFSET', 'Start at this offset, rather than the defult of 0.') do |o| offset = o.to_i end opts.on('-u URL', '--url URL', 'Use this URL to communicate with the exchange server (default: ' + 'https://example.com/ews/exchange.asmx)') do |u| options[:url] = u end opts.on_tail('-h', '--help', 'Show this message') do puts opts exit end opts.parse(ARGV) Viewpoint::EWS::EWS.endpoint = options[:url] Viewpoint::EWS::EWS.set_auth(USERNAME, Base64.decode64(PASSWORD)) # Get the trashfolder trash = Viewpoint::EWS::Folder.get_folder_by_name(options[:folder]) # Returns the error number after doing the delete. Expects an array of ids def do_delete(ids) # I'm not wild about the following code, there's got to be a better way # to do this. delete_result = Viewpoint::EWS::SOAP::ExchangeWebService.delete_item( ids, 'HardDelete', 'SendToNone') error_no = delete_result.soap_response.xpath('//*/@ResponseClass').count do |sr| sr.native_element.value == 'Error' end return error_no end # Item shape is always the same item_shape = { :base_shape => 'IdOnly' } total_size = 0 while (work_items = trash.find_items({:item_shape => item_shape, :indexed_page_item_view => { :max_entries_returned => 500, :base_point => 'Beginning', :offset => offset } })).size != 0 do delete_me = work_items.collect { |wi| wi.id } error_no = do_delete(delete_me) offset += error_no good_size = work_items.size - error_no total_size += good_size time = Time.now printf("%02d:%02d:%02d %8d %3d %3d\n", time.hour, time.min, time.sec, total_size, good_size, error_no) end