PureBasic
PureBasic
IMAP SSH Tunneling (Port Forwarding)
Demonstrates how to setup and use an SSH tunnel for IMAP.Chilkat PureBasic Downloads
IncludeFile "CkEmail.pb"
IncludeFile "CkImap.pb"
Procedure ChilkatExample()
success.i = 0
; This example assumes the Chilkat API to have been previously unlocked.
; See Global Unlock Sample for sample code.
imap.i = CkImap::ckCreate()
If imap.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
; The SSH hostname may be a hostname or an
; IP address, such as "192.168.1.108".
; The port is typically 22 (the standard port for SSH).
sshHostname.s = "www.mysshserver.com"
sshPort.i = 22
; Connect to an SSH server and establish the SSH tunnel:
success = CkImap::ckSshOpenTunnel(imap,sshHostname,sshPort)
If success = 0
Debug CkImap::ckLastErrorText(imap)
CkImap::ckDispose(imap)
ProcedureReturn
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.
success = CkImap::ckSshAuthenticatePw(imap,"mySshLogin","mySshPassword")
If success = 0
Debug CkImap::ckLastErrorText(imap)
CkImap::ckDispose(imap)
ProcedureReturn
EndIf
; OK, the SSH tunnel is setup. The IMAP component may
; be used exactly the same as usual, except all communications
; are sent through the SSH tunnel.
; Connect to an IMAP server via the 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.
CkImap::setCkSsl(imap, 1)
CkImap::setCkPort(imap, 993)
success = CkImap::ckConnect(imap,"imap.my-imap-server.com")
If success = 0
Debug CkImap::ckLastErrorText(imap)
CkImap::ckDispose(imap)
ProcedureReturn
EndIf
; Authenticate with the IMAP server via the SSH tunnel.
success = CkImap::ckLogin(imap,"myLogin","myPassword")
If success = 0
Debug CkImap::ckLastErrorText(imap)
CkImap::ckDispose(imap)
ProcedureReturn
EndIf
; Select an IMAP mailbox
success = CkImap::ckSelectMailbox(imap,"Inbox")
If success = 0
Debug CkImap::ckLastErrorText(imap)
CkImap::ckDispose(imap)
ProcedureReturn
EndIf
; How many messages in Inbox?
msgCount.i = CkImap::ckNumMessages(imap)
If msgCount = 0
Debug "No messages found."
CkImap::ckDispose(imap)
ProcedureReturn
EndIf
upperBound.i = 10
If msgCount < upperBound
upperBound = msgCount
EndIf
; Download up to the 1st 10 messages.
email.i = CkEmail::ckCreate()
If email.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
i.i
bUid.i = 0
For i = 1 To upperBound
success = CkImap::ckFetchEmail(imap,0,i,bUid,email)
If success = 0
Debug CkImap::ckLastErrorText(imap)
CkImap::ckDispose(imap)
CkEmail::ckDispose(email)
ProcedureReturn
EndIf
Debug CkEmail::ckFrom(email)
Debug CkEmail::ckSubject(email)
Debug "----"
Next
; Disconnect from the IMAP server.
; The SSH tunnel remains open.
success = CkImap::ckDisconnect(imap)
If success = 0
Debug CkImap::ckLastErrorText(imap)
CkImap::ckDispose(imap)
CkEmail::ckDispose(email)
ProcedureReturn
EndIf
; It is possible to re-use the existing SSH tunnel for the next connection:
success = CkImap::ckConnect(imap,"imap.my-imap-server2.com")
If success = 0
Debug CkImap::ckLastErrorText(imap)
CkImap::ckDispose(imap)
CkEmail::ckDispose(email)
ProcedureReturn
EndIf
; Review the LastErrorText to see that the connection was made via the SSH tunnel:
Debug CkImap::ckLastErrorText(imap)
success = CkImap::ckDisconnect(imap)
If success = 0
Debug CkImap::ckLastErrorText(imap)
CkImap::ckDispose(imap)
CkEmail::ckDispose(email)
ProcedureReturn
EndIf
; Finally, close the SSH tunnel.
success = CkImap::ckSshCloseTunnel(imap)
If success = 0
Debug CkImap::ckLastErrorText(imap)
CkImap::ckDispose(imap)
CkEmail::ckDispose(email)
ProcedureReturn
EndIf
Debug "IMAP SSH tunneling example completed."
CkImap::ckDispose(imap)
CkEmail::ckDispose(email)
ProcedureReturn
EndProcedure