私は長い間Cyrus imapdを実行してきましたが、通常はうまくいきます。これで、初めてcyrdeliver(Cyrus imapdに含まれるMDA)を使用して、名前に空白文字を含むメールボックスのサブフォルダにメールを配信する必要がある状況に直面しました。私は数時間この問題を解決しようとしましたが、成功しませんでした。
テスト目的でユーザーを作成しton_pp
、そのユーザーの受信トレイに2つのサブフォルダを作成しました。これらのサブフォルダの名前はとHealth
ですHealth Reports
。 cyradm リストのアクセス権を使用して、両方のフォルダに同じ IMAP 権限があることを確認します。
localhost> lam user/ton_pp*
user/ton_pp:
ton_pp lrswipkxtecda
cyrus lrswipkxtecda
user/ton_pp/INBOX/Health:
cyrus lrswipkxtecda
ton_pp lrswipkxtecda
user/ton_pp/INBOX/Health Reports:
cyrus lrswipkxtecda
ton_pp lrswipkxtecda
次の内容でテストメッセージを作成しました。
root@morn ~ # cat testmessage
From: [email protected]
To: [email protected]
Subject: Test message
This is a test message.
私が走るとき
/usr/sbin/cyrdeliver -a cyrus -m INBOX/Health ton_pp < testmessage
テストメッセージはユーザーHealth
のサブフォルダにすぐに表示されます。これまではとてもよかったです。それが私が望んでいたものです。INBOX
ton_pp
Health Reports
ただし、(代わりに)サブフォルダーで同じ操作を実行しようとすると、Health
エラーメッセージが表示されます。
root@morn ~ # /usr/sbin/cyrdeliver -a cyrus -m "INBOX/Health Reports" ton_pp < testmessage
ton_pp+INBOX/Health Reports: Bad protocol
(シェルが分割されないようにするには、メールボックスフォルダ名を引用符で囲む必要があります。)
これにより、より徹底的に調査するようになりました。まずコードを勉強しました。mbox2サイラス、Cyrus imapd のcyrdeliver
メッセージmbox
形式を指定するために使用されます。コードは理解しやすいです。 151~154行は次のとおりです。
# Escape spaces in folder names for cyrdeliver. (Otherwise cyrdeliver
# will exit with the error "Bad protocol").
$subfolder =~ s/ /\\ /g;
$subfolder =~ s/,/\\,/g;
カンマの特別な意味はよくわかりませんが、フォルダ名にバックスラッシュを追加してスペース文字を引用するだけで十分であることは明らかです。これによりエラーメッセージが消えます。
root@morn ~ # /usr/sbin/cyrdeliver -a cyrus -m "INBOX/Health\ Reports" ton_pp < testmessage
root@morn ~ #
ただし、cyrdeliver
メッセージは自動的に削除されるか、私が見つからない場所に配置され、INBOX
サブフォルダにも表示されません。
その後、IMAPの調査を開始しました。RFC3501(特に、フォーマット構文とメールボックスの命名に関する章)、特殊文字(スペース文字など)を含むメールボックス名を二重引用符で囲む必要があるという印象を受けました。つまり、二重引用符はcyrdeliver
追加で渡さなければなりません。すると、エラーメッセージが再表示されます。
root@morn ~ # /usr/sbin/cyrdeliver -a cyrus -m '"INBOX/Health\ Reports"' ton_pp < testmessage
ton_pp+"INBOX/Health\ Reports": Bad protocol
root@morn ~ # /usr/sbin/cyrdeliver -a cyrus -m '"INBOX/Health Reports"' ton_pp < testmessage
ton_pp+"INBOX/Health\ Reports": Bad protocol
明らかに、空白文字を引用するもの(または引用しないもの)は何も変更しません。引用符で囲まれていないメールボックス/ユーザー名と引用符付きの「サブフォルダー」の名前を混在させることが問題になる可能性があると疑って、次のように構文的に異なりますが、意味的に同じ選択肢を試しましたman deliver
。
root@morn ~ # /usr/sbin/cyrdeliver -a cyrus -m "user/ton_pp/INBOX/Health Reports" < testmessage
+user/ton_pp/INBOX/Health Reports: Bad protocol
root@morn ~ # /usr/sbin/cyrdeliver -a cyrus -m "user/ton_pp/INBOX/Health\ Reports" < testmessage
+user/ton_pp/INBOX/Health\ Reports: Mailbox does not exist
root@morn ~ # /usr/sbin/cyrdeliver -a cyrus -m '"user/ton_pp/INBOX/Health\ Reports"' < testmessage
+"user/ton_pp/INBOX/Health\ Reports": Bad protocol
root@morn ~ # /usr/sbin/cyrdeliver -a cyrus -m '"user/ton_pp/INBOX/Health Reports"' < testmessage
+"user/ton_pp/INBOX/Health Reports": Bad protocol
だからこれは何も改善しません。
私も一つ見つけたCyrus Manウェブサイトの一部情報そして、@
このFAQで文字を扱うのと同じ方法で空白文字を扱うようにしてください。つまり、\\\
上記のテストを繰り返さずに使用しました\
。繰り返しますが、この方法は機能せず、「メールボックスが存在しません」または「プロトコルエラー」エラーが発生します。
今私は完全に閉じ込められています。誰でも私を助けることができますか?サブフォルダ名にスペースが含まれている場合にサブフォルダにcyrdeliver
メッセージをインポートするにはどうすればよいですか?INBOX