Sample code for 30+ languages & platforms
AutoIt

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 AutoIt Downloads

AutoIt
Local $bSuccess = False

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

$oTunnel = ObjCreate("Chilkat.Socket")

Local $sshHostname = "sftp.example.com"
Local $iSshPort = 22

; Connect to an SSH server and establish the SSH tunnel:
$bSuccess = $oTunnel.SshOpenTunnel($sshHostname,$iSshPort)
If ($bSuccess = False) Then
    ConsoleWrite($oTunnel.LastErrorText & @CRLF)
    Exit
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.
$bSuccess = $oTunnel.SshAuthenticatePw("mySshLogin","mySshPassword")
If ($bSuccess = False) Then
    ConsoleWrite($oTunnel.LastErrorText & @CRLF)
    Exit
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.

$oImap = ObjCreate("Chilkat.Imap")

; Let the IMAP object also use the SSH tunnel
$bSuccess = $oImap.UseSshTunnel($oTunnel)
If ($bSuccess = False) Then
    ConsoleWrite($oImap.LastErrorText & @CRLF)
    Exit
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.
$oImap.Ssl = True
$oImap.Port = 993
$bSuccess = $oImap.Connect("imap.my-imap-server.com")
If ($bSuccess = False) Then
    ConsoleWrite($oImap.LastErrorText & @CRLF)
    Exit
EndIf

; Authenticate with the IMAP server via the SSH tunnel.
$bSuccess = $oImap.Login("myLogin","myPassword")
If ($bSuccess = False) Then
    ConsoleWrite($oImap.LastErrorText & @CRLF)
    Exit
EndIf

; Select an IMAP mailbox
$bSuccess = $oImap.SelectMailbox("Inbox")
If ($bSuccess = False) Then
    ConsoleWrite($oImap.LastErrorText & @CRLF)
    Exit
EndIf

; How many messages in Inbox?
Local $iMsgCount = $oImap.NumMessages
If ($iMsgCount = 0) Then
    ConsoleWrite("No messages found." & @CRLF)
    Exit
EndIf

Local $iUpperBound = 10
If ($iMsgCount < $iUpperBound) Then
    $iUpperBound = $iMsgCount
EndIf

; Download up to the 1st 10 messages.
$oEmail = ObjCreate("Chilkat.Email")
Local $i
Local $bUid = False
For $i = 1 To $iUpperBound

    $bSuccess = $oImap.FetchEmail(False,$i,$bUid,$oEmail)
    If ($bSuccess = False) Then
        ConsoleWrite($oImap.LastErrorText & @CRLF)
        Exit
    EndIf

    ConsoleWrite($oEmail.From & @CRLF)
    ConsoleWrite($oEmail.Subject & @CRLF)

Next

; Disconnect from the IMAP server.
; The SSH tunnel remains open.
$bSuccess = $oImap.Disconnect()
If ($bSuccess = False) Then
    ConsoleWrite($oImap.LastErrorText & @CRLF)
    Exit
EndIf

; It is possible to re-use the existing SSH tunnel for the next connection:
$bSuccess = $oImap.Connect("imap.my-imap-server2.com")
If ($bSuccess = False) Then
    ConsoleWrite($oImap.LastErrorText & @CRLF)
    Exit
EndIf

; Review the LastErrorText to see that the connection was made via the SSH tunnel:
ConsoleWrite($oImap.LastErrorText & @CRLF)

; This closes the SSH channel, which is the connection with the IMAP server.
; It does not close the SSH tunnel
$bSuccess = $oImap.Disconnect()
If ($bSuccess = False) Then
    ConsoleWrite($oImap.LastErrorText & @CRLF)
    Exit
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.
$bSuccess = $oImap.SshCloseTunnel()
If ($bSuccess = False) Then
    ConsoleWrite($oImap.LastErrorText & @CRLF)
    Exit
EndIf

; This actually closes the SSH tunnel because it's the last object using it.
$bSuccess = $oTunnel.SshCloseTunnel()
If ($bSuccess = False) Then
    ConsoleWrite($oTunnel.LastErrorText & @CRLF)
    Exit
EndIf

ConsoleWrite("IMAP pre-existing SSH tunnel example completed." & @CRLF)