IMAP 経由で GMail メール ボックスへのプロキシを作成するPythonスクリプトがあります。このプロキシは、リクエストに認証トークンを追加します。エンド ユーザーはこのスクリプトを実行し、その後何らかのツールを使用してすべてのユーザーの電子メールを電子メール ボックスからダウンロードします。もちろん、プロキシとプロキシを接続するこのツールは、すべての認証を魔法にします。
私の現在のソリューションは、小さなメールボックスでのみ機能します。大きなメール ボックスからすべてのメールをダウンロードしようとすると、認証エラーが発生します。認証エラーはトークンの有効期限とリンクしています。認証トークンは 1 時間のみ有効です。その後、サーバーはエラーを返し、接続を閉じます。
私はこのスクリプトを書きませんでした。誰かから受け取ったので、このバグを修正する必要があります。このスクリプトでは、Twisted エンジンを使用します( Twisted コード例)。
ソースコードをいくつか示します。以下に、Proxy クラスの 2 つの主要なメソッドを示します。
def dataReceived(self, data):
if OPTIONS.verbose:
print "> " + data
#send raw data
Proxy.dataReceived(self,data)
def lineReceived(self, line):
if self.logged_in:
self.setRawMode()
self.peer.setRawMode()
Proxy.lineReceived(self,line)
else:
login_match = self.factory.login_re.match(line)
if login_match != None:
#Create token and send it
consumer = OAuthEntity(self.domain, self.secret)
xoauth_string = GenerateXOauthString(consumer, self.email_address)
xoauth_b64 = base64.b64encode(xoauth_string)
line = login_match.groups()[0] + " AUTHENTICATE XOAUTH " + xoauth_b64
Proxy.lineReceived(self,line)
else:
Proxy.lineReceived(self,line)
メソッドでわかるように、lineReceived
トークンを作成し、クライアント ツールからログイン リクエストを受信したときに送信します。これで、スクリプトはトークンを 1 回だけ作成します。このスクリプトを変更し、dataReceived
1 時間ごとにメソッドでトークンを再作成することにしました。以下に私の変更を示します。
def dataReceived(self, data):
if OPTIONS.verbose:
print "> " + data
if anHourPassedFromLastRecreation():
consumer = OAuthEntity(self.domain, self.secret)
xoauth_string = GenerateXOauthString(consumer, self.email_address)
xoauth_b64 = base64.b64encode(xoauth_string)
line = self.prefix + " AUTHENTICATE XOAUTH " + xoauth_b64
Proxy.lineReceived(self,line)
Proxy.dataReceived(self,data)
else:
Proxy.dataReceived(self,data)
ご覧のとおり、dataReceived
メソッドでトークンを再作成し、データの前にサーバーに送信しようとしています。少し素朴かもしれませんが、トークンを再作成して将来のリクエストで使用する方法は他にありません。
残念ながら、うまくいきません。プロキシを作成する方法、またはトークンを再作成する方法と、それを将来のリクエストにリンクする方法についてアドバイスをいただけますか?
役立つリンク:
- IMAP プロトコル交換。
-デスクトップ クライアント用の Gmail IMAP OAuth。