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

IMAP SSH Tunneling (Port Forwarding)

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

Chilkat Lua Downloads

Lua

    -- In the following call to loadlib, change the path (./chilkat.dll) to the relative or absolute directory where the chilkat.dll, chilkat.so, or chilkat.dylib is located.
    chilkat = assert(package.loadlib("./chilkat.dll", "luaopen_chilkat"))()
    print(chilkat._VERSION)

    local success = false

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

    local imap = chilkat.newImap{}

    --  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).
    local sshHostname = "www.mysshserver.com"
    local sshPort = 22

    --  Connect to an SSH server and establish the SSH tunnel:
    success = imap:SshOpenTunnel(sshHostname,sshPort)
    if success == false then
        print(imap:LastErrorText())

    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.
    success = imap:SshAuthenticatePw("mySshLogin","mySshPassword")
    if success == false then
        print(imap:LastErrorText())

    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.
    imap:setSsl(true)
    imap:setPort(993)
    success = imap:Connect("imap.my-imap-server.com")
    if success == false then
        print(imap:LastErrorText())

    end

    --  Authenticate with the IMAP server via the SSH tunnel.
    success = imap:Login("myLogin","myPassword")
    if success == false then
        print(imap:LastErrorText())

    end

    --  Select an IMAP mailbox
    success = imap:SelectMailbox("Inbox")
    if success == false then
        print(imap:LastErrorText())

    end

    --  How many messages in Inbox?
    local msgCount = imap:NumMessages()
    if msgCount == 0 then
        print("No messages found.")

    end

    local upperBound = 10
    if msgCount < upperBound then
        upperBound = msgCount
    end

    --  Download up to the 1st 10 messages.
    local email = chilkat.newEmail{}

    local bUid = false
    for i = 1, upperBound do

        success = imap:FetchEmail(false,i,bUid,email)
        if success == false then
            print(imap:LastErrorText())

        end

        print(email:From())
        print(email:Subject())
        print("----")
    end

    --  Disconnect from the IMAP server.
    --  The SSH tunnel remains open.
    success = imap:Disconnect()
    if success == false then
        print(imap:LastErrorText())

    end

    --  It is possible to re-use the existing SSH tunnel for the next connection:
    success = imap:Connect("imap.my-imap-server2.com")
    if success == false then
        print(imap:LastErrorText())

    end

    --  Review the LastErrorText to see that the connection was made via the SSH tunnel:
    print(imap:LastErrorText())

    success = imap:Disconnect()
    if success == false then
        print(imap:LastErrorText())

    end

    --  Finally, close the SSH tunnel.
    success = imap:SshCloseTunnel()
    if success == false then
        print(imap:LastErrorText())

    end

    print("IMAP SSH tunneling example completed.")