5

私はPythonが初めてで、ソケット通信を介して電子メール送信スクリプトを作成しようとしていますが、dkimpy libで署名できないようです。Web でいくつかの例を試しましたが、dkim.sign を実行するとすべて同じエラーが返されました。

File "C:\Python34\lib\re.py", line 196, in split return _compile(pattern,flags).split(string, maxsplit)
TypeError: expected string or buffer

私が知る限り、dkim.sign 関数の最初の変数は文字列でなければならないので、念のため readlines() と .as_string() を試しました。メッセージを確認したところ、RFC822 に準拠しているようです。しかし、誰かがそれが問題かもしれないと思うかどうかを再確認します. dkim.sign がなくても完全に機能します (SPF/DKIM などのセキュリティを除く)

これは私が使用しているコードのスニペットです:

f=open('mail.htm','r') 
text=MIMEText(f.read(),'html') 
headers = Parser().parse(open('mail.htm', 'r')) 
sender=headers['From'] 
receiver=headers['To'] 
subj=headers['Subject'] 
f.close() 
private_key = open('default.pem').read() 
headers = ['To', 'From', 'Subject'] 
sig = dkim.sign(text, 'default', '<mydomain.here>', private_key, include_headers=headers)

解析されたヘッダーは、ソケット送信スクリプトへの入力としても使用されます。私はテスト目的で dkim キーを持っていますが、その点にさえ達していないと思います。

洞察はありますか?

編集: わかりました、dkimpy lib の dkim.rfc822_parse を使用して文字列を (署名する代わりに) 解析しようとしたところ、次のエラーが発生しました。

return _compile(pattern, flags).split(string, maxsplit)
TypeError: can't use a bytes pattern on a string-like object

私はこの書き込みを読んでいるのですか、それともコードが文字列を期待しているように見えますが、パターンはバイト単位ですか?

修正済み: 奇妙なことに、private_key をチェックしようとは思いませんでした。Win で手動でキーを作成したので、知らないうちに、Windows は vim や nano でさえ見ることができない目に見えない改行文字を追加しました。MCEdit で削除した後、プログラムは問題なく動作しました。助けてくれてありがとう :)

4

2 に答える 2

4

私の記憶が正しければ、dkim.sign は完全なメッセージ ソースをパラメーターとして想定していますが、MIMEText オブジェクトを渡しています。

代わりに text.as_string() を渡してみてください

sig = dkim.sign(text.as_string(), .... )
于 2014-04-03T09:49:50.717 に答える