Sample code for 30+ languages & platforms
Visual FoxPro Requires Chilkat v11.0.0+

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