IMAPSync。 サーバー間でメールを転送する

この記事では、すばらしいIMAPSyncユーティリティを使用して、異なるサーバー間でメールを転送した経験を共有したいと思います。



-githubソースからIMAPSync.exeを取得する(Windows用のコンパイル)。

-サーバー間でIMAPを介してメールを転送します。



私の場合、タスクはIDECOサーバーからpdd.yandex.ruサーバーにメールを転送することでした。 Yandexツールを使用してこれを行うことに成功しませんでした。ドメインのインポートツールとボックスのプロパティのメールコレクションツールは、常に1つのエラー-間違ったパスワードを与えました。 テクニカルサポートは1日に1回応答しましたが、問題は解決しませんでした。 パスワードの変更、待機、二要素認証の無効化などの推奨事項がありました。 一般に、残念ながら標準の購読は解除されます。 テストボックスのすべてを完全にインポートしたbiz.mail.ruを使用したくありませんでした。 私はYandexでより多くの経験があり、Yandexからのメールの仕事に似ているため、メールを転送する別の方法を見つけることが決定されました。 それらはIMAPSyncになりました。



目的のサーバーで、必要なユーザー名とパスワードを含む空の(またはそうではない)ボックスを作成したことを条件に、開始します。



WindowsソースからIMAPSync.exeをコンパイルする



  1. コンパイル用のツールの準備:

    たとえば、「D:\ IMAPSync \」というパスを使用します



    IMAPSync v1.678の例を使用して、 githubからIMAPSyncの最新バージョンをダウンロードします

    Dのアーカイブを解凍します:\ IMAPSync \ imapsync-1.678 \ *。*

    imapsyncファイルをD:\ IMAPSync \ imapsync-1.678 \からD:\ IMAPSync \ imapsync-1.678 \ W \にコピーします



    Strawberry-perl 、たとえばStrawberry-perl-5.22.2.1-32bit-portable.zipのバージョンをダウンロードします

    さまざまなバージョンと問題の詳細をご覧ください。
    パッケージの正常なインストールとIMAPSyncのコンパイルは、バージョンで検証されます。

    strawberry-perl-5.20.3.3-32bit-portable strawberry-perl-5.22.1.3-32bit-portable strawberry-perl-5.22.2.1-32bit-portable
          
          





    バージョンで検出されたエラー:

     strawberry-perl-5.24.0.1-32bit-portable (  ppm install Unicode::String)
          
          



    Dのアーカイブを解凍します:\ IMAPSync \ strawberry-perl-5.22.2.1-32bit-portable \ *。*

    実行D:\ IMAPSync \ strawberry-perl-5.22.2.1-32bit-portable \ portableshell.bat



    コマンドラインが表示されます(perl環境変数は既にここで構成されています)。

     ppm install Unicode::String D:\IMAPSync\imapsync-1.678\W\install_modules.bat
          
          





    この時点で、ファイアウォールはアプリケーション「D:\ IMAPSync \ strawberry-perl-5.22.2.1-32bit-portable \ perl \ bin \ perl.exe」へのアクセスを許可するよう要求する場合があります。

    モジュールを正常にインストールするには、ネットワークアクセスを有効にする必要があります。



    視覚的なエラー監視のためにコマンドを再度実行します

     D:\IMAPSync\imapsync-1.678\W\install_modules.bat
          
          





    すべてのモジュールがインストールされていること、エラーがないことを確認します。コンパイルに進むことができます。



  2. コンパイルを開始します。

     D:\IMAPSync\imapsync-1.678\W\build_exe.bat
          
          





    出力では、imapsync.exeを取得します。同じコマンドプロンプトウィンドウで実行し、ヘルプが表示されるかどうかを確認します。

    結果。 すべてのパラメーターのヘルプ
      Several options are mandatory. str means string int means integer reg means regular expression cmd means command --dry : Makes imapsync doing nothing, just print what would be done without --dry. --host1 str : Source or "from" imap server. Mandatory. --port1 int : Port to connect on host1. Default is 143, 993 if --ssl1 --user1 str : User to login on host1. Mandatory. --showpasswords : Shows passwords on output instead of "MASKED". Useful to restart a complete run by just reading the log. --password1 str : Password for the user1. --host2 str : "destination" imap server. Mandatory. --port2 int : Port to connect on host2. Default is 143, 993 if --ssl2 --user2 str : User to login on host2. Mandatory. --password2 str : Password for the user2. --passfile1 str : Password file for the user1. It must contain the password on the first line. This option avoids to show the password on the command line like --password1 does. --passfile2 str : Password file for the user2. Contains the password. --ssl1 : Use a SSL connection on host1. --ssl2 : Use a SSL connection on host2. --tls1 : Use a TLS connection on host1. --tls2 : Use a TLS connection on host2. --debugssl int : SSL debug mode from 0 to 4. --timeout1 int : Connection timeout in seconds for host1. Default is 120 and 0 means no timeout at all. --timeout2 int : Connection timeout in seconds for host2. Default is 120 and 0 means no timeout at all. --authmech1 str : Auth mechanism to use with host1: PLAIN, LOGIN, CRAM-MD5 etc. Use UPPERCASE. --authmech2 str : Auth mechanism to use with host2. See --authmech1 --authuser1 str : User to auth with on host1 (admin user). Avoid using --authmech1 SOMETHING with --authuser1. --authuser2 str : User to auth with on host2 (admin user). --proxyauth1 : Use proxyauth on host1. Requires --authuser1. Required by Sun/iPlanet/Netscape IMAP servers to be able to use an administrative user. --proxyauth2 : Use proxyauth on host2. Requires --authuser2. --authmd51 : Use MD5 authentification for host1. --authmd52 : Use MD5 authentification for host2. --domain1 str : Domain on host1 (NTLM authentication). --domain2 str : Domain on host2 (NTLM authentication). --folder str : Sync this folder. --folder str : and this one, etc. --folderrec str : Sync this folder recursively. --folderrec str : and this one, etc. --folderfirst str : Sync this folder first. --folderfirst "Work" --folderfirst str : then this one, etc. --folderlast str : Sync this folder last. --folderlast "[Gmail]/All Mail" --folderlast str : then this one, etc. --nomixfolders : Do not merge folders when host1 is case sensitive while host2 is not (like Exchange). Only the first similar folder is synced (ex: Sent SENT sent -> Sent). --skipemptyfolders : Empty host1 folders are not created on host2. --include reg : Sync folders matching this regular expression --include reg : or this one, etc. in case both --include --exclude options are use, include is done before. --exclude reg : Skips folders matching this regular expression Several folders to avoid: --exclude 'fold1|fold2|f3' skips fold1, fold2 and f3. --exclude reg : or this one, etc. --subfolder2 str : Move whole host1 folders hierarchy under this host2 folder str . It does it by adding two --regextrans2 options before all others. Add --debug to see what's really going on. --automap : guesses folders mapping, for folders like "Sent", "Junk", "Drafts", "All", "Archive", "Flagged". --f1f2 str1=str2 : Force folder str1 to be synced to str2, --f1f2 overrides --automap and --regextrans2. --regextrans2 reg : Apply the whole regex to each destination folders. --regextrans2 reg : and this one. etc. When you play with the --regextrans2 option, first add also the safe options --dry --justfolders Then, when happy, remove --dry, remove --justfolders. Have in mind that --regextrans2 is applied after prefix and separator inversion. For examples see http://imapsync.lamiral.info/FAQ.d/FAQ.Folders_Mapping.txt --tmpdir str : Where to store temporary files and subdirectories. Will be created if it doesn't exist. Default is system specific, Unix is /tmp but it's often small and deleted at reboot. --tmpdir /var/tmp should be better. --pidfile str : The file where imapsync pid is written. --pidfilelocking : Abort if pidfile already exists. Usefull to avoid concurrent transfers on the same mailbox. --nolog : Turn off logging on file --logfile str : Change the default log filename (can be dirname/filename). --logdir str : Change the default log directory. Default is LOG_imapsync --prefix1 str : Remove prefix to all destination folders (usually INBOX. or INBOX/ or an empty string "") you have to use --prefix1 if host1 imap server does not have NAMESPACE capability, so imapsync suggests to use it. All other cases are bad. --prefix2 str : Add prefix to all host2 folders. See --prefix1 --sep1 str : Host1 separator in case NAMESPACE is not supported. --sep2 str : Host2 separator in case NAMESPACE is not supported. --skipmess reg : Skips messages maching the regex. Example: 'm/[\x80-ff]/' # to avoid 8bits messages. --skipmess is applied before --regexmess --skipmess reg : or this one, etc. --pipemess cmd : Apply this cmd command to each message content before the copy. --pipemess cmd : and this one, etc. --disarmreadreceipts : Disarms read receipts (host2 Exchange issue) --regexmess reg : Apply the whole regex to each message before transfer. Example: 's/\000/ /g' # to replace null by space. --regexmess reg : and this one, etc. --regexflag reg : Apply the whole regex to each flags list. Example: 's/"Junk"//g' # to remove "Junk" flag. --regexflag reg : and this one, etc. --delete : Deletes messages on host1 server after a successful transfer. Option --delete has the following behavior: it marks messages as deleted with the IMAP flag \Deleted, then messages are really deleted with an EXPUNGE IMAP command. --delete2 : Delete messages in host2 that are not in host1 server. Useful for backup or pre-sync. --delete2duplicates : Delete messages in host2 that are duplicates. Works only without --useuid since duplicates are detected with an header part of each message. --delete2folders : Delete folders in host2 that are not in host1 server. For safety, first try it like this (it is safe): --delete2folders --dry --justfolders --nofoldersizes --delete2foldersonly reg : Deleted only folders matching regex. Example: --delete2foldersonly "/^Junk$|^INBOX.Junk$/" --delete2foldersbutnot reg : Do not delete folders matching regex. Example: --delete2foldersbutnot "/Tasks$|Contacts$|Foo$/" --noexpunge : Do not expunge messages on host1. Expunge really deletes messages marked deleted. Expunge is made at the beginning, on host1 only. Newly transferred messages are also expunged if option --delete is given. No expunge is done on host2 account (unless --expunge2) --expunge1 : Expunge messages on host1 after messages transfer. --expunge2 : Expunge messages on host2 after messages transfer. --uidexpunge2 : uidexpunge messages on the host2 account that are not on the host1 account, requires --delete2 --nomixfolders : Avoid merging folders that are considered different on host1 but the same on destination host2 because of case sensitivities and insensitivities. --syncinternaldates : Sets the internal dates on host2 same as host1. Turned on by default. Internal date is the date a message arrived on a host (mtime). --idatefromheader : Sets the internal dates on host2 same as the "Date:" headers. --maxsize int : Skip messages larger (or equal) than int bytes --minsize int : Skip messages smaller (or equal) than int bytes --maxage int : Skip messages older than int days. final stats (skipped) don't count older messages see also --minage --minage int : Skip messages newer than int days. final stats (skipped) don't count newer messages You can do (+ are the messages selected): past|----maxage+++++++++++++++>now past|+++++++++++++++minage---->now past|----maxage+++++minage---->now (intersection) past|++++minage-----maxage++++>now (union) --search str : Selects only messages returned by this IMAP SEARCH command. Applied on both sides. --search1 str : Same as --search for selecting host1 messages only. --search2 str : Same as --search for selecting host2 messages only. --search CRIT equals --search1 CRIT --search2 CRIT --exitwhenover int : Stop syncing when total bytes transferred reached. Gmail per day allows 2500000000 = 2.5 GB downloaded from Gmail as host2 500000000 = 500 MB uploaded to Gmail as host1. --maxlinelength int : skip messages with a line length longer than int bytes. RFC 2822 says it must be no more than 1000 bytes. --useheader str : Use this header to compare messages on both sides. Ex: Message-ID or Subject or Date. --useheader str and this one, etc. --subscribed : Transfers subscribed folders. --subscribe : Subscribe to the folders transferred on the host2 that are subscribed on host1. On by default. --subscribeall : Subscribe to the folders transferred on the host2 even if they are not subscribed on host1. --nofoldersizes : Do not calculate the size of each folder in bytes and message counts. Default is to calculate them. --nofoldersizesatend: Do not calculate the size of each folder in bytes and message counts at the end. Default is on. --justfoldersizes : Exit after having printed the folder sizes. --syncacls : Synchronises acls (Access Control Lists). --nosyncacls : Does not synchronize acls. This is the default. Acls in IMAP are not standardized, be careful. --usecache : Use cache to speedup. --nousecache : Do not use cache. Caveat: --useuid --nousecache creates duplicates on multiple runs. --useuid : Use uid instead of header as a criterium to recognize messages. Option --usecache is then implied unless --nousecache is used. --debug : Debug mode. --debugfolders : Debug mode for the folders part only. --debugcontent : Debug content of the messages transfered. Huge ouput. --debugflags : Debug mode for flags. --debugimap1 : IMAP debug mode for host1. Very verbose. --debugimap2 : IMAP debug mode for host2. Very verbose. --debugimap : IMAP debug mode for host1 and host2. --debugmemory : Debug mode showing memory consumption after each copy. --errorsmax int : Exit when int number of errors is reached. Default is 50. --tests : Run local non-regression tests. Exit code 0 means all ok. --testslive : Run a live test with test1.lamiral.info imap server. Useful to check the basics. Needs internet connexion. --version : Print only software version. --noreleasecheck : Do not check for new imapsync release (a http request). --releasecheck : Check for new imapsync release (a http request). --noid : Do not send/receive ID command to imap servers. --justconnect : Just connect to both servers and print useful information. Need only --host1 and --host2 options. --justlogin : Just login to both host1 and host2 with users credentials, then exit. --justfolders : Do only things about folders (ignore messages). --help : print this help. Example: to synchronize imap account "test1" on "test1.lamiral.info" to imap account "test2" on "test2.lamiral.info" with test1 password "secret1" and test2 password "secret2" D:\IMAPSync\imapsync-imapsync-1.678\W\imapsync.exe ^ --host1 test1.lamiral.info --user1 test1 --password1 secret1 ^ --host2 test2.lamiral.info --user2 test2 --password2 secret2 Here is a [MSWin32] system (Windows NT Fronik 6.2 Build 9200 x86) With perl 5.22.2 Mail::IMAPClient 3.38 $Id: imapsync,v 1.678 2016/01/21 19:47:02 gilles Exp gilles $ New imapsync release 1.684 available Homepage: http://imapsync.lamiral.info/
          
          





    もしそうなら、エラーはありません、そして、アプリケーションは準備ができています、あなたはそれを使うことができます。



サーバー間でIMAPメールを転送する



  1. アプリケーション\ W \ imapsync.exeを\ examples \ imapsync.exeにコピーします。 \ examplesフォルダには、いくつかのファイルがあります。

    • imapsync_example.bat -1つのメールボックスの移行設定とメール移行のテスト
    • sync_loop_windows.batおよびfile.txt-メールボックスの配列のメール転送


  2. 1つのボックスの準備、テスト、転送:

    ファイルimapsync_example.batを開き、詳細とパラメーターを指定します。

     .\imapsync.exe ^ --host1 mx.example.ru --user1 user@example.ru --password1 "Pass123" ^ --host2 imap.yandex.ru --user2 user@example.biz --password2 "Pass123" ^ --ssl1 --ssl2 --sslargs1 SSL_verify_mode=0 --sslargs2 SSL_verify_mode=1 --skipheader "^(?!Message-Id)" --automap ^ --regextrans2 "s/^INBOX\.(.+)/$1/" --justfolders --dry @PAUSE
          
          



    パラメーターの簡単な説明
    ソースサーバー、ボックスログイン、ボックスパスワード:

    --host1 mx.example.ru --user1 user --password1 "Pass123"







    宛先サーバー、ボックスログイン、ボックスパスワード:

    --host2 imap.yandex.ru --user2 user@example.biz --password2 "Pass123"







    ソースおよび宛先サーバーにSSLを使用する:

    --ssl1 --ssl2







    SSL(--ssl1 --ssl2)が有効になっている場合は、すぐに証明書検証モードを構成することをお勧めします。

    証明書を受け入れる(= 0)、または認証する(= 1)。

    --sslargs1 SSL_verify_mode=0 --sslargs2 SSL_verify_mode=1







    これらの設定を指定しないと、いくつかの文字を転送するときにエラーが表示されるか、この種のエラーが表示されることがあります。

    Use of uninitialized value $sockargs[9] in join or string at Mail/IMAPClient.pm line 360.







    「Message-Id」を含むものを除き、メッセージ内のすべてのヘッダーを無視します。 このパラメーターは、異なるサーバー上の同じメッセージに対して異なるヘッダーが生成される場合に役立ちます(私の場合は異なるヘッダーです)。 各文字のYandexは、1行追加されました。これは、以降の各メール転送でその文字が複製されたためです。 「Message-Id」でヘッダーをフィルタリングすると、メールが転送されるたびに、新しい文字のみがコピーされます。

    --skipheader "^(?!Message-Id)"







    移行元サーバー上のフォルダーを移行先サーバー上のフォルダーに自動的に検出してバインドします。 それ自体が名前を比較してバインディングを作成し、名前にキリル文字を含むフォルダーをサポートします。 受信ボックス->受信ボックス。 送信済み->送信済み...

    --automap







    すべての宛先フォルダーの名前INBOXから削除します。 私の場合、IDECOはINBOXで始まるすべてのフォルダーに名前を付けます(INBOX.Sent、INBOX.Draftsなど)。 ユーザーが手動で作成したフォルダーの複製先サーバーに重複した名前を作成しないようにします。 ここでは、サーバーに依存していることに注意してください。

    --regextrans2 "s/^INBOX\.(.+)/$1/"







    フォルダーのみで操作を実行します。 レターは移行されません。

    --justfolders







    実行のエミュレーション。 作業計画全体が表示されますが、物理的に転送されるものはありません。 テストに便利です。

    --dry









    説明を読んだ後、フォルダーのリンク方法を開始して確認します。 すべてが成功した場合-素晴らしい。 そうでない場合は、手動バインディングオプションを使用できます。 たとえば、以下のパラメーターは、「INBOX.Junk」および「INBOX.Spam」フォルダーと「削除済みアイテム」フォルダーのバインディングを作成します。

     --f1f2 "INBOX.Junk"="&BCMENAQwBDsENQQ9BD0ESwQ1-" --f1f2 "INBOX.Spam"="&BCMENAQwBDsENQQ9BD0ESwQ1-"
          
          





    ここでエンコーディングに直面しています。 キリル文字のフォルダーを呼び出す方法を決定するには、各プログラムの実行後に作成されるログ( LOG_imapsync \ *。Txt)を調べる必要があります。

     Folders mapping from --automap feature (use --f1f2 to override any mapping): [INBOX.Junk] -> [&BCEEPwQwBDw-] = [] [INBOX.Spam] -> [&BCEEPwQwBDw-] = [] [INBOX.Sent] -> [&BB4EQgQ,BEAEMAQyBDsENQQ9BD0ESwQ1-] = [] [INBOX.Drafts] -> [&BCcENQRABD0EPgQyBDgEOgQ4-] = [] [INBOX.Trash] -> [&BCMENAQwBDsENQQ9BD0ESwQ1-] = []
          
          





    さて、ここではすべてが明確で理解しやすいものであり、プログラム自体は必要に応じて手動バインディングを作成することを提案します。

    実行後、すべてが正常に見えることを確認して、パラメーターを削除します。

     --dry
          
          





    移行先サーバーでフォルダーがどのように作成されたかを確認します。 これまでのところ、フォルダのみをチェックしています。 必要に応じて、バインディングを修正します。 すべてが私たちが必要とするように見えるなら、罰金、手紙に行きます。 パラメーターを削除します。

     --justfolders
          
          





    フォルダーがどのように作成され、レターが宛先サーバーに送信されるかを開始して確認します。 また、必要に応じて必要な変更を行います。 1つのボックスのみを移動する必要がある場合は、これで完了です。 さらに転送する必要がある場合は、次の項目に進みます。



  3. 複数のメールボックスのメールを転送します。

    file.txtファイルを開きます。 このファイルには、適切な説明と作業を示す実際の例が含まれています。 困難の充填で発生するべきではありません。 その中のすべての例についてコメントし、以下にデータを記述します。 転送するすべてのボックスをリストします。

     mx.example.ru;user;Pass123;imap.yandex.ru;user@example.biz;Pass123 mx.example.ru;user2;Pass321;imap.yandex.ru;user2@example.biz;Pass321
          
          





    sync_loop_windows.batファイルを編集用に開き、 次の行を開きます。

     imapsync ^ --host1 %%G --user1 %%H --password1 %%I ^ --host2 %%J --user2 %%K --password2 %%L %arguments%
          
          





    パラメーターを追加し、%arguments%の後の行の最後にある「^」文字を忘れずに、結果を取得します。

     imapsync ^ --host1 %%G --user1 %%H --password1 %%I ^ --host2 %%J --user2 %%K --password2 %%L %arguments% ^ --ssl1 --ssl2 --sslargs1 SSL_verify_mode=0 --sslargs2 SSL_verify_mode=1 --skipheader "^(?!Message-Id)" --automap ^ --regextrans2 "s/^INBOX\.(.+)/$1/" --justfolders --dry
          
          





    保存して実行します。 マイニングがどのように行われたかを確認し、 -justfolders --dryパラメーターを削除して、すべてのフォルダーとレターの実際の転送を開始します。

    メールボックスの移行が完了するのを待ってログを確認するだけです。 メールボックスごとに個別のログが作成されます。



追加



プログラムの調査とエラーのデバッグ中に自分で特定したいくつかの重要なポイント:



Windows 10 64ビットおよびWindows 7 64ビットでコンパイルとパフォーマンスがテストされました。



UPD 2016.07.10:ポータブルバージョンのイチゴを使用して準備と編集のセクションを書き直しました。

彼は、パッケージのインストールとコンパイルにエラーがないバージョンを指定しました。

UPD 2016.07.11:SSL証明書をチェックおよび無視するためのコマンドを追加しました。



All Articles