Choosing Source Address to Bind Socket to in IMAP Client

Chris Angelico rosuav at gmail.com
Tue Nov 20 17:35:14 EST 2012


On Wed, Nov 21, 2012 at 9:00 AM,  <brintoul at controlledthinking.com> wrote:
> On Tuesday, November 20, 2012 1:48:46 PM UTC-8, Chris Angelico wrote:
>> On Wed, Nov 21, 2012 at 8:14 AM,  <brintoul at controlledthinking.com> wrote:
>>
>> > I have a multihomed machine that I would like to run the Python imaplib's IMAP4 client on.  I would like to be able to specify which interface the underlying socket will bind to as its source address.  How could I best do this?
>>
>> You're referring to this function?
>>
>> http://docs.python.org/3.3/library/imaplib.html#imaplib.IMAP4
>>
>> The docs suggest that you can simply pass it a parameter to specify
>> the address to bind to. (Note that you bind to addresses, not
>> interfaces. Figuring out which interface has which address is a
>> separate issue.)
>>
>
> Unless I'm reading that wrong, that's specifying the address/host to connect to (the destination address) not the source address...

Ah, whoops! My bad. For some reason I was thinking that was creating a
server socket. Sorry!

Poking around in the source (imaplib.py) shows that it creates a socket here:

class IMAP4:
    def _create_socket(self):
        return socket.create_connection((self.host, self.port))

Adding a third parameter to create_connection would do what you want.
(Note that this is currently getting one parameter, not two.)

http://docs.python.org/3.3/library/socket.html#socket.create_connection

My recommendation: Subclass IMAP4 and override this one function.

ChrisA



More information about the Python-list mailing list