More .NET components

Proxies and custom sockets

SOCKS4/SOCKS5 proxy servers #

To connect through SOCKET4, SOCKET4a or SOCKS5 proxy servers, set Smtp.Proxy, Imap.Proxy, Pop3.Proxy or Ews.Proxy properties before calling the Connect method. Use ProxyType property to specify the proxy type:

CSharp

// create client instance (Rebex.Net.Smtp/Imap/Pop3/Ews)
// ...

// use SOCKS5 proxy
client.Proxy.ProxyType = ProxyType.Socks5;
client.Proxy.Host = proxyHost;
client.Proxy.Port = proxyPort;
client.Proxy.UserName = proxyUserName;

// connect to the server
client.Connect(hostname);

VisualBasic

' create client instance (Rebex.Net.Smtp/Imap/Pop3/Ews)
' ...

' use SOCKS5 proxy
client.Proxy.ProxyType = ProxyType.Socks5
client.Proxy.Host = proxyHost
client.Proxy.Port = proxyPort
client.Proxy.UserName = proxyUserName

' connect to the server
client.Connect(hostname)

HTTP CONNECT proxy servers #

To connect through a HTTP proxy server, set Smtp.Proxy, Imap.Proxy, Pop3.Proxy or Ews.Proxy properties before calling the Connect method. Make sure the proxy server supports HTTP CONNECT method, and set the ProxyType property to HttpConnect:

CSharp

// create client instance (Rebex.Net.Smtp/Imap/Pop3/Ews)
// ...

// use HTTP CONNECT proxy
client.Proxy.ProxyType = ProxyType.HttpConnect;
client.Proxy.Host = proxyHost;
client.Proxy.Port = proxyPort;
client.Proxy.UserName = proxyUserName;
client.Proxy.Password = proxyPassword;

// connect to the server
client.Connect(hostname);

VisualBasic

' create client instance (Rebex.Net.Smtp/Imap/Pop3/Ews)
' ...

' use HTTP CONNECT proxy
client.Proxy.ProxyType = ProxyType.HttpConnect
client.Proxy.Host = proxyHost
client.Proxy.Port = proxyPort
client.Proxy.UserName = proxyUserName
client.Proxy.Password = proxyPassword

' connect to the server
client.Connect(hostname)

Proxies with single sign-on #

Some HTTP CONNECT proxies support NTLM authentication with single sign-on. To take advantage of this feature, set the AuthenticationMethod property to ProxyAuthentication.Ntlm.

Learn how to use single sign-on to authenticate to an mail server.

CSharp

// create client instance (Rebex.Net.Smtp/Imap/Pop3/Ews)
// ...

// use HTTP CONNECT proxy
client.Proxy.ProxyType = ProxyType.HttpConnect;
client.Proxy.Host = proxyHost;
client.Proxy.Port = proxyPort;

// use single sign-on
client.Proxy.AuthenticationMethod = ProxyAuthentication.Ntlm;

// connect to the server
client.Connect(hostname);

VisualBasic

' create client instance (Rebex.Net.Smtp/Imap/Pop3/Ews)
' ...

' use HTTP CONNECT proxy
client.Proxy.ProxyType = ProxyType.HttpConnect
client.Proxy.Host = proxyHost
client.Proxy.Port = proxyPort

' use single sign-on
client.Proxy.AuthenticationMethod = ProxyAuthentication.Ntlm

' connect to the server
client.Connect(hostname)

SSH server as proxy #

It's possible to tunnel SMTP, IMAP, POP3 or EWS sessions through an SSH server, essentially using it as a proxy server. See SSH Tunneling for more information and sample code.

Custom transport layer - ISocket #

Rebex components make it possible to implement a custom transport layer, giving you full control over the network communication. All you need to do is implement a custom ISocketFactory and ISocket interfaces and instruct the Imap, Smtp, Pop3 or Ews object to use them.

CSharp

// create client instance (Rebex.Net.Smtp/Imap/Pop3/Ews)
// ...

// initialize factory
SimpleSocketFactory factory = new SimpleSocketFactory();
factory.SocketConnecting += factory_SocketConnecting;

// use the factory
client.SetSocketFactory(factory);

// connect to the server
client.Connect(hostname);

VisualBasic

' create client instance (Rebex.Net.Smtp/Imap/Pop3/Ews)
' ...

' initialize factory
Dim factory As New SimpleSocketFactory()
AddHandler factory.SocketConnecting, AddressOf factory_SocketConnecting

' use the factory
client.SetSocketFactory(factory)

' connect to the server
client.Connect(hostname)

Custom transport layer (ISocket/ISocketFactory) implementation

CSharp

/// <summary>
/// Exposes SocketConnected event which is raised
/// when a socket successfully connects to a remote end.
/// </summary>
public class SimpleSocketFactory : ISocketFactory
{
    /// <summary>
    /// Occurs when a socket successfully connects to a remote end.
    /// </summary>
    public event EventHandler SocketConnecting;

    // creates custom ISocket implementation
    ISocket ISocketFactory.CreateSocket()
    {
        return new SimpleSocket(this);
    }

    // raises event
    private void OnSocketConnecting()
    {
        EventHandler h = SocketConnecting;
        if (h != null)
            h(this, EventArgs.Empty);
    }

    // simple ISocket implementation
    // (core functionality is taken from ProxySocket)
    private class SimpleSocket : ProxySocket, ISocket
    {
        // creator object
        private readonly SimpleSocketFactory _factory;

        public SimpleSocket(SimpleSocketFactory factory)
        {
            _factory = factory;
        }

        // connects to a server and raises SocketConnected event
        void ISocket.Connect(string serverName, int serverPort)
        {
            _factory.OnSocketConnecting();
            base.Connect(serverName, serverPort);
        }

        // connects to a server and raises SocketConnected event
        void ISocket.Connect(EndPoint endpoint)
        {
            _factory.OnSocketConnecting();
            base.Connect(endpoint);
        }
    }
}

VisualBasic

''' <summary>
''' Exposes SocketConnected event which is raised
''' when a socket successfully connects to a remote end.
''' </summary>
Public Class SimpleSocketFactory
    Implements ISocketFactory
    ''' <summary>
    ''' Occurs when a socket successfully connects to a remote end.
    ''' </summary>
    Public Event SocketConnecting As EventHandler

    ' creates custom ISocket implementation
    Private Function ISocketFactory_CreateSocket() As ISocket Implements ISocketFactory.CreateSocket
        Return New SimpleSocket(Me)
    End Function

    ' raises event
    Private Sub OnSocketConnecting()
        RaiseEvent SocketConnecting(Me, EventArgs.Empty)
    End Sub

    ' simple ISocket implementation
    ' (core functionality is taken from ProxySocket)
    Private Class SimpleSocket
        Inherits ProxySocket
        Implements ISocket
        ' creator object
        Private ReadOnly _factory As SimpleSocketFactory

        Public Sub New(factory As SimpleSocketFactory)
            _factory = factory
        End Sub

        ' connects to a server and raises SocketConnected event
        Private Sub ISocket_Connect(serverName As String, serverPort As Integer) Implements ISocket.Connect
            _factory.OnSocketConnecting()
            MyBase.Connect(serverName, serverPort)
        End Sub

        ' connects to a server and raises SocketConnected event
        Private Sub ISocket_Connect(endpoint As EndPoint) Implements ISocket.Connect
            _factory.OnSocketConnecting()
            MyBase.Connect(endpoint)
        End Sub

    End Class
End Class

Please note that custom communication layer and proxy support are mutually exclusive - it's not possible to use both at the same time.