Sample code for 30+ languages & platforms
PureBasic

POP3 SSH Tunneling (Port Forwarding)

Demonstrates how to connect to a POP3 server through an SSH tunnel. Reads a POP3 mailbox and display the FROM and SUBJECT header fields of each email.

Chilkat PureBasic Downloads

PureBasic
IncludeFile "CkEmail.pb"
IncludeFile "CkMailMan.pb"

Procedure ChilkatExample()

    success.i = 0

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

    ; The mailman object is used for receiving (POP3) 
    ; and sending (SMTP) email.
    mailman.i = CkMailMan::ckCreate()
    If mailman.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 = "sftp.example.com"
    sshPort.i = 22

    ; Connect to an SSH server and establish the SSH tunnel:
    success = CkMailMan::ckSshOpenTunnel(mailman,sshHostname,sshPort)
    If success = 0
        Debug CkMailMan::ckLastErrorText(mailman)
        CkMailMan::ckDispose(mailman)
        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 POP3 server, it is
    ; for authenticating with the SSH server, which is separate.
    success = CkMailMan::ckSshAuthenticatePw(mailman,"ssh_login","ssh_password")
    If success = 0
        Debug CkMailMan::ckLastErrorText(mailman)
        CkMailMan::ckDispose(mailman)
        ProcedureReturn
    EndIf

    ; OK, the SSH tunnel is setup.  The mailman may
    ; be used exactly the same as usual, except all communications
    ; are now sent through the SSH tunnel.

    ; The SSH tunnel may be kept open for any number of 
    ; POP3 connections.  

    ; Set the POP3 server's hostname
    CkMailMan::setCkMailHost(mailman, "mail.my-pop3-server.com")

    ; Set the POP3 settings for your POP3 server:
    CkMailMan::setCkPopUsername(mailman, "pop3_login")
    CkMailMan::setCkPopPassword(mailman, "pop3_password")
    CkMailMan::setCkMailPort(mailman, 995)
    CkMailMan::setCkPopSsl(mailman, 1)

    ; Connect to the POP3 server through the already-established SSH tunnel:
    success = CkMailMan::ckPop3BeginSession(mailman)
    If success = 0
        Debug CkMailMan::ckLastErrorText(mailman)
        CkMailMan::ckDispose(mailman)
        ProcedureReturn
    EndIf

    ; A visual inspection of the LastErrorText after
    ; a successful POP3 connection will confirm the SSH tunneling.
    ; Note: If the POP3 connection uses SSL/TLS, then the SSL/TLS 
    ; secure channel will be wrapped within the SSH tunnel.
    Debug CkMailMan::ckLastErrorText(mailman)

    ; How many messages are in the POP3 inbox?
    numToDownload.i = CkMailMan::ckGetMailboxCount(mailman)
    If numToDownload > 5
        numToDownload = 5
    EndIf

    If numToDownload = 0
        Debug "No messages in the POP3 inbox."
        CkMailMan::ckDispose(mailman)
        ProcedureReturn
    EndIf

    ; Download a max of 5 messages
    i.i
    email.i = CkEmail::ckCreate()
    If email.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    For i = 1 To numToDownload
        success = CkMailMan::ckFetchOne(mailman,0,0,i,email)
        If success = 0
            Debug CkMailMan::ckLastErrorText(mailman)
            CkMailMan::ckDispose(mailman)
            CkEmail::ckDispose(email)
            ProcedureReturn
        EndIf

        Debug CkEmail::ckFrom(email)
        Debug CkEmail::ckSubject(email)
        Debug "----"
    Next

    ; Close the connection with the POP3 server, leaving the SSH tunnel open for subsequent POP3 connections.
    success = CkMailMan::ckPop3EndSession(mailman)
    If success = 0
        Debug CkMailMan::ckLastErrorText(mailman)
        CkMailMan::ckDispose(mailman)
        CkEmail::ckDispose(email)
        ProcedureReturn
    EndIf

    ; Try connecting to a different POP3 server through the same aleady setup SSH tunnel:
    ; Set the POP3 server's hostname
    CkMailMan::setCkMailHost(mailman, "mail.my-pop3-server2.com")

    ; Set the POP3 settings for your POP3 server:
    CkMailMan::setCkPopUsername(mailman, "pop3_login2")
    CkMailMan::setCkPopPassword(mailman, "pop3_password2")
    CkMailMan::setCkMailPort(mailman, 110)
    CkMailMan::setCkPopSsl(mailman, 0)

    success = CkMailMan::ckPop3BeginSession(mailman)
    If success = 0
        Debug CkMailMan::ckLastErrorText(mailman)
        CkMailMan::ckDispose(mailman)
        CkEmail::ckDispose(email)
        ProcedureReturn
    EndIf

    ; Review the LastErrorText to see that the connection was made via the SSH tunnel:
    Debug CkMailMan::ckLastErrorText(mailman)

    success = CkMailMan::ckPop3EndSession(mailman)
    If success = 0
        Debug CkMailMan::ckLastErrorText(mailman)
        CkMailMan::ckDispose(mailman)
        CkEmail::ckDispose(email)
        ProcedureReturn
    EndIf

    ; Close the SSH tunnel.
    success = CkMailMan::ckSshCloseTunnel(mailman)
    If success = 0
        Debug CkMailMan::ckLastErrorText(mailman)
        CkMailMan::ckDispose(mailman)
        CkEmail::ckDispose(email)
        ProcedureReturn
    EndIf



    CkMailMan::ckDispose(mailman)
    CkEmail::ckDispose(email)


    ProcedureReturn
EndProcedure