Chilkat HOME .NET Core C# Android™ AutoIt C C# C++ Chilkat2-Python CkPython Classic ASP DataFlex Delphi ActiveX Delphi DLL Go Java Lianja Mono C# Node.js Objective-C PHP ActiveX PHP Extension Perl PowerBuilder PowerShell PureBasic Ruby SQL Server Swift 2 Swift 3,4,5... Tcl Unicode C Unicode C++ VB.NET VBScript Visual Basic 6.0 Visual FoxPro Xojo Plugin
(PureBasic) IMAP Use Existing SSH TunnelDemonstrates 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.
IncludeFile "CkSocket.pb" IncludeFile "CkGlobal.pb" IncludeFile "CkImap.pb" IncludeFile "CkEmail.pb" Procedure ChilkatExample() ; Starting in v9.5.0.49, all Chilkat classes can be unlocked at once at the beginning of a program ; by calling UnlockBundle. It requires a Bundle unlock code. chilkatGlob.i = CkGlobal::ckCreate() If chilkatGlob.i = 0 Debug "Failed to create object." ProcedureReturn EndIf success.i = CkGlobal::ckUnlockBundle(chilkatGlob,"Anything for 30-day trial.") If success <> 1 Debug CkGlobal::ckLastErrorText(chilkatGlob) CkGlobal::ckDispose(chilkatGlob) ProcedureReturn EndIf tunnel.i = CkSocket::ckCreate() If tunnel.i = 0 Debug "Failed to create object." ProcedureReturn EndIf success.i sshHostname.s = "www.my-ssh-server.com" sshPort.i = 22 ; Connect to an SSH server and establish the SSH tunnel: success = CkSocket::ckSshOpenTunnel(tunnel,sshHostname,sshPort) If success <> 1 Debug CkSocket::ckLastErrorText(tunnel) CkGlobal::ckDispose(chilkatGlob) CkSocket::ckDispose(tunnel) 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 = CkSocket::ckSshAuthenticatePw(tunnel,"mySshLogin","mySshPassword") If success <> 1 Debug CkSocket::ckLastErrorText(tunnel) CkGlobal::ckDispose(chilkatGlob) CkSocket::ckDispose(tunnel) ProcedureReturn 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. imap.i = CkImap::ckCreate() If imap.i = 0 Debug "Failed to create object." ProcedureReturn EndIf ; Let the IMAP object also use the SSH tunnel success = CkImap::ckUseSshTunnel(imap,tunnel) If success <> 1 Debug CkImap::ckLastErrorText(imap) CkGlobal::ckDispose(chilkatGlob) CkSocket::ckDispose(tunnel) CkImap::ckDispose(imap) ProcedureReturn 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. CkImap::setCkSsl(imap, 1) CkImap::setCkPort(imap, 993) success = CkImap::ckConnect(imap,"imap.my-imap-server.com") If success <> 1 Debug CkImap::ckLastErrorText(imap) CkGlobal::ckDispose(chilkatGlob) CkSocket::ckDispose(tunnel) CkImap::ckDispose(imap) ProcedureReturn EndIf ; Authenticate with the IMAP server via the SSH tunnel. success = CkImap::ckLogin(imap,"myLogin","myPassword") If success <> 1 Debug CkImap::ckLastErrorText(imap) CkGlobal::ckDispose(chilkatGlob) CkSocket::ckDispose(tunnel) CkImap::ckDispose(imap) ProcedureReturn EndIf ; Select an IMAP mailbox success = CkImap::ckSelectMailbox(imap,"Inbox") If success <> 1 Debug CkImap::ckLastErrorText(imap) CkGlobal::ckDispose(chilkatGlob) CkSocket::ckDispose(tunnel) CkImap::ckDispose(imap) ProcedureReturn EndIf ; How many messages in Inbox? msgCount.i = CkImap::ckNumMessages(imap) If msgCount = 0 Debug "No messages found." CkGlobal::ckDispose(chilkatGlob) CkSocket::ckDispose(tunnel) CkImap::ckDispose(imap) ProcedureReturn EndIf upperBound.i = 10 If msgCount < upperBound upperBound = msgCount EndIf ; Download up to the 1st 10 messages. i.i bUid.i = 0 For i = 1 To upperBound email.i = CkImap::ckFetchSingle(imap,i,bUid) If CkImap::ckLastMethodSuccess(imap) = 0 Debug CkImap::ckLastErrorText(imap) CkGlobal::ckDispose(chilkatGlob) CkSocket::ckDispose(tunnel) CkImap::ckDispose(imap) ProcedureReturn Else Debug CkEmail::ckFrom(email) Debug CkEmail::ckSubject(email) Debug "----" CkEmail::ckDispose(email) EndIf Next ; Disconnect from the IMAP server. ; The SSH tunnel remains open. success = CkImap::ckDisconnect(imap) If success <> 1 Debug CkImap::ckLastErrorText(imap) CkGlobal::ckDispose(chilkatGlob) CkSocket::ckDispose(tunnel) CkImap::ckDispose(imap) 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 <> 1 Debug CkImap::ckLastErrorText(imap) CkGlobal::ckDispose(chilkatGlob) CkSocket::ckDispose(tunnel) CkImap::ckDispose(imap) ProcedureReturn EndIf ; Review the LastErrorText to see that the connection was made via the SSH tunnel: Debug CkImap::ckLastErrorText(imap) ; This closes the SSH channel, which is the connection with the IMAP server. ; It does not close the SSH tunnel success = CkImap::ckDisconnect(imap) If success <> 1 Debug CkImap::ckLastErrorText(imap) CkGlobal::ckDispose(chilkatGlob) CkSocket::ckDispose(tunnel) CkImap::ckDispose(imap) ProcedureReturn 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. success = CkImap::ckSshCloseTunnel(imap) If success <> 1 Debug CkImap::ckLastErrorText(imap) CkGlobal::ckDispose(chilkatGlob) CkSocket::ckDispose(tunnel) CkImap::ckDispose(imap) ProcedureReturn EndIf ; This actually closes the SSH tunnel because it's the last object using it. success = CkSocket::ckSshCloseTunnel(tunnel) If success <> 1 Debug CkSocket::ckLastErrorText(tunnel) CkGlobal::ckDispose(chilkatGlob) CkSocket::ckDispose(tunnel) CkImap::ckDispose(imap) ProcedureReturn EndIf Debug "IMAP pre-existing SSH tunnel example completed." CkGlobal::ckDispose(chilkatGlob) CkSocket::ckDispose(tunnel) CkImap::ckDispose(imap) ProcedureReturn EndProcedure |
© 2000-2024 Chilkat Software, Inc. All Rights Reserved.