LICENSING: The basic (demo) functionality version is available as a one-off copy for just US$25. A commercial-use license is available for US$100/server, with unlimited future updates. Other pricing options are available, details are available online: mailto:info@infradig.com http://www.infradig.com DESCRIPTION Created an OCX with send + receive mail functionality. Copy the file POSTIEX.DLL to your windows system directory and register it with the REGSVR32 program... > cd \winnt\system32 > regsvr32 postiex.dll OR You may also need a copy of ATL.DLL from Microsoft which you must FIRST register as above. A copy is not included in the release. Most MS products now come with a copy. The test ASP script POSTIEX.ASP should show you everything needed to get going. In VBScript or JavaScript it's easy, for C++ or other you are more or less on your own. The following is a guide... Invocation... Set postie = Server.CreateObject("Postie.Postie") NOTE: An individiual 'Postie' object can only have one sending connection (SMTP, NNTP or IMAP4) and/or one reading connection (POP3, IMAP4) open at a time. That is, one of each. postie.SetPool(short min_size, short timeout) // NOT IN DEMO RELEASE ... enable IMAP persistent connection pooling. Set 'min-size' to to the minimum number of idle connections to keep in the pool (zero means no pooling). Set 'timeout' to the time in seconds before an idle connection is deleted from the pool (only if more than 'min_size' connections). Connections are always created on demand and added back into the pool after use. This feature is only available with servers that support re-LOGIN after a LOGOUT (such as InfraMail). Sending-mail method summary... postie.EnableSSL(short tls, short ssl) // NOT IN DEMO RELEASE ... enable SSL/TLS for servers that 1) support STARTTLS/STLS if 'tls' equals 1 or 2) support SSL special ports if 'ssl' equals 1. The two params are mutually exlusive and by default both are off. Please be aware of your local export/patent laws regarding use and redistribution of SSL enabled products. postie.ConnectSmtp(BSTR host, BSTR service) postie.ConnectImaptp(BSTR host, BSTR service) // NOT IN DEMO RELEASE postie.ConnectNntp(BSTR host, BSTR service) // NOT IN DEMO RELEASE ... where 'host' is the name of a server or a comma-separated list of servers that will queue mail. If a list of servers then they will be tried in the order specified. And 'service' is usually "smtp" or 25 for mail, "nntp" or 119 for news and 'imap' or '143' for Imap. postie.Login(BSTR userid, BSTR password) // NOT IN DEMO RELEASE .. pretty-much self-explanatory. postie.SetMbox(BSTR mailbox) // NOT IN DEMO RELEASE ... set the current IMAP4 mailbox. Use the '/' character (not always, but it's most common) as a mailbox hierarchy separator rather like a URL. For example "docs" or "docs/1998". postie.SetUserHeaders(BSTR headers) // NOT IN DEMO RELEASE ... set user defined headers in an outgoing message. For example... postie.SetUserHeaders("X-MyHeader1: blurdy\r\nX-MyHeader2: bloop\r\n"); and note: each header must be terminated with a CR+LF (as above). postie.SetMimetype(BSTR mimetype) // NOT IN DEMO RELEASE ... where 'mimetype' is the MIME type set int the Content-Type header (default value is 'text/plain'. postie.SetCharset(BSTR charset) // NOT IN DEMO RELEASE ... where 'charset' is the name of a character-set encoding eg. "ISO-8859-5" for Cyrillic, or "ISO-8859-7" for Greek, or "ISO-8859-2" for Central European". The default is "ISO-8859-1" for Western (English). postie.SetOrganization(BSTR name) // NOT IN DEMO RELEASE ... set the organization name header. postie.SetLimit(short nbr) // NOT IN DEMO RELEASE ... set the number of recipients to send to at one time. Creates batches to satisfy server limits. postie.SetPriority(short level) // NOT IN DEMO RELEASE ... set the priority of the message (0 = unspecified, 1 = high, 2 = low, 3 = normal). postie.SetReceipt(short mdn, short dsn) // NOT IN DEMO RELEASE ... request Mail Disposition Notification (from the client) and/or Delivery Status Notification (from the server). This is not guaranteed. postie.SetMode(short qp, short eight, short uue) // NOT IN DEMO RELEASE ... where 'qp=1' means use quoted-printable encoding (the default), 'qp=2' means use base64 encoding, and 'eight' means allow 8bit characters (not the default, with qp only). And 'uue' means UUEncode (if there are no attachments then the message-body is uue'd, if attachments then only they are uue'd). The default and typical setting woule be to use SetMode(1, 0, 0). postie.Attach(BSTR filename) // NOT IN DEMO RELEASE ... attachment specified by filename is sent with the message. postie.Include(BSTR filename, BSTR url) // NOT IN DEMO RELEASE ... object (image, applet etc) specified by filename is sent embedded within the message and can be referred to by an associated HTML tag using that URL. Used when sending HTML mail and you want to include referenced objects so that the message is self-contained and dosen't rely on HTTP access to view the page. postie.Probe(BSTR to) // NOT IN DEMO RELEASE ... test validity of email address at it's server (you must first connect to it's MX host). postie.Post(BSTR from, BSTR to, BSTR subject, BSTR msg) // DEMO RELEASE ONLY ... the 'to' address field can be a comma-separated list of addresses. postie.Post(BSTR from, BSTR to, BSTR subject, BSTR msg, short html, short alt) // NOT IN DEMO RELEASE ... where 'html' is 1 for HTML or 0 for plain-text, and 'alt' is 1 for a plain-text alternative to HTML (if 'html' is plain-text then the value of 'alt' is irrelevant). The 'to' address field can be a comma-separated list of addresses. postie.SetAltText(BSTR text) // NOT IN DEMO RELEASE ... where 'alttext' is the plain-text alternative to the HTML in the next post (if 'alt' is 1). postie.SetBccList(BSTR filename) // NOT IN DEMO RELEASE ... called prior to a post command, preloads from file (one per line) a list of addresses into the Bcc: list. postie.AsyncPostEx(BSTR from, BSTR replyto, BSTR to, BSTR cc, BSTR bcc, BSTR subject, BSTR msg, short html, short alt) // NOT IN DEMO RELEASE postie.PostEx(BSTR from, BSTR replyto, BSTR to, BSTR cc, BSTR bcc, BSTR subject, BSTR msg, short html, short alt) // NOT IN DEMO RELEASE ... where 'html' is 1 for HTML or 0 for plain-text, and 'alt' is 1 for a plain-text alternative to HTML (if 'html' is plain-text then the value of 'alt' is irrelevant). Any of the destination address fields can be comma-separated lists of addresses. short postie.GetAsyncPostProgress() // NOT IN DEMO RELEASE ... return percentage done for async transfer. short postie.GetAsyncPostDone() // NOT IN DEMO RELEASE ... return zero (in-progress) <0 (error) or >0 (success) for async transfer. Loop on this result to wait for completion. postie.ClearAttachments() // NOT IN DEMO RELEASE ... removes any attached or included files. postie.DisconnectImaptp() // NOT IN DEMO RELEASE postie.DisconnectSmtp() // NOT IN DEMO RELEASE postie.DisconnectNntp() // NOT IN DEMO RELEASE postie.Disconnect() // DEMO RELEASE ONLY ... shutdown connection. Reading-mail method summary... postie.EnableSSL(short tls, short ssl) // NOT IN DEMO RELEASE ... enable SSL/TLS for servers that 1) support STARTTLS/STLS if 'tls' equals 1 or 2) support SSL special ports if 'ssl' equals 1. The two params are mutually exlusive and by default both are off. Please be aware of your local export/patent laws regarding use and redistribution of SSL enabled products. postie.ConnectPop3(BSTR host, BSTR service) postie.ConnectImap4(BSTR host, BSTR service) // NOT IN DEMO RELEASE ... where 'service' is usually "pop3" or "110" for POP, and "imap2" or "143" for IMAP servers. postie.ConnectFile(BSTR pathname, BSTR ext) // NOT IN DEMO RELEASE ... where 'pathname' is the path to a bunch of MIME encoded text file with extension 'ext' (eg. '.txt'). Use the normal retrieve for mesage number and content methods. If the value of 'ext is empty then 'pathname' must be an actual filename. For example: postie.ConnectFile("c:\infradig-servers\spool\mail\fred", ".txt") postie.ConnectFile("c:\infradig-servers\spool\mail\fred\000000001.txt", "") postie.Login(BSTR userid, BSTR password) .. pretty-much self-explanatory. postie.Mbox(BSTR mailbox) // NOT IN DEMO RELEASE ... set the current mailbox (IMAP4 only). Use the '/' character (not always, but it's most common) as a mailbox hierarchy separator rather like a URL. For example "docs" or "docs/1998". Returns summary information on the mailbox. postie.Sort(BSTR key-list) // NOT IN DEMO RELEASE ... sorts (IMAP4 only) the selected messages based on the supplied 'key-list' arg. Valid 'key-list' values are 'arrival', 'cc', 'date', 'reverse', 'size', 'subject' and 'to'. postie.SortEx(BSTR key-list, BSTR search-list) // NOT IN DEMO RELEASE ... search (IMAP4 only) for selected messages based on the supplied 'key-list' and 'search-list' args. Valid 'search-list' values are "SINCE dd-mmm-yyyy" and/or "BEFORE dd-mmm-yyy". postie.GetSortUID(short n) // NOT IN DEMO RELEASE ... returns (IMAP4 only) the UID of a given message after a sort. long postie.GetValidity() // NOT IN DEMO RELEASE ... returns the UID validity number of a mailbox (only relevant with IMAP4). Note: the combination of UID validity number for a mailbox and the UID number for a message is guaranteed to uniquely identify a message. Also returned by an IMAP post (if the server supports UIDPLUS extension). long postie.GetUIDNext() // NOT IN DEMO RELEASE ... returns the next valid UID number of a mailbox (only relevant with IMAP4). Note: the combination of UID validity number for a mailbox and the UID number for a message is guaranteed to uniquely identify a message. Can be compared against a saved value to determine unambiguously if there are new messages and where to start requesting from. postie.List(BSTR expression) // NOT IN DEMO RELEASE ... list folder entries that match 'expression' (IMAP4 only). For example "*" will list all your mailbox and sub-mailboxes. "%" will list your top-level mailboxes. "docs/%" will list the level under your top-level 'docs' mailbox. And "docs/*" will list all mailboxes under 'docs' etc. postie.Subscribed(BSTR expression) // NOT IN DEMO RELEASE ... list folder subscriptions that match 'expression' (IMAP4 only). For example "*" will list all your mailbox and sub-mailboxes. "%" will list your top-level mailboxes. "docs/%" will list the level under your top-level 'docs' mailbox. And "docs/*" will list all mailboxes under 'docs' etc. BSTR postie.GetMbox() // NOT IN DEMO RELEASE ... iterate on this function to return each mailbox returned by the List() method above. When GetMbox() returns and empty string it is finished. postie.Create(BSTR mailbox) // NOT IN DEMO RELEASE ... create the named mailbox (IMAP4 only). Mailbox hierarchies must be created in order, for example create "docs" before trying to create "docs/1998". postie.Create(BSTR mailbox) // NOT IN DEMO RELEASE ... if mailbox (IMAP4 only) is of the form 'user.USERID PASSWORD' and connected to an Inframail Server then the either a) the specified account is created with userid 'USERID' and password 'PASSWORD', or b) the specified account is modified setting the password to 'PASSWORD'. You must first login as the root account in order to perform this operation. postie.Subscribe(BSTR mailbox) // NOT IN DEMO RELEASE ... subscribe (make visible) the named mailbox (IMAP4 only). postie.Unsubscribe(BSTR mailbox) // NOT IN DEMO RELEASE ... unsubscribe (make non-visible) the named mailbox (IMAP4 only). postie.Remove(BSTR mailbox) // NOT IN DEMO RELEASE ... delete the named mailbox (IMAP4 only). Mailboxes be removed in reverse order, for example remove "docs/1998" before trying to remove "docs". postie.Remove(BSTR mailbox) // NOT IN DEMO RELEASE ... if mailbox (IMAP4 only) is of the form 'user.USERID' and connected to an Inframail Server then the specified account with userid 'USERID' is deleted. You must first login as the root account in order to perform this operation. postie.Rename(BSTR from_mailbox, BSTR to_mailbox) // NOT IN DEMO RELEASE ... rename the named mailbox to another name (IMAP4 only). For example Rename("docs/current", "docs/1998"). postie.CopyByUID(long uid, BSTR mailbox) // NOT IN DEMO RELEASE (IMAP ONLY) postie.Copy(short n, BSTR mailbox) // NOT IN DEMO RELEASE ... copy message number 'n' in the current mailbox to the named mailbox (IMAP4 only). short postie.GetCount() ... returns the number of messages in the current mailbox. long postie.GetMessageLength(short n) ... returns the size of message 'n' (without first reading it in). long postie.GetLength() ... returns the total size of all messages. Note: this is not necessarily accurate as all versions of Microsoft Exchange Server lie outrageously about message sizes and cannot be trusted. Only when used prior to any 'Retrieve' call. long postie.GetMsgUID(short nbr) // NOT IN DEMO RELEASE ... returns the UID (within a mailbox) of a message (only relevant with IMAP4). postie.StartIdle() // NOT IN DEMO RELEASE ... begin IMAP idling for servers that support it. When idling the server will notify the client when new messages have arrived. long postie.WaitIdle(long secs) // NOT IN DEMO RELEASE ... wait for the specified number of seconds or until a new message arrives. Check with postie.GetCount() whether there are new messages. Note: using idle processing (the IDLE IMAP extension for supporting servers) is much more efficient than polling the server on a periodic basis. Returns the number of seconds left to wait. If new new messages are detected call Mbox() to fetch summary information on messages. postie.EndIdle() // NOT IN DEMO RELEASE ... end idle processing. postie.SetHTML(short mode) // NOT IN DEMO RELEASE ... if 'mode' = 1 then with multi-part alternative mail retrieve the HTML content if present rather than the plain-text content (see postie.GetBody()). Default is 'mode' = 0. postie.AsyncRetrieveByUID(long uid, short brief, short extract) // NOT IN DEMO RELEASE (IMAP ONLY) postie.AsyncRetrieve(short nbr, short brief, short extract) // NOT IN DEMO RELEASE postie.RetrieveByUID(long uid, short brief, short extract) // NOT IN DEMO RELEASE (IMAP ONLY) postie.Retrieve(short nbr, short brief, short extract) ... reads in the specified message (starting at 1 if there are messages). Where the whole message (including the body) is read in if brief is 0, or just the headers (no message body) if brief is set to 1 (use brief = 2 to peek at the whole message IMAP4 only). If text attachments are present they are inlined into the message body if extract is zero. NOTE: in demo release extract is ignored and assumed to be '0'. short postie.GetAsyncRetrieveProgress() // NOT IN DEMO RELEASE ... return percentage done for async transfer. short postie.GetAsyncRetrieveDone() // NOT IN DEMO RELEASE ... return zero (in-progress) <0 (error) or >0 (success) for async transfer. Loop on this result to wait for completion. postie.BodyStructureByUID(long uid) // NOT IN DEMO RELEASE (IMAP ONLY) ... reads and parses the IMAP BODYSTRUCTURE for the specified message (by UID). postie.BodyStructure(short nbr) // NOT IN DEMO RELEASE (IMAP ONLY) ... reads and parses the IMAP BODYSTRUCTURE for the specified message (by sequence number). BSTR postie.NextPart() // NOT IN DEMO RELEASE (IMAP ONLY) ... after an IMAP Bodystructure() call, get details of MIME parts. Returns part specifier, loop until empty string returned. BSTR postie.GetPartContentType(BSTR part) BSTR postie.GetPartCharset(BSTR part) BSTR postie.GetPartEncoding(BSTR part) long postie.GetPartBytes(BSTR part) BSTR postie.GetPartFilename(BSTR part) BSTR postie.GetPartDisposition(BSTR part) BSTR postie.GetPartDispositionFilename(BSTR part) ... using the part specifier returned by NextPart() get the nominated value. A 'ContentType' of "ALTERNATIVE" means that sub-parts exist and that a client should display the most appropriate one only. The 'Encoding' value is used in part retrieval to decode the part for display or saving to file (or use "8bit" to retrieve it in raw encoded form). postie.PartByUID(long uid, BSTR part, BSTR encoding) // NOT IN DEMO RELEASE (IMAP ONLY) postie.Part(short n, BSTR part, BSTR encoding) // NOT IN DEMO RELEASE (IMAP ONLY) ... reads the specified IMAP message part using encoding (base64, quoted-printable, uuencoded, 7bit or 8bit) and returns it as the body (see GetBody()). BSTR postie.GetHeader(BSTR header-name) ... returns the value (RHS of the ':') of the named header or empty string if not found. It is case insensitive. Successive calls for the same header return other instances of the header (in the order they were read in). BSTR postie.GetMimeType() ... returns the mime-type of the message-body (e.g. 'text/plain'). BSTR postie.GetCharset() ... returns the character-set of the message-body (e.g. 'iso-8859-1'). short postie.GetAttachmentCount() // // NOT IN DEMO RELEASE ... returns the number of attachments in the message. long postie.GetAttachmentLength() // NOT IN DEMO RELEASE ... returns the total size of all attachments in the message. short postie.GetPriority() // NOT IN DEMO RELEASE ... get the priority of the message (0 = unspecified, 1 = high, 2 = low, 3 = normal). BSTR postie.GetDate() BSTR postie.GetTo() BSTR postie.GetCc() // NOT IN DEMO RELEASE BSTR postie.GetReplyTo() BSTR postie.GetFrom() BSTR postie.GetSubject() .. pretty-much self-explanatory, get the identified header. BSTR postie.GetBody() .. pretty-much self-explanatory, get the message body. BSTR postie.GetAttachment() // NOT IN DEMO RELEASE .. pretty-much self-explanatory, get the attachment body. Returns a binary string so use Response.BinaryWrite() ASP method to display. BSTR postie.GetHeaderCharset() // NOT IN DEMO RELEASE ... returns the chracter-set of the header just read (e.g. 'iso-8859-1'). With addresses the To:, From: ReplyTo: etc could easily all have different character-sets, the subject as well. Headers are decoded and represention should use the indicated character-set. It is possible that multiple charsets could be used in the same header, this is not catered for currently. A method of retrieving the raw headers is thus needed (in the future). BSTR postie.GetNextAttachmentContents() // NOT IN DEMO RELEASE ... get the next attachment and return the (possibly binary) contents. Makes the attachment 'current' (see GetLength(), GetCharset(), GetMimeType() etc). Returns a binary string so use Response.BinaryWrite() ASP method to display. BSTR postie.GetNextAttachment(BSTR path) // NOT IN DEMO RELEASE ... get the next attachment and save it in the specified path under the returned filename. The returned filename is the name specified in the attachment (e.g. 'message.txt') and does not (hopefully) include any path information. Combine this with the given path (e.g. "c:\temp") to get the file-spec where the attachment has been saved (e.g. "c:\temp\message.txt"). Makes the attachment 'current' (see GetLength(), GetCharset(), GetMimeType() etc). BSTR postie.GetMimeType() ... returns the mime-type of the attachment (e.g. 'text/plain'). BSTR postie.GetCharset() ... returns the character-set of the attachment (e.g. 'iso-8859-1'). long postie.GetLength() ... returns the size of the attachment. BSTR postie.GetName() // NOT IN DEMO RELEASE ... returns the filename of an attachment. BSTR postie.GetCID() // NOT IN DEMO RELEASE ... returns the content-ID of a multipart/related object (e.g. 'image.gif@infradig.com'). BSTR postie.GetBase() // NOT IN DEMO RELEASE ... returns the content-base URL of a multipart/related object (e.g. 'http://www.infradig.com/images/'). BSTR postie.GetLocation() // NOT IN DEMO RELEASE ... returns the content-location of a multipart/related object (e.g. 'image.gif'). BSTR postie.GetMessageID() // NOT IN DEMO RELEASE ... returns the Message-ID: header. BSTR postie.GetReferences() // NOT IN DEMO RELEASE ... returns the References: header. long postie.GetUID() // NOT IN DEMO RELEASE ... returns the IMAP UID (within a mailbox) of a message just read or posted (if the server supports the UIDPLUS extension). BSTR postie.GetFlags() // NOT IN DEMO RELEASE ... returns the flags of a message (only relevant with IMAP4). postie.SetFlagsByUID(long uid, BSTR flags, short clear) ... set or clear IMAP flags (eg. \Deleted \Marked \Flagged \Seen \Recent \Answered $MDNSent). If the value of 'clear' is 0 then the flag(s) are set, otherwise they are cleared. Note: setting or clearing flags only alters the status of the indicated flags. The list of flags should be a space separated list of flags. postie.Delete(short nbr) ... marks (IMAP4) or sets (POP3) the message for deletion. The message is not actually deleted until you either call Purge (IMAP4) or Disconnect (POP3). postie.Purge() // NOT IN DEMO RELEASE ... permanently remove (IMAP4 only) messages marked for deletion from the current mailbox and deselects it. You must then either Disconnect() or use Mbox() to select a new mailbox. postie.DisconnectFile() // NOT IN DEMO RELEASE postie.DisconnectPop3() // NOT IN DEMO RELEASE postie.DisconnectImap4() // NOT IN DEMO RELEASE postie.Disconnect() // DEMO RELEASE ONLY ... shutdown connection. Property summary... long postie.Status() ... where a value <= 0 indicates an error. BSTR postie.StatusCode() ... returns actual response. Clean-up... Set postie = Nothing ... this does not seem to call destructors on the object, very odd! The folowing are available in the companion InfradigX component (NOT AVAILABLE IN DEMO): Invocation... Set infradig = Server.CreateObject("infradig.infradig") NOTE: An individiual 'infradig' object can only have one connection of each type open at a time. Translate an ip-address to a name... BSTR infradig.Gethostbyaddr(BSTR ip-address) Looking up domain-name server info... BSTR infradig.GetDefaultDNS() ... get domain-name server (from TCPI/IP info in Registry). infradig.ConnectDNS(BSTR host) .. connect to specified domain-name server. BSTR infradig.GetMX(BSTR domain) ... look-up the mail-exchanger (MX) entry for the domain and return the name of it's mail server. This server name can then be used on infradig.ConnectSmtp() call to send mail directly to an address without queueing. If no MX entry is found it will look for other appropriate entries (such as an A record), if any. infradig.DisconnectDNS() ... shutdown server connection. Looking up LDAP directory server info... infradig.ConnectLDAP(BSTR host, BSTR service) ... connect to specified directory server. infradig.Auth(BSTR bindn, BSTR bindpwd, BSTR basedn) ... specify auth credentials and a base for searching. infradig.FindAttribute(BSTR filter, BSTR attrib) ... search LDAP directory based on filter for named attribute. BSTR infradig.NextResult() ... return attribute value(s). There may be multiple results so loop on this being non-empty. infradig.FindAllAttributes(BSTR filter) ... search LDAP directory based on filter returning all attribute/value pairs. BSTR infradig.NextAttribute() ... return attribute. There may be multiple results so loop on this being non-empty. BSTR infradig.NextValue() ... return value corresponding to an attribute returned above. There may be multiple results so loop on this being non-empty. infradig.ModifyAttributeValue(BSTR dn, BSTR attrib, BSTR value) infradig.SetModifyAttributeValue(BSTR value) infradig.ModifyAttribute(BSTR dn, BSTR attrib) infradig.DeleteAttributeValue(BSTR dn, BSTR attrib, BSTR value) infradig.DeleteAttribute(BSTR dn, BSTR attrib) infradig.DeleteEntry(BSTR dn) infradig.AddAttributeValue(BSTR dn, BSTR attrib, BSTR value) infradig.AddEntryAttributeValue(BSTR attrib, BSTR value) infradig.AddEntry(BSTR dn) infradig.DisconnectLDAP() ... shutdown server connection. Fetch an URL... infradig.ConnectHttp() ... to use http: (or https: if available) access. infradig.SetProxy(BSTR host, BSTR service) ... where 'service' is usually "http" or "80" for Web servers. infradig.SetLogin(BSTR userid, BSTR password) ... use when authentication is required. infradig.ClearHeaders() ... clear stored custom headers (that are sent to server). infradig.AddHeader(BSTR header) ... store custom header that is sent to the server. For example: infradig.AddHeader("User-Agent: Mozilla/4.0 (compatible; blah; blah)"+vbCrLf) BSTR infradig.GetUrl(BSTR url) ... return the contents of requested URL (via GET) as a string. infradig.GetUrlToFile(BSTR url, BSTR filename) ... return the contents of requested URL (via GET) as a file. infradig.ClearFormData() ... clear stored form data (name/value pairs). infradig.AddFormData(BSTR name, BSTR value) ... store name/value pair for subsequent posting. Call this function as many times as necessary to add form data. BSTR infradig.PostUrl(BSTR url) ... return the contents of requested URL (via POST) as a string. infradig.PostUrlToFile(BSTR url, BSTR filename) ... return the contents of requested URL (via POST) as a file. BSTR infradig.GetLog // NOT IN DEMO RELEAS ... return HTTP session log. infradig.DisconnectHttp() ... shutdown server connection. Send a SIP message... infradig.ConnectSip() ... to use sip: (or sips: if available) access. infradig.SetProxy(BSTR host, BSTR service) ... where 'service' is usually "sip" or "5060" for SIP servers. infradig.SetProxyLogin(BSTR userid, BSTR password) ... use when proxy authentication is required. infradig.SetLogin(BSTR userid, BSTR password) ... use when authentication is required. infradig.SipAddresses(BSTR from, BSTR to) ... addresses required. infradig.SipMessage(BSTR mimetype, BSTR payload) ... send message. BSTR infradig.GetLog // NOT IN DEMO RELEAS ... return SIP session log. infradig.DisconnectSip() ... shutdown server connection. Property summary... long infradig.Status() ... where a value <= 0 indicates an error. BSTR postie.StatusCode() ... returns actual response. Clean-up... Set infradig = Nothing ... this does not seem to call destructors on the object, very odd!