Here's how I got the SOAP message to the server in Ruby:
Code:
#!/usr/bin/ruby -w
#require 'yaml'
require 'soap/rpc/driver'
require 'soap/header/simplehandler'
class ClientAuthHeaderHandler < SOAP::Header::SimpleHandler
MyHeaderName = XSD::QName.new("urn:zimbra", "context")
def initialize(sessionid = nil, authtoken = nil)
super(MyHeaderName)
@sessionid = sessionid
@authtoken = authtoken
end
def on_simple_outbound
if @sessionid
{ "sessionId" => @sessionid, "authToken" => @authtoken}
end
end
end
class FolderAction < SOAP::SOAPRawString
attr :extraattr, true
def initialize(op,id)
super(nil)
@extraattr = {"op"=>op,"id"=>id}
end
end
class FolderActionRequest
@@schema_element = ["action", "SOAP::SoapString"]
attr_accessor :action
def initialize(action)
@action = action
end
end
#----------- open up a SOAP connnection
# the urn is zimbraAccount (for work on user accounts) or zimbra (for general admin functions)
s = SOAP::RPC::Driver.new('https://zimbraHost:7071/service/admin/soap/',
'urn:zimbraAccount')
s.wiredump_dev = STDERR #if $DEBUG
s.options["protocol.http.ssl_config.verify_mode"] = nil
s.add_method('AuthRequest',"account", "password")
token, lifetime, sessionid = s.AuthRequest(user_id,password)
s.headerhandler << ClientAuthHeaderHandler.new(sessionid, token)
#-------now run the command
mNS = 'urn:zimbraMail'
folder_action = 'empty' # or read or delete or ...
folder_id = 7 # here I want to work on empty the address book
s.add_document_method('FolderActionRequest',
'FolderActionRequest',
[XSD::QName.new(mNS, 'FolderActionRequest')],
[XSD::QName.new(mNS, 'FolderActionResponse')])
# do it!
s.FolderActionRequest(FolderActionRequest.new(FolderAction.new(folder_action,folder_id))) Hope this is useful for someone else; it took me a minute to figure out...