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

IMAP SSH Tunneling (Port Forwarding)

Demonstrates how to setup and use an SSH tunnel for IMAP.

Chilkat DataFlex Downloads

DataFlex
Use ChilkatAx-win32.pkg

Procedure Test
    Boolean iSuccess
    Handle hoImap
    String sSshHostname
    Integer iSshPort
    Integer iMsgCount
    Integer iUpperBound
    Variant vEmail
    Handle hoEmail
    Integer i
    Boolean iBUid
    String sTemp1

    Move False To iSuccess

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

    Get Create (RefClass(cComChilkatImap)) To hoImap
    If (Not(IsComObjectCreated(hoImap))) Begin
        Send CreateComObject of hoImap
    End

    //  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).
    Move "www.mysshserver.com" To sSshHostname
    Move 22 To iSshPort

    //  Connect to an SSH server and establish the SSH tunnel:
    Get ComSshOpenTunnel Of hoImap sSshHostname iSshPort To iSuccess
    If (iSuccess = False) Begin
        Get ComLastErrorText Of hoImap To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    //  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.
    Get ComSshAuthenticatePw Of hoImap "mySshLogin" "mySshPassword" To iSuccess
    If (iSuccess = False) Begin
        Get ComLastErrorText Of hoImap To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    //  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.
    Set ComSsl Of hoImap To True
    Set ComPort Of hoImap To 993
    Get ComConnect Of hoImap "imap.my-imap-server.com" To iSuccess
    If (iSuccess = False) Begin
        Get ComLastErrorText Of hoImap To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    //  Authenticate with the IMAP server via the SSH tunnel.
    Get ComLogin Of hoImap "myLogin" "myPassword" To iSuccess
    If (iSuccess = False) Begin
        Get ComLastErrorText Of hoImap To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    //  Select an IMAP mailbox
    Get ComSelectMailbox Of hoImap "Inbox" To iSuccess
    If (iSuccess = False) Begin
        Get ComLastErrorText Of hoImap To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    //  How many messages in Inbox?
    Get ComNumMessages Of hoImap To iMsgCount
    If (iMsgCount = 0) Begin
        Showln "No messages found."
        Procedure_Return
    End

    Move 10 To iUpperBound
    If (iMsgCount < iUpperBound) Begin
        Move iMsgCount To iUpperBound
    End

    //  Download up to the 1st 10 messages.
    Get Create (RefClass(cComChilkatEmail)) To hoEmail
    If (Not(IsComObjectCreated(hoEmail))) Begin
        Send CreateComObject of hoEmail
    End

    Move False To iBUid
    For i From 1 To iUpperBound

        Get pvComObject of hoEmail to vEmail
        Get ComFetchEmail Of hoImap False i iBUid vEmail To iSuccess
        If (iSuccess = False) Begin
            Get ComLastErrorText Of hoImap To sTemp1
            Showln sTemp1
            Procedure_Return
        End

        Get ComFrom Of hoEmail To sTemp1
        Showln sTemp1
        Get ComSubject Of hoEmail To sTemp1
        Showln sTemp1
        Showln "----"
    Loop

    //  Disconnect from the IMAP server.
    //  The SSH tunnel remains open.
    Get ComDisconnect Of hoImap To iSuccess
    If (iSuccess = False) Begin
        Get ComLastErrorText Of hoImap To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    //  It is possible to re-use the existing SSH tunnel for the next connection:
    Get ComConnect Of hoImap "imap.my-imap-server2.com" To iSuccess
    If (iSuccess = False) Begin
        Get ComLastErrorText Of hoImap To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    //  Review the LastErrorText to see that the connection was made via the SSH tunnel:
    Get ComLastErrorText Of hoImap To sTemp1
    Showln sTemp1

    Get ComDisconnect Of hoImap To iSuccess
    If (iSuccess = False) Begin
        Get ComLastErrorText Of hoImap To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    //  Finally, close the SSH tunnel.
    Get ComSshCloseTunnel Of hoImap To iSuccess
    If (iSuccess = False) Begin
        Get ComLastErrorText Of hoImap To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    Showln "IMAP SSH tunneling example completed."


End_Procedure