Sample code for 30+ languages & platforms
Visual FoxPro

IMAP Use Existing SSH Tunnel

Demonstrates how to connect to an IMAP server using an existing SSH tunnel. This creates a new channel within the SSH tunnel, which can be a TCP or TLS connection, and is connected to a remote IMAP server through port forwarding.

Chilkat Visual FoxPro Downloads

Visual FoxPro
LOCAL lnSuccess
LOCAL loTunnel
LOCAL lcSshHostname
LOCAL lnSshPort
LOCAL loImap
LOCAL lnMsgCount
LOCAL lnUpperBound
LOCAL loEmail
LOCAL i
LOCAL lnBUid

lnSuccess = 0

* This example assumes the Chilkat API to have been previously unlocked.
* See Global Unlock Sample for sample code.

loTunnel = CreateObject('Chilkat.Socket')

lcSshHostname = "sftp.example.com"
lnSshPort = 22

* Connect to an SSH server and establish the SSH tunnel:
lnSuccess = loTunnel.SshOpenTunnel(lcSshHostname,lnSshPort)
IF (lnSuccess = 0) THEN
    ? loTunnel.LastErrorText
    RELEASE loTunnel
    CANCEL
ENDIF

* Authenticate with the SSH server via a login/password
* or with a public key.  
* This example demonstrates SSH password authentication.
* Note: This is not authenticating with the IMAP server, it is
* for authenticating with the SSH server, which is separate.
lnSuccess = loTunnel.SshAuthenticatePw("mySshLogin","mySshPassword")
IF (lnSuccess = 0) THEN
    ? loTunnel.LastErrorText
    RELEASE loTunnel
    CANCEL
ENDIF

* OK, the SSH tunnel is setup.  Now open a channel within the tunnel.
* Once the channel is obtained, the Socket API may
* be used exactly the same as usual, except all communications
* are sent through the channel in the SSH tunnel.
* Any number of channels may be created from the same SSH tunnel.
* Multiple channels may coexist at the same time.

loImap = CreateObject('Chilkat.Imap')

* Let the IMAP object also use the SSH tunnel
lnSuccess = loImap.UseSshTunnel(loTunnel)
IF (lnSuccess = 0) THEN
    ? loImap.LastErrorText
    RELEASE loTunnel
    RELEASE loImap
    CANCEL
ENDIF

* Connect to an IMAP server via the already established SSH tunnel.
* Because the SSH tunnel has been previously setup,
* this does not establish a direct connection with the IMAP
* server.  It directs the SSH server to establish the connection.

* In this example, the IMAP server requires SSL/TLS.  The TLS connection
* will be enclosed within the SSH tunnel.
loImap.Ssl = 1
loImap.Port = 993
lnSuccess = loImap.Connect("imap.my-imap-server.com")
IF (lnSuccess = 0) THEN
    ? loImap.LastErrorText
    RELEASE loTunnel
    RELEASE loImap
    CANCEL
ENDIF

* Authenticate with the IMAP server via the SSH tunnel.
lnSuccess = loImap.Login("myLogin","myPassword")
IF (lnSuccess = 0) THEN
    ? loImap.LastErrorText
    RELEASE loTunnel
    RELEASE loImap
    CANCEL
ENDIF

* Select an IMAP mailbox
lnSuccess = loImap.SelectMailbox("Inbox")
IF (lnSuccess = 0) THEN
    ? loImap.LastErrorText
    RELEASE loTunnel
    RELEASE loImap
    CANCEL
ENDIF

* How many messages in Inbox?
lnMsgCount = loImap.NumMessages
IF (lnMsgCount = 0) THEN
    ? "No messages found."
    RELEASE loTunnel
    RELEASE loImap
    CANCEL
ENDIF

lnUpperBound = 10
IF (lnMsgCount < lnUpperBound) THEN
    lnUpperBound = lnMsgCount
ENDIF

* Download up to the 1st 10 messages.
loEmail = CreateObject('Chilkat.Email')

lnBUid = 0
FOR i = 1 TO lnUpperBound

    lnSuccess = loImap.FetchEmail(0,i,lnBUid,loEmail)
    IF (lnSuccess = 0) THEN
        ? loImap.LastErrorText
        RELEASE loTunnel
        RELEASE loImap
        RELEASE loEmail
        CANCEL
    ENDIF

    ? loEmail.From
    ? loEmail.Subject

NEXT

* Disconnect from the IMAP server.
* The SSH tunnel remains open.
lnSuccess = loImap.Disconnect()
IF (lnSuccess = 0) THEN
    ? loImap.LastErrorText
    RELEASE loTunnel
    RELEASE loImap
    RELEASE loEmail
    CANCEL
ENDIF

* It is possible to re-use the existing SSH tunnel for the next connection:
lnSuccess = loImap.Connect("imap.my-imap-server2.com")
IF (lnSuccess = 0) THEN
    ? loImap.LastErrorText
    RELEASE loTunnel
    RELEASE loImap
    RELEASE loEmail
    CANCEL
ENDIF

* Review the LastErrorText to see that the connection was made via the SSH tunnel:
? loImap.LastErrorText

* This closes the SSH channel, which is the connection with the IMAP server.
* It does not close the SSH tunnel
lnSuccess = loImap.Disconnect()
IF (lnSuccess = 0) THEN
    ? loImap.LastErrorText
    RELEASE loTunnel
    RELEASE loImap
    RELEASE loEmail
    CANCEL
ENDIF

* Finally, close the SSH tunnel.

* Note: If other objects are using the same SSH tunnel, the tunnel is not 
* actually closed.  It is only closed when the last object using the tunnel closes it.

* At this point, both the imap and tunnel objects have references to the internal
* SSH tunnel.  We need to close each.

* This call doesn't actually close the tunnel yet, because the tunnel object still
* holds an internal reference.
lnSuccess = loImap.SshCloseTunnel()
IF (lnSuccess = 0) THEN
    ? loImap.LastErrorText
    RELEASE loTunnel
    RELEASE loImap
    RELEASE loEmail
    CANCEL
ENDIF

* This actually closes the SSH tunnel because it's the last object using it.
lnSuccess = loTunnel.SshCloseTunnel()
IF (lnSuccess = 0) THEN
    ? loTunnel.LastErrorText
    RELEASE loTunnel
    RELEASE loImap
    RELEASE loEmail
    CANCEL
ENDIF

? "IMAP pre-existing SSH tunnel example completed."

RELEASE loTunnel
RELEASE loImap
RELEASE loEmail