Visual FoxPro
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
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