Tunnel a TCP connection by sending emails. It's so ridiculous, it had to be done.
You've woken up and found yourself in the middle of a desert with only
one tool: a satellite phone with access to a single email account. You
really, really want to check reddit. It's time
for smtp_to_tcp
.
WARNING: If you give it the chance, this code will kill you and everyone you care about.
Make sure to thoroughly test all of these settings before you embark on a journey into the desert, and note that the code is not designed for high-reliability needs. You've been warned.
While you can test-drive this software with only one computer, you'll
only be able to use it in the desert if you've set up at least
two computers. We'll call these computers the local
and the remote
machines.
-
The
local
machine lets you browse the internet using your email connection. The local machine needs access to an SMTP and IMAP server. -
The
remote
machine reads emails from the local machine and fetches the requested data from the internet. The remote machine should have unfettered access to the internet.
If you just want to test-drive the code, open up two different
terminals, one for the local
machine and one for the remote
machine.
(TODO: Picture illustrating this basic architecture)
Note: The code uses IMAP IDLE push notifications to lower the latency of the connection somewhat. This works well for Google's Gmail, but some email providers do not support this convenient protocol (cough Yahoo! cough). Use your [google fu] google-fu to check that your email supports IDLE push.
To start, first install python3
and pip3
on both the local
and
remote
machines. The code was tested with python 3.4, and your mileage
may vary with different versions.
You'll also want to install the packages listed in requirements.txt
.
The pip
package manager makes the process painless:
>> pip3 install -r requirements.txt
To start the server on the remote
machine, run the following code
>> python3 -m email_to_tcp.remote
You will be prompted with a series of questions about your email username and password. If you see a success message, you are good to go. This process needs to be running as long as you want to access the internet.
This service requires a bit more work. First, we start the local proxy server:
>> python3 -m email_to_tcp.local
You'll again be prompted with a series of questions. Make sure that
the email-to
address matches the email account that the remote
machine is monitoring.
Once you see the success message, it's time to tell your browser to use this special proxy server to access the internet. The following instructions apply to Firefox on a Mac.
- Install Firefox.
- Go to Preferences -> Advanced -> Network and click on
Settings...
- Click the radio button
Manual proxy configuration:
and set the HTTP Proxy to127.0.0.1
and Port to9999
. Leave the other boxes blank. - Click
OK
.
If everything works, you should be able to access the internet. Try hacker news or reddit.
NOTE Secure HTTPS connections will not be tunneled through your email.
Submit an issue, or email me at my_address
, where
my_address = '.'.join(['michael', 'b', 'mccoy', '@', 'gmail', 'com'])
-
Support HTTPS
-
Support IMAP servers that don't use IDLE push notifications
-
Multi-thread requests
-
Write meaningful tests