This commit is contained in:
Nick Bebout 2012-07-20 21:18:22 -05:00
parent b62a0dae2a
commit 2ca1ed54cb
21 changed files with 6228 additions and 305 deletions

20
COPYING
View file

@ -1,14 +1,14 @@
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
Version 2, December 2004
NO LIMIT PUBLIC LICENSE
Version 0, June 2012
Copyright (C) 2004 Sam Hocevar
14 rue de Plaisance, 75014 Paris, France
Everyone is permitted to copy and distribute verbatim or modified
copies of this license document, and changing it is allowed as long
as the name is changed.
Gilles LAMIRAL
La Billais
35580 Baulon
France
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
NO LIMIT PUBLIC LICENSE
Terms and conditions for copying, distribution, modification
or anything else.
0. You just DO WHAT THE FUCK YOU WANT TO.
0. No limit to do anything with this work and this license.

10
CREDITS
View file

@ -1,5 +1,5 @@
#!/bin/cat
# $Id: CREDITS,v 1.168 2012/02/19 22:26:00 gilles Exp gilles $
# $Id: CREDITS,v 1.169 2012/07/19 09:43:09 gilles Exp gilles $
If you want to make a donation to the author, Gilles LAMIRAL,
use any of the following ways:
@ -30,13 +30,18 @@ I thank very much all of these people.
I thank also very much all people who bought imapsync from the homepage
but I don't cite them here.
Peter Fuchs
Contributed by giving the book
30.86 "Designed for Use: Create Usable Interfaces for Applications and the Web"
Pierre GUILLAUME // e-Lixir
Fixed 2 bugs about [Gmail] folder names.
one is about $cache_dir and bsd_globs() that needs escaped characters.
Second is eval and --delete2foldersonly --delete2foldersbutnot that need
also good escaping. Thanks.
? (Found no card in the packet; may be lost since book is damaged, amazon and paper box for an international transported book ...)
Unknown (Found no card in the packet; may be lost since book is damaged, amazon and paper box for an international transported book ...)
Contributed by giving the book
87.18 "Paradigms of Artificial Intelligence Programming: Case Studies in Common Lisp"
@ -1053,6 +1058,7 @@ Eric Yung
Total amount of book prices :
c \
30.86+\
87.18+\
19.90+\
13.59+\

View file

@ -1,17 +1,57 @@
RCS file: RCS/imapsync,v
Working file: imapsync
head: 1.488
head: 1.498
branch:
locks: strict
gilles: 1.488
gilles: 1.498
access list:
symbolic names:
keyword substitution: kv
total revisions: 488; selected revisions: 488
total revisions: 498; selected revisions: 498
description:
----------------------------
revision 1.488 locked by: gilles;
revision 1.498 locked by: gilles;
date: 2012/07/20 14:28:45; author: gilles; state: Exp; lines: +22 -6
Added several connection ckecks like old good imapsync-1.181 to imapsync-1.398
----------------------------
revision 1.497
date: 2012/07/14 19:48:04; author: gilles; state: Exp; lines: +43 -28
Added --authmech PREAUTH capabiliy. (Patch from David Abrahams).
----------------------------
revision 1.496
date: 2012/07/12 20:53:49; author: gilles; state: Exp; lines: +12 -11
Bugfix. Unsubsribe folder before deleting it (can bug sometimes).
----------------------------
revision 1.495
date: 2012/07/11 04:56:33; author: gilles; state: Exp; lines: +7 -8
Bugfix about last patch $h2_total_bytes_duplicate
----------------------------
revision 1.494
date: 2012/07/11 03:50:43; author: gilles; state: Exp; lines: +40 -12
Usability. Use KiB MiB GiB etc in result summary. Patch from Mark Atwood.
----------------------------
revision 1.493
date: 2012/06/30 00:28:51; author: gilles; state: Exp; lines: +9 -9
Bug fix. Port 143 when --ssl and --tls together.
----------------------------
revision 1.492
date: 2012/06/29 23:32:04; author: gilles; state: Exp; lines: +7 -7
Bug fix. Don't filter flag when --nofilterflags is used during the message copy.
----------------------------
revision 1.491
date: 2012/06/20 09:53:27; author: gilles; state: Exp; lines: +8 -8
Added value of internal date in --debug mode.
----------------------------
revision 1.490
date: 2012/05/22 21:03:40; author: gilles; state: Exp; lines: +10 -14
Updated Cyrus info.
----------------------------
revision 1.489
date: 2012/05/22 20:54:13; author: gilles; state: Exp; lines: +20 -14
Print dry mode when expunging.
----------------------------
revision 1.488
date: 2012/04/15 17:38:21; author: gilles; state: Exp; lines: +8 -8
Reverse patch applied in 1.485
It was "2) eval and --delete2foldersonly --delete2foldersbutnot that need also good escaping."

168
FAQ
View file

@ -1,5 +1,5 @@
#!/bin/cat
# $Id: FAQ,v 1.106 2012/04/15 19:18:29 gilles Exp gilles $
# $Id: FAQ,v 1.114 2012/07/19 09:42:13 gilles Exp gilles $
+------------------+
| FAQ for imapsync |
@ -109,7 +109,7 @@ Q. I need to migrate hundred accounts, how can I do?
R. If you have many mailboxes to migrate think about a little
shell program. Write a file called file.txt (for example)
containing users and passwords.
The separator used in this example is ';'
The separator used in this example is ";"
The file.txt file contains:
@ -179,6 +179,61 @@ R. Add also --nofoldersizes since the default behavior is to compute
folder sizes. Folder sizes are useless for the transfer, just
useful to see what has to be done on each folder.
Notes about --useuid
Case where building the cache first is necessary (to avoid multiples transfers)
If you run again imapsync with --useuid on a transfert already done without --useuid
then, to avoid messages be copied again, first run imapsync with --usecache
but without --useuid, example scenario:
A] Running with the default options, I began without --useuid
1) First run with default options
imapsync ...
Too slow, I want to speed up!
2) Build the cache
imapsync ... --usecache
3) Speed up now
imapsync ... --useuid
B] I began with --useuid from the first time
1) First run and next runs with --useuid
imapsync ... --useuid
Inodes number issue
The cache is simple, it uses the filsystem natively,
it's just an empty file per message transfered.
When mailboxes are huge the cache can exhaust the number of inodes
allowed in the filesystem, that's a limitation like size but less
often encountered.
On Unix, to predict whether your tmpdir filesystem used by imapsync
will support the whole cache, just run the command "df -i /var/tmp",
if /var/tmp is the --tmpdir argument.
On windows, search and drop me a note about how to count the number
of files allowed in the filesystem.
It seems FAT32 supports 268 435 445 clusters.
Choosing the number of inodes allowed by a filesystem can be done
at the creation of it with "mkfs -N number-of-inodes ..."
imapsync can predict how many messages have to be synced with the
option --justfoldersizes (no transfer will be done)
imapsync ... --justfoldersizes
=======================================================================
Q. I see warning messages like
"Host1 Sent/15 size 1428 ignored (no header so we ignore this message)"
@ -207,16 +262,15 @@ R. - Download latest Mail::IMAPClient 3.xx at
- run imapsync with perl and -I option tailing to use the perl
module Mail-IMAPClient-3.xx. Example:
perl -I./Mail-IMAPClient-3.30/lib ./imapsync ...
perl -I./Mail-IMAPClient-3.31/lib ./imapsync ...
or if imapsync is in directory /path/
perl -I./Mail-IMAPClient-3.30/lib /path/imapsync ...
perl -I./Mail-IMAPClient-3.31/lib /path/imapsync ...
- Look at the script named i3 in the tarball, it can be used to
run imapsync with included Mail-IMAPClient-3.30/ wherever you
run imapsync with included Mail-IMAPClient-3.31/ wherever you
unpacked the imapsync tarball
=======================================================================
Q. How can I use imapsync with Mail::IMAPClient 2.2.9 perl module?
@ -442,7 +496,7 @@ Q. How to convert flags with $ to \ character?
R. $ and \ are special characters we have to "escape" them.
For example to convert flag $label1 to \label1
imapsync ... --regexflag 's/\$label1/\\label1/g' --debugflags
imapsync ... --regexflag "s/\$label1/\\label1/g" --debugflags
=======================================================================
Q. I need to keep only a defind list of flags, how can I do?
@ -622,25 +676,25 @@ want to forward me the output.
The way to avoid this problem is by using options --skipheader and
--skipsize, like this (avoid headers beginning whith the string "X-"):
imapsync ... --skipheader '^X-' --skipsize
imapsync ... --skipheader "^X-" --skipsize
To skip several headers you can use --skipheader one time
imapsync ... --skipheader '^X-|^Status|^Bcc'
imapsync ... --skipheader "^X-|^Status|^Bcc"
If you think you have too many header to avoid just use
imapsync ... --useheader 'Message-ID' --skipsize
imapsync ... --useheader "Message-ID" --skipsize
Remark. (Trick found by Tomasz Kaczmarski)
Option --useheader 'Message-ID' asks the server to send only header
lines begining with 'Message-ID'. Some (buggy) servers send the whole
header (all lines) instead of the 'Message-ID' line. In that case, a
Option --useheader "Message-ID" asks the server to send only header
lines begining with "Message-ID". Some (buggy) servers send the whole
header (all lines) instead of the "Message-ID" line. In that case, a
trick to keep the --useheader filtering behavior is to use
--skipheader with a negative lookahead pattern :
imapsync ... --skipheader '^(?!Message-ID)' --skipsize
imapsync ... --skipheader "^(?!Message-ID)" --skipsize
Read it as "skip every header except Message-ID".
@ -679,7 +733,7 @@ Q. I want to exclude a folder hierarchy like "public"
R. Use:
--exclude '^public\.'
--exclude "^public\."
or maybe
--exclude '^"public\.'
@ -694,26 +748,39 @@ Q. I want to exclude only INBOX
R. Use:
imapsync ... --exclude '^INBOX$'
imapsync ... --exclude "^INBOX$"
A good way to see what will be done is to first use:
imapsync ... --exclude '^INBOX$' --justfolders --nofoldersizes --dry
imapsync ... --exclude "^INBOX$" --justfolders --nofoldersizes --dry
======================================================================
Q. I want the --folder 'MyFolder' option be recursive.
Q. I want the --folder "MyFolder" option be recursive.
Two solutions:
R1. Use
--folderrec 'MyFolder'
--folderrec "MyFolder"
R2. Use --include '^MyFolder'
R2. Use --include "^MyFolder"
Then the folder "MyFolder" and all its subfolders will be handled
and only them.
======================================================================
Q. Migrating to Exchange 201O, messages get date of the transfer,
this is bad for sorting and listing.
R1. Be sure to have at least Exchange 2010 SP2 Rollup 5
http://www.tribalchicken.com.au/15-technical/29-imapsync-exchange2010
R2. See also the Outlook side (thanks to Martin Hochreiter for this solution)
http://www.howto-outlook.com/faq/archivenotworking.htm
by changing Archive to sent/receive date
It's often shorter to change one server than thousands clients
so R1 might be easier to do.
======================================================================
Q. How to migrate from or to Exchange 2003 with an admin/authuser
@ -760,9 +827,9 @@ This doesn't work:
imapsync ... --user2 user2 --authuser2 admin2 --password2 adminpassword2 ...
This might works:
imapsync ... --user2 'domain\admin2\user2' --password2 adminpassword2 ...
imapsync ... --user2 "domain\admin2\user2" --password2 adminpassword2 ...
or
imapsync ... --user2 'admin2@domain\user2' --password2 adminpassword2 ...
imapsync ... --user2 "admin2@domain\user2" --password2 adminpassword2 ...
where "domain" is set be the user's UPN in Active Directory
or the NETBIOS or DNS name of the domain.
@ -770,6 +837,34 @@ or the NETBIOS or DNS name of the domain.
The exact format might vary depending on local configuration and you
should experiment with the different formats.
A little note from Michael Scherer.
The previous workaround in the FAQ seems to be obsolete.
I can confirm that
imapsync ... --host2 exchange_server --authmech2 PLAIN \
--authuser2 admin@domain --user2 user_alias
is working without any glitches, running Exchange 2010 SP2 here.
Explanation, Exchange knows a) about a username
and b) about a mailNickname which can be different to the username.
As it seems you need to use the mailNickname (e.g. alias) defined
for user2, not the username itself.
http://blogs.technet.com/b/exchange/archive/2004/03/31/105275.aspx
======================================================================
Q. How to migrate from or to Office 365 with an admin/authuser account?
Note from Yago Torres Fernandez:
(a working command using admin/authuser on host2 Office 365)
imapsync ... --authuser2 user_admin@domain.com --user2 user_to_be_migrated@domain.com ^
--password2 XXXX --ssl2 --exclude "Shared Folders" ^
--regextrans2 "s#Trash$#Papelera#" --regextrans2 "s#^Deleted Items$#Papelera#"
but previous in Office365 you must do something like that, using powershell:
Add-MailboxPermission -identity user_to_be_migrated@domain.com -user user_admin@domain.com -accessrights fullaccess -inheritancetype all
======================================================================
Q. How to migrate from uw-imap with an admin/authuser account?
@ -804,7 +899,7 @@ Here is an example:
--host2 server2 \
--user2 joe \
--password2 joespassonserver2 \
--exclude '^user\.'
--exclude "^user\."
======================================================================
Q: How to migrate from Sun Java Enterprise System / Sun One / iPlanet /
@ -856,7 +951,7 @@ to folder INBOX only on host2:
imapsync \
...
--regextrans2 's/(.*)/INBOX/' \
--regextrans2 "s/(.*)/INBOX/" \
--dry --justfolders
2) See if the output says everything you want imapsync to do,
@ -879,7 +974,7 @@ R.
imapsync \
...
--regextrans2 's/INBOX(.*)/INBOX.Braunschweig$1/' \
--regextrans2 "s/INBOX(.*)/INBOX.Braunschweig$1/" \
--dry --justfolders
2) See if the output says everything you want imapsync to do,
@ -1081,12 +1176,12 @@ Maybe --subscribe_all will help you to see all migrated folders.
=======================================================================
Q. Synchronising from SmarterMail to XXX
Q. Synchronizing from SmarterMail to XXX
imapsync --host1 imap.d1.org --user1 joe --password1 secret1 --sep1 "/" \
--host2 imap.d2.org --user2 joe --password2 secret2 \
--noauthmd5 \
--prefix1 "Inbox/" \
--prefix1 "" \
--regextrans2 's#^Inbox$#INBOX#' \
--regextrans2 's#Sent Items$#Sent#' \
--dry --justfolders
@ -1095,7 +1190,7 @@ Maybe add other --regextrans2 to change folder names and see the result.
When satisfied, run without --dry --justfolders
=======================================================================
Q. Synchronising from XXX to Gmail
Q. Synchronizing from XXX to Gmail
R. There are some details to get the special [Gmail] sub-folders
right. Here's an example of migrating an old "Sent" folder to
@ -1107,13 +1202,13 @@ imapsync --host1 mail.oldhost.com \
--host2 imap.gmail.com --ssl2 \
--user2 my_email@gmail.com \
--password2 password \
--folder 'INBOX.Sent' \
--regextrans2 's/Sent/Sent Mail/'
--folder "INBOX.Sent" \
--regextrans2 "s/Sent/Sent Mail/"
The same goes for the "All Mail" archive pseudo-folder.
=======================================================================
Q. Synchronising from Gmail to XXX
Q. Synchronizing from Gmail to XXX
R. Gmail needs SSL
@ -1146,7 +1241,7 @@ http://biasecurities.com/blog/2009/migrate-email-from-gmail-to-google-apps/
http://www.thamtech.com/blog/2008/03/29/gmail-to-google-apps-email-migration/
=======================================================================
Q. Synchronising from Yahoo to XXX
Q. Synchronizing from Yahoo to XXX
R. Use --host1 imap.mail.yahoo.com --sep1 '/'
@ -1271,6 +1366,15 @@ I encounter many errors like this:
R. GroupWise 7 seems buggy. Apply GroupWise 7 support pack 1
=======================================================================
Q. Migrating from David Tobit V10
R. Use the following options :
imapsync ... --prefix1 "" --sep1 / --idatefromheader ^
--nofoldersizes --useuid
=======================================================================
=======================================================================
Q. Migrating from David Tobit V8

25
INSTALL
View file

@ -1,4 +1,4 @@
# $Id: INSTALL,v 1.24 2012/04/13 09:14:22 gilles Exp gilles $
# $Id: INSTALL,v 1.25 2012/07/19 05:57:14 gilles Exp gilles $
#
# INSTALL file for imapsync
# imapsync : IMAP sync or copy tool.
@ -71,7 +71,7 @@ Here is some individual module help:
http://search.cpan.org/dist/Mail-IMAPClient/
In fact I use both Mail-IMAPClient-2.2.9 and latest Mail-IMAPClient-3.xx
(xx >= 25) To know the version you have on your system try :
(xx >= 31 now) To know the version you have on your system try :
perl -mMail::IMAPClient -e 'print $Mail::IMAPClient::VERSION, "\n"'
@ -80,16 +80,21 @@ Here is some individual module help:
at least with Mail-IMAPClient-3.25 (previous may bug).
Don't hesitate to use latest Mail-IMAPClient-3.xx
Look at the script named i3 in the tarball, it can be used to
run imapsync with included Mail-IMAPClient-3.31/ wherever you
unpacked the imapsync tarball.
- Perl Digest::MD5 module.
try:
perl -mDigest::MD5
http://search.cpan.org/
http://search.cpan.org/~gaas/Digest-MD5-2.36/
http://search.cpan.org/~gaas/Digest-MD5-2.52/
To know the version you have on your system try :
perl -mDigest::MD5 -e 'print $Digest::MD5::VERSION, "\n"'
I use 2.36 (debian etch package)
I use 2.39 (Ubuntu package)
- Term::ReadKey
perl -mTerm::ReadKey -e ''
@ -146,7 +151,7 @@ To see what will be done, just run:
make -n install
To install imapsync, just run (as root):
To install imapsync in /usr/bin/ and man page in /usr/share/man/man1/, just run (as root):
make install
@ -155,15 +160,19 @@ or copy the file imapsync where you want it to be.
TESTING on Unix
---------------
The test will break as they are home specific.
Tests will break as they are home specific.
You need a running imap server on localhost with several accounts
toto with a password located in the file $HOME/var/pass/secret.toto
titi with a password located in the file $HOME/var/pass/secret.titi
tata with a password located in the file $HOME/var/pass/secret.tata
Of course, you can change the file tests.sh and run the tests with :
Of course, you can change the file tests.sh and run tests with:
sh -x tests.sh
sh -x tests.sh
Specific tests can be run by using them as argument to tests.sh:
sh -x tests.sh ll_ssl_justconnect ll_bad_host ...
The tests.sh script break on first failure ("set -e" directive).

View file

@ -1,5 +1,5 @@
# $Id: Makefile,v 1.94 2012/04/15 19:19:14 gilles Exp gilles $
# $Id: Makefile,v 1.95 2012/07/19 05:58:22 gilles Exp gilles $
.PHONY: help usage all
@ -282,11 +282,11 @@ upload_lfo:
/home/gilles/public_html/www.linux-france.org/html/prj/imapsync/.htaccess
sh ~/memo/lfo-rsync
upload_index: index.shtml FAQ
validate --verbose index.shtml
rcsdiff index.shtml
rsync -avH index.shtml FAQ root@ks.lamiral.info:/var/www/imapsync/
rsync -avH index.shtml FAQ \
upload_index: index.shtml FAQ paypal.shtml
validate --verbose index.shtml paypal.shtml
rcsdiff index.shtml paypal.shtml FAQ
rsync -avH index.shtml FAQ paypal.shtml root@ks.lamiral.info:/var/www/imapsync/
rsync -avH index.shtml FAQ paypal.shtml \
../../public_html/www.linux-france.org/html/prj/imapsync/
sh $(HOME)/memo/lfo-rsync

18
README
View file

@ -3,7 +3,7 @@ NAME
Synchronise mailboxes between two imap servers. Good at IMAP migration.
More than 44 different IMAP server softwares supported with success.
$Revision: 1.488 $
$Revision: 1.498 $
SYNOPSIS
To synchronise imap account "foo" on "imap.truc.org" to imap account
@ -314,14 +314,10 @@ IMAP SERVERS
- Courier IMAP 1.5.1, 2.2.0, 2.1.1, 2.2.1, 3.0.8, 3.0.3, 4.1.1 (GPL)
(http://www.courier-mta.org/)
- Critical Path (7.0.020)
- Cyrus IMAP 1.5, 1.6, 2.1, 2.1.15, 2.1.16, 2.1.18
2.2.1, 2.2.2-BETA, 2.2.10, 2.2.12,
v2.2.3-Invoca-RPM-2.2.3-8,
2.3-alpha (OSI Approved),
v2.2.12-Invoca-RPM-2.2.12-3.RHEL4.1,
2.2.13,
v2.3.1-Invoca-RPM-2.3.1-2.7.fc5,
v2.3.7,
- Cyrus IMAP 1.5, 1.6,
2.1, 2.1.15, 2.1.16, 2.1.18
2.2.1, 2.2.2-BETA, 2.2.3, 2.2.6, 2.2.10, 2.2.12, 2.2.13,
2.3-alpha (OSI Approved), 2.3.1, 2.3.7, 2.3.16
(http://asg.web.cmu.edu/cyrus/)
- David Tobit V8 (proprietary Message system).
- DBMail 1.2.1, 2.0.4, 2.0.9, 2.2rc1 (GPL) (http://www.dbmail.org/).
@ -342,7 +338,7 @@ IMAP SERVERS
- Kerio 7.2.0 Patch 1 [host1] [host2]
- MailEnable 4.23 [host1] [host2], 4.26 [host1][host2], 5 [host1]
- MDaemon 7.0.1, 8.0.2, 8.1, 9.5.4 (Windows server 2003 R2 platform), 12 [host2],
12.0.3 [host1]
12.0.3 [host1], 12.5.5 [host1],
- Mercury 4.1 (Windows server 2000 platform)
- Microsoft Exchange Server 5.5, 6.0.6249.0[host1], 6.0.6487.0[host1],
6.5.7638.1 [host2], 6.5 [host1], Exchange 2007 SP1 (with Update Rollup 2),
@ -444,5 +440,5 @@ SIMILAR SOFTWARES
Feedback (good or bad) will often be welcome.
$Id: imapsync,v 1.488 2012/04/15 17:38:21 gilles Exp gilles $
$Id: imapsync,v 1.498 2012/07/20 14:28:45 gilles Exp gilles $

12
TODO
View file

@ -1,5 +1,5 @@
#!/bin/cat
# $Id: TODO,v 1.111 2012/04/15 19:18:54 gilles Exp gilles $
# $Id: TODO,v 1.112 2012/07/19 09:41:54 gilles Exp gilles $
TODO file for imapsync
----------------------
@ -19,6 +19,10 @@ Evaluate
http://www.rackspace.com/apps/email_hosting/migrations
http://www.yippiemove.com/
http://www.migrationwiz.com/
http://www.microsoft.com/download/en/details.aspx?id=1329 "Microsoft Transporter Suite"
Fix bug found by Pavel Stano on 01/06/2012 (june) imapsync never stop login
when login fails with a "* BYE Temp error" from server.
Consider /var/tmp/ instead of /tmp (/tmp is destoyed
on some Unix at reboot)
@ -161,6 +165,12 @@ http://asg.web.cmu.edu/cyrus/download/imapd/altnamespace.html
===========================================================================
DONE. Add a note about
"One other thing: You might want to warn idiots like me, that if your
cache resides on a filesystem with a limited number of inodes such as
ext4, your inodes will be exhausted really fast (check with df -i). I
now use a dedicated partition with reiserfs."
DONE. Add an option --exitwhenover 2500000000 to avoid to be banned or locked
http://support.google.com/a/bin/answer.py?hl=en&answer=1071518

View file

@ -1 +1 @@
1.488
1.498

View file

@ -1 +1 @@
1.488
1.498

View file

@ -1,16 +1,67 @@
#!/bin/sh
# $Id: memo,v 1.6 2012/02/24 12:23:38 gilles Exp gilles $
# $Id: memo,v 1.9 2012/07/05 20:37:53 gilles Exp gilles $
echo paypal_bilan_tests_invoice
paypal_bilan_tests_invoice() {
# DID output no diff between paypal_bilan_1.47 and 1.48
echo paypal_bilan_todo
paypal_bilan_todo() {
cat <<EOF
http://www.cabinet-antoine.fr/spip.php?article138
Si vous réalisez des ventes de biens au profit d\u2019entreprises ressortissantes d\u2019autres états membres de l\u2019Union européenne et si ces ventes sont exonérées de TVA, les factures correspondantes doivent impérativement comporter le numéro de TVA intracommunautaire de vos clients ainsi que la mention : « Exonération de TVA, article 262 ter, I du Code général des impôts ». Là encore, ces factures ne doivent évidemment pas comporter de taux ni de montant de TVA.
Si vous fournissez des prestations de services à un client installé dans un autre État membre de l\u2019Union européenne, depuis le 1er janvier 2010, le lieu d\u2019imposition des prestations de services entre entreprises est celui où est situé l\u2019acheteur et non plus celui où est établi le prestataire. En conséquence, en application du système dit de l\u2019autoliquidation de la TVA, vous ne devez plus faire mention de la TVA sur vos factures, mais vous devez indiquer : « Exonération de TVA, article 283-2 du Code général des impôts ».
Hors Europe a un non-assujetti : Article 259 B => prestation hors France pour
- Article 259 B-1 Cessions de droits de licences
- Article 259 B-4 Prestations des conseillers, ingénieurs dans tous les domaines
- Article 259 B-5 Traitement de données et fournitures d information
Hors Europe : Article 262 => Exoneration
- Article 262-1 les livraisons de biens expédiés par le vendeur [...] ainsi que les prestations de services directement liées à l exportation ;
- Article 262-2 les livraisons de biens expédiés ou transportés par l acheteur [...] ainsi que les prestations de services directement liées à l exportation.
Europe a un autre assujetti : Article 262 ter => Exoneration
- Article 262 ter-1 sur livraisons de biens expédiés. Question : oeuvre immaterielle, service ?
EOF
}
echo paypal_bilan_tests_tva
paypal_bilan_tests_tva() {
# DID output no diff between paypal_bilan_1.55 and 1.5?
(
#set -x
/g/public_html/imapsync/W/paypal_reply/paypal_bilan_1.47 --bnc --debug --debug_invoice --first_in 147 --avoid_numbers '292 293 643 644 731 732 1093 1330 1331 1332 1333 1334' /g/paypal/paypal_201?_??_complet.csv \
/g/public_html/imapsync/W/paypal_reply/paypal_bilan_1.55 --bnc --debug --debug_invoice --first_in 147 \
--avoid_numbers '292 293 643 644 731 732 1093 1330 1331 1332 1333 1334 1652 1653' \
/g/paypal/paypal_201?_??_complet.csv \
> /g/var/paypal_bilan/tests/paypal_invoice.out1 2>&1
/g/public_html/imapsync/W/paypal_reply/paypal_bilan --bnc --debug --debug_invoice --first_in 147 --avoid_numbers '292 293 643 644 731 732 1093 1330 1331 1332 1333 1334' /g/paypal/paypal_201?_??_complet.csv \
/g/public_html/imapsync/W/paypal_reply/paypal_bilan --bnc --debug --debug_invoice --first_in 147 \
--avoid_numbers '292 293 643 644 731 732 1093 1330 1331 1332 1333 1334 1652 1653' \
/g/paypal/paypal_201?_??_complet.csv \
> /g/var/paypal_bilan/tests/paypal_invoice.out2 2>&1
echo diff /g/var/paypal_bilan/tests/paypal_invoice.out1 /g/var/paypal_bilan/tests/paypal_invoice.out2
diff /g/var/paypal_bilan/tests/paypal_invoice.out1 /g/var/paypal_bilan/tests/paypal_invoice.out2
)
}
#echo paypal_bilan_tests_invoice
paypal_bilan_tests_invoice() {
# DID output no diff between paypal_bilan_1.53 and 1.53
(
#set -x
/g/public_html/imapsync/W/paypal_reply/paypal_bilan_1.52 --bnc --debug --debug_invoice --first_in 147 \
--avoid_numbers '292 293 643 644 731 732 1093 1330 1331 1332 1333 1334 1652 1653' \
/g/paypal/paypal_201?_??_complet.csv \
> /g/var/paypal_bilan/tests/paypal_invoice.out1 2>&1
/g/public_html/imapsync/W/paypal_reply/paypal_bilan --bnc --debug --debug_invoice --first_in 147 \
--avoid_numbers '292 293 643 644 731 732 1093 1330 1331 1332 1333 1334 1652 1653' \
/g/paypal/paypal_201?_??_complet.csv \
> /g/var/paypal_bilan/tests/paypal_invoice.out2 2>&1
echo diff /g/var/paypal_bilan/tests/paypal_invoice.out1 /g/var/paypal_bilan/tests/paypal_invoice.out2

View file

@ -1,6 +1,6 @@
#!/usr/bin/perl
# $Id: paypal_bilan,v 1.48 2012/04/15 09:24:49 gilles Exp gilles $
# $Id: paypal_bilan,v 1.56 2012/07/16 21:57:51 gilles Exp gilles $
use strict;
use warnings;
@ -13,6 +13,11 @@ use Test::More 'no_plan' ;
die unless (utf8_supported_charset('ISO-8859-1'));
my $rcs = '$Id: paypal_bilan,v 1.56 2012/07/16 21:57:51 gilles Exp gilles $ ' ;
$rcs =~ m/,v (\d+\.\d+)/ ;
my $VERSION = ($1) ? $1: "UNKNOWN" ;
my $total_usd_received = 0 ;
my $total_usd_invoice = 0 ;
my $total_HT_EUR_exo = 0 ;
@ -140,7 +145,7 @@ foreach my $invoice ( @invoices_wanted ) {
if ( $invoice_sent ) {
$invoice_sent{ $invoice }++ ;
#build_invoice( $invoice ) ;
}else{
}elsif( not ( $invoice_canceled{ $invoice } or $invoice_refund{ $invoice } ) ) {
$invoice_not_sent{ $invoice }++ ;
build_invoice( $invoice ) ;
}
@ -154,6 +159,9 @@ my @invoice_canceled = sort { $a <=> $b } keys( %invoice_canceled ) ;
my @invoice_suspended = sort { $a <=> $b } keys( %invoice_suspended ) ;
my @invoice_refund = sort { $a <=> $b } keys( %invoice_refund ) ;
print( "\n", "=" x 60, "\n" ) if $bnc ;
print "USD banque $total_usd_received\n" ;
print "USD invoice $total_usd_invoice\n" ;
my $total_eur_from_usd ;
@ -180,9 +188,9 @@ print "EUR total TVA $total_TVA_EUR\n" ;
print "EUR total HT sup $total_HT_EUR_sup\n" ;
print "EUR total TVA sup $total_TVA_EUR_sup\n" ;
print "Nb invoice $nb_invoice ( from $first_invoice_paypal to $last_invoice )\n" ;
print "Nb invoice canceled $nb_invoice_canceled @invoice_canceled\n" ;
print "Nb invoice suspended $nb_invoice_suspended @invoice_suspended\n" ;
print "Nb invoice refund $nb_invoice_refund @invoice_refund\n" ;
print "Nb invoice canceled ($nb_invoice_canceled) @invoice_canceled\n" ;
print "Nb invoice suspended ($nb_invoice_suspended) @invoice_suspended\n" ;
print "Nb invoice refund ($nb_invoice_refund) @invoice_refund\n" ;
print "Nb invoice sent $nb_invoice_sent\n" ;
print "Have to send invoices @invoice_not_sent\n" if ( @invoice_not_sent ) ;
@ -479,9 +487,10 @@ sub compute_line {
$IND_flag = ' IND' if ('imapsync usage' eq $Nom_Option_1 and 'individual' eq $Valeur_Option_1 ) ;
my $SUPPORT_flag = '' ;
$SUPPORT_flag = ' support' if ( 'imapsync support' eq $Titre_de_l_objet ) ;
print "FE $invoice$FR_flag$IND_flag\n" ;
#print "FE $invoice$FR_flag$IND_flag\n" ;
#printf( "%.2f [EUR %.2f]\n", $Montant, $MontantEUR ) ;
print "FE $invoice$FR_flag$IND_flag imapsync$SUPPORT_flag $Nom\n" ;
printf( "%.2f [EUR %.2f]\n", $Montant, $MontantEUR ) ;
print "[$Date]$FR_flag$IND_flag $MontantEUR $Devise \n" ;
}
}
@ -589,7 +598,8 @@ sub build_invoice {
$priceTTC,
$messageTVAFR,
$messageTVAEN,
$priceTTCusd
$priceTTCusd,
$HTorTTC
)
= tva_stuff( $clientTypeEN, $Pays, $Hors_taxe, $Devise, $Titre_de_l_objet ) ;
@ -600,7 +610,7 @@ sub build_invoice {
my ( $Nom1 ) = cut( $Nom, 42 ) ;
my $tex_variables = qq{
%% Begin input from paypal_bilan
%% Begin input from paypal_bilan $VERSION
\\providecommand{\\invoiceNumber}{$invoice}
\\providecommand{\\clientName}{$Nom1}
\\providecommand{\\clientEmail}{$De_l_adresse_email}
@ -610,6 +620,7 @@ sub build_invoice {
\\providecommand{\\clientAdrD}{$clientAdrD}
\\providecommand{\\clientAdrE}{$clientAdrE}
\\providecommand{\\clientAdrF}{$clientAdrF}
\\providecommand{\\clientVAT}{}
\\providecommand{\\invoiceDate}{$Date}
\\providecommand{\\invoiceHour}{$Heure}
@ -623,6 +634,7 @@ sub build_invoice {
\\providecommand{\\tvaFR}{$tvaFR}
\\providecommand{\\tvaEN}{$tvaEN}
\\providecommand{\\priceTVA}{$priceTVA}
\\providecommand{\\HTorTTC}{$HTorTTC}
\\providecommand{\\priceTTC}{$priceTTC}
\\providecommand{\\priceTTCusd}{$priceTTCusd}
\\providecommand{\\messageTVAFR}{$messageTVAFR}
@ -995,6 +1007,7 @@ sub tva_stuff {
$priceTTC,
$messageTVAFR,
$messageTVAEN,
$HTorTTC
) ;
if ( ( 'individual' eq $clientTypeEN)
@ -1008,16 +1021,18 @@ sub tva_stuff {
$tvaEN = '';
$priceTVA = sprintf('%2.2f', $Hors_taxe/1.196*0.196) ;
$priceTTC = sprintf('%2.2f', $Hors_taxe) ;
$messageTVAFR = '';
$messageTVAEN = '';
$HTorTTC = 'TTC' ;
$messageTVAFR = '' ;
$messageTVAEN = '' ;
}else{
$priceHT = sprintf('%2.2f', $Hors_taxe) ;
$tvaFR = 'néant';
$tvaEN = '(none)';
$priceTVA = 0 ;
$priceTTC = $priceHT;
$messageTVAFR = 'Exonération de TVA, article 259 B-1 du Code Général des Impôts';
$messageTVAEN = '(VAT tax-exempt, article 259 B-1 French General Tax Code)';
$tvaFR = '' ;
$tvaEN = '' ;
$priceTVA = 'néant (none)' ;
$priceTTC = $priceHT ;
$HTorTTC = 'HT' ;
$messageTVAFR = 'Exonération de TVA, articles 262 1-2 du Code Général des Impôts';
$messageTVAEN = '(VAT tax-exempt, articles 262 1-2 French General Tax Code)';
}
foreach my $price ( $priceHT, $priceTVA, $priceTTC, $priceTTCusd ) {
#print "[$price]\n" ;
@ -1031,7 +1046,8 @@ sub tva_stuff {
$priceTTC,
$messageTVAFR,
$messageTVAEN,
$priceTTCusd
$priceTTCusd,
$HTorTTC
) ;
}

View file

@ -1,6 +1,6 @@
#!/usr/bin/perl
# $Id: paypal_bilan,v 1.47 2012/02/24 12:22:05 gilles Exp gilles $
# $Id: paypal_bilan,v 1.55 2012/07/16 19:33:46 gilles Exp gilles $
use strict;
use warnings;
@ -13,6 +13,11 @@ use Test::More 'no_plan' ;
die unless (utf8_supported_charset('ISO-8859-1'));
my $rcs = '$Id: paypal_bilan,v 1.55 2012/07/16 19:33:46 gilles Exp gilles $ ' ;
$rcs =~ m/,v (\d+\.\d+)/ ;
my $VERSION = ($1) ? $1: "UNKNOWN" ;
my $total_usd_received = 0 ;
my $total_usd_invoice = 0 ;
my $total_HT_EUR_exo = 0 ;
@ -140,7 +145,7 @@ foreach my $invoice ( @invoices_wanted ) {
if ( $invoice_sent ) {
$invoice_sent{ $invoice }++ ;
#build_invoice( $invoice ) ;
}else{
}elsif( not ( $invoice_canceled{ $invoice } or $invoice_refund{ $invoice } ) ) {
$invoice_not_sent{ $invoice }++ ;
build_invoice( $invoice ) ;
}
@ -154,6 +159,9 @@ my @invoice_canceled = sort { $a <=> $b } keys( %invoice_canceled ) ;
my @invoice_suspended = sort { $a <=> $b } keys( %invoice_suspended ) ;
my @invoice_refund = sort { $a <=> $b } keys( %invoice_refund ) ;
print( "\n", "=" x 60, "\n" ) if $bnc ;
print "USD banque $total_usd_received\n" ;
print "USD invoice $total_usd_invoice\n" ;
my $total_eur_from_usd ;
@ -180,9 +188,9 @@ print "EUR total TVA $total_TVA_EUR\n" ;
print "EUR total HT sup $total_HT_EUR_sup\n" ;
print "EUR total TVA sup $total_TVA_EUR_sup\n" ;
print "Nb invoice $nb_invoice ( from $first_invoice_paypal to $last_invoice )\n" ;
print "Nb invoice canceled $nb_invoice_canceled @invoice_canceled\n" ;
print "Nb invoice suspended $nb_invoice_suspended @invoice_suspended\n" ;
print "Nb invoice refund $nb_invoice_refund @invoice_refund\n" ;
print "Nb invoice canceled ($nb_invoice_canceled) @invoice_canceled\n" ;
print "Nb invoice suspended ($nb_invoice_suspended) @invoice_suspended\n" ;
print "Nb invoice refund ($nb_invoice_refund) @invoice_refund\n" ;
print "Nb invoice sent $nb_invoice_sent\n" ;
print "Have to send invoices @invoice_not_sent\n" if ( @invoice_not_sent ) ;
@ -477,9 +485,12 @@ sub compute_line {
$FR_flag = ' FR' if $Pays eq 'France' ;
my $IND_flag = '' ;
$IND_flag = ' IND' if ('imapsync usage' eq $Nom_Option_1 and 'individual' eq $Valeur_Option_1 ) ;
print "FE $invoice$FR_flag$IND_flag\n" ;
print "FE $invoice$FR_flag$IND_flag imapsync $Nom\n" ;
printf( "%.2f [EUR %.2f]\n", $Montant, $MontantEUR ) ;
my $SUPPORT_flag = '' ;
$SUPPORT_flag = ' support' if ( 'imapsync support' eq $Titre_de_l_objet ) ;
#print "FE $invoice$FR_flag$IND_flag\n" ;
#printf( "%.2f [EUR %.2f]\n", $Montant, $MontantEUR ) ;
print "FE $invoice$FR_flag$IND_flag imapsync$SUPPORT_flag $Nom\n" ;
print "[$Date]$FR_flag$IND_flag $MontantEUR $Devise \n" ;
}
}
@ -587,7 +598,8 @@ sub build_invoice {
$priceTTC,
$messageTVAFR,
$messageTVAEN,
$priceTTCusd
$priceTTCusd,
$HTorTTC
)
= tva_stuff( $clientTypeEN, $Pays, $Hors_taxe, $Devise, $Titre_de_l_objet ) ;
@ -598,7 +610,7 @@ sub build_invoice {
my ( $Nom1 ) = cut( $Nom, 42 ) ;
my $tex_variables = qq{
%% Begin input from paypal_bilan
%% Begin input from paypal_bilan $VERSION
\\providecommand{\\invoiceNumber}{$invoice}
\\providecommand{\\clientName}{$Nom1}
\\providecommand{\\clientEmail}{$De_l_adresse_email}
@ -621,6 +633,7 @@ sub build_invoice {
\\providecommand{\\tvaFR}{$tvaFR}
\\providecommand{\\tvaEN}{$tvaEN}
\\providecommand{\\priceTVA}{$priceTVA}
\\providecommand{\\HTorTTC}{$HTorTTC}
\\providecommand{\\priceTTC}{$priceTTC}
\\providecommand{\\priceTTCusd}{$priceTTCusd}
\\providecommand{\\messageTVAFR}{$messageTVAFR}
@ -993,6 +1006,7 @@ sub tva_stuff {
$priceTTC,
$messageTVAFR,
$messageTVAEN,
$HTorTTC
) ;
if ( ( 'individual' eq $clientTypeEN)
@ -1006,16 +1020,18 @@ sub tva_stuff {
$tvaEN = '';
$priceTVA = sprintf('%2.2f', $Hors_taxe/1.196*0.196) ;
$priceTTC = sprintf('%2.2f', $Hors_taxe) ;
$messageTVAFR = '';
$messageTVAEN = '';
$HTorTTC = 'TTC' ;
$messageTVAFR = '' ;
$messageTVAEN = '' ;
}else{
$priceHT = sprintf('%2.2f', $Hors_taxe) ;
$tvaFR = 'néant';
$tvaEN = '(none)';
$priceTVA = 0 ;
$priceTTC = $priceHT;
$messageTVAFR = 'Exonération de TVA, article 259 B-1 du Code Général des Impôts';
$messageTVAEN = '(VAT tax-exempt, article 259 B-1 French General Tax Code)';
$tvaFR = '' ;
$tvaEN = '' ;
$priceTVA = 'néant (none)' ;
$priceTTC = $priceHT ;
$HTorTTC = 'HT' ;
$messageTVAFR = 'Exonération de TVA, articles 262 1-2 du Code Général des Impôts';
$messageTVAEN = '(VAT tax-exempt, articles 262 1-2 French General Tax Code)';
}
foreach my $price ( $priceHT, $priceTVA, $priceTTC, $priceTTCusd ) {
#print "[$price]\n" ;
@ -1029,7 +1045,8 @@ sub tva_stuff {
$priceTTC,
$messageTVAFR,
$messageTVAEN,
$priceTTCusd
$priceTTCusd,
$HTorTTC
) ;
}

View file

@ -1,6 +1,6 @@
#!/bin/sh
# $Id: paypal_build_invoices,v 1.29 2012/04/13 10:42:44 gilles Exp gilles $
# $Id: paypal_build_invoices,v 1.34 2012/07/16 14:00:28 gilles Exp gilles $
# usage: sh paypal_build_invoices /g/var/paypal_invoices/????
@ -25,7 +25,10 @@ set -x
#/g/public_html/imapsync/W/paypal_reply/paypal_bilan --write_invoices --first_in 1335 /g/paypal/paypal_2012_01_complet.csv
#/g/public_html/imapsync/W/paypal_reply/paypal_bilan --write_invoices --first_in 1417 /g/paypal/paypal_2012_02_complet.csv
#/g/public_html/imapsync/W/paypal_reply/paypal_bilan --write_invoices --first_in 1508 /g/paypal/paypal_2012_03_complet.csv
/g/public_html/imapsync/W/paypal_reply/paypal_bilan --write_invoices --first_in 1575 /g/paypal/paypal_2012_04_complet.csv
#/g/public_html/imapsync/W/paypal_reply/paypal_bilan --write_invoices --first_in 1575 /g/paypal/paypal_2012_04_complet.csv
#/g/public_html/imapsync/W/paypal_reply/paypal_bilan --write_invoices --first_in 1654 /g/paypal/paypal_2012_05_complet.csv
/g/public_html/imapsync/W/paypal_reply/paypal_bilan --write_invoices --first_in 1743 /g/paypal/paypal_2012_06_complet.csv
/g/public_html/imapsync/W/paypal_reply/paypal_bilan --write_invoices --first_in 1824 /g/paypal/paypal_2012_07_complet.csv
: /g/public_html/imapsync/W/paypal_reply/paypal_bilan --first_in 147 /g/paypal/paypal_2010_11_complet.csv
: /g/public_html/imapsync/W/paypal_reply/paypal_bilan --first_in 214 /g/paypal/paypal_2010_12_complet.csv
@ -37,29 +40,32 @@ set -x
: /g/public_html/imapsync/W/paypal_reply/paypal_bilan --first_in 733 --usdeur 1.4395 /g/paypal/paypal_2011_06_complet.csv
: /g/public_html/imapsync/W/paypal_reply/paypal_bilan --first_in 824 --usdeur 1.4496 /g/paypal/paypal_2011_07_complet.csv
: /g/public_html/imapsync/W/paypal_reply/paypal_bilan --first_in 917 --usdeur 1.4397 /g/paypal/paypal_2011_08_complet.csv
: /g/public_html/imapsync/W/paypal_reply/paypal_bilan --first_in 1094 --usdeur 1.4380 /g/paypal/paypal_2011_10_complet.csv
: /g/public_html/imapsync/W/paypal_reply/paypal_bilan --first_in 1185 --usdeur 1.3387 /g/paypal/paypal_2011_11_complet.csv
: /g/public_html/imapsync/W/paypal_reply/paypal_bilan --first_in 1263 --usdeur 1.3856 /g/paypal/paypal_2011_12_complet.csv
: /g/public_html/imapsync/W/paypal_reply/paypal_bilan --first_in 1335 /g/paypal/paypal_2012_01_complet.csv
: /g/public_html/imapsync/W/paypal_reply/paypal_bilan --first_in 999 --usdeur 1.4380 /g/paypal/paypal_2011_09_complet.csv
: /g/public_html/imapsync/W/paypal_reply/paypal_bilan --first_in 1094 --usdeur 1.3387 /g/paypal/paypal_2011_10_complet.csv
: /g/public_html/imapsync/W/paypal_reply/paypal_bilan --first_in 1185 --usdeur 1.3856 /g/paypal/paypal_2011_11_complet.csv
: /g/public_html/imapsync/W/paypal_reply/paypal_bilan --first_in 1263 --usdeur 1.3438 /g/paypal/paypal_2011_12_complet.csv
: /g/public_html/imapsync/W/paypal_reply/paypal_bilan --first_in 1335 --usdeur 1.2952 /g/paypal/paypal_2012_01_complet.csv
: /g/public_html/imapsync/W/paypal_reply/paypal_bilan --first_in 1417 /g/paypal/paypal_2012_02_complet.csv
: /g/public_html/imapsync/W/paypal_reply/paypal_bilan --first_in 1508 /g/paypal/paypal_2012_03_complet.csv
: /g/public_html/imapsync/W/paypal_reply/paypal_bilan --first_in 1575 /g/paypal/paypal_2012_04_complet.csv
: /g/public_html/imapsync/W/paypal_reply/paypal_bilan --first_in 1654 /g/paypal/paypal_2012_05_complet.csv
: /g/public_html/imapsync/W/paypal_reply/paypal_bilan --first_in 1743 /g/paypal/paypal_2012_06_complet.csv
: /g/public_html/imapsync/W/paypal_reply/paypal_bilan --first_in 1824 /g/paypal/paypal_2012_07_complet.csv
set +x
# La totale
: || /g/public_html/imapsync/W/paypal_reply/paypal_bilan --bnc --debug \
--first_in 147 --avoid_numbers '292 293 643 644 731 732 1093 1330 1331 1332 1333 1334' \
--first_in 147 --avoid_numbers '292 293 643 644 731 732 1093 1330 1331 1332 1333 1334 1652 1653' \
/g/paypal/paypal_201?_??_complet.csv
: || /g/public_html/imapsync/W/paypal_reply/paypal_bilan \
--first_in 147 --avoid_numbers '292 293 643 644 731 732 1093 1330 1331 1332 1333 1334' \
--first_in 147 --avoid_numbers '292 293 643 644 731 732 1093 1330 1331 1332 1333 1334 1652 1653' \
/g/paypal/paypal_201?_??_complet.csv
echo 'sh paypal_build_invoices /g/var/paypal_invoices/1???'
# USD de 147 à 340
# EUR de 341 à ...
@ -67,43 +73,6 @@ echo 'sh paypal_build_invoices /g/var/paypal_invoices/1???'
# 20110412 Found problems with 189 199 242 249 258 263 359 382 537
# cen cen JAP cen cen cen cen TCH JAP
# cen
# 155 TVA 1,89
# 171 TVA 4,42
# 220 TVA 3,16
# 225 TVA 3,16
# 236 TVA 4,42
# 298 TVA 3,16
# 307 TVA 4,42
# 312 TVA 4,42
# 324 TVA 4,42
# 351 TVA 4,92
# 395 TVA 4,92
# 408 TVA 4,92
# 419 TVA 4,92
# 432 TVA 4,92
# 435 TVA 4,92
# 452 TVA 4,92
# 460 TVA 4,92
# 461 TVA 4,92
# 463 TVA 4,92
# 464 TVA 4,92
# 475 TVA 4,92
# 487 TVA 4,92
# 489 TVA 4,92
# 502 TVA 4,92
# 504 TVA 4,92
# 511 TVA 4,92
# 522 TVA 4,92
# 523 TVA 4,92
# 533 TVA 4,92
# 537 TVA 4,92
# 540 TVA 4,92
# 543 TVA 4,92
# 549 TVA 4,92
# 551 TVA 4,92
# 552 TVA 4,92
# 556 TVA 4,92
# 563 TVA 4,92
for d in "$@"; do
echo "==== $d ===="
@ -118,7 +87,7 @@ for d in "$@"; do
rm -f facture_imapsync-$bd.tex
cp -f ../facture_imapsync-000.tex facture_imapsync-$bd.tex
if ! pdflatex facture_imapsync-$bd.tex < /dev/null > /dev/null; then
if { ! pdflatex facture_imapsync-$bd.tex < /dev/null > /dev/null || test -f facture_imapsync-${bd}_good.tex ; } then
echo "PB $bd"
if test -f facture_imapsync-${bd}_good.tex \
&& pdflatex facture_imapsync-${bd}_good.tex < /dev/null > /dev/null

View file

@ -1,6 +1,6 @@
#!/usr/bin/perl
# $Id: paypal_build_reply,v 1.17 2011/12/07 23:47:03 gilles Exp gilles $
# $Id: paypal_build_reply,v 1.19 2012/04/30 22:57:04 gilles Exp gilles $
use warnings;
use strict;
@ -11,7 +11,7 @@ my ($amount, $name, $email);
my (
$paypal_line, $paypal_info,
$buyer, $description, $object,
$url_source, $url_exe, $url, $release, $release_exe,
$url, $release, $release_exe,
);
my $help ;
@ -52,8 +52,6 @@ while(<>) {
$release = firstline( '/g/public_html/imapsync/VERSION' ) ;
$release_exe = firstline( '/g/public_html/imapsync/VERSION_EXE' ) ;
my $path_last = firstline( '/g/public_html/imapsync/dist/path_last.txt' ) ;
$url_source = firstline( '/g/var/paypal_reply/url_source' ) ;
$url_exe = firstline( '/g/var/paypal_reply/url_exe' ) ;
$url = "http://ks.lamiral.info/imapsync/dist/$path_last/" ;
@ -99,7 +97,7 @@ while(<>) {
my $address = 'gilles.lamiral@laposte.net';
my $address2 = 'gilles@lamiral.info';
my $rcstag = '$Id: paypal_build_reply,v 1.17 2011/12/07 23:47:03 gilles Exp gilles $';
my $rcstag = '$Id: paypal_build_reply,v 1.19 2012/04/30 22:57:04 gilles Exp gilles $';
my $download_info = "You will find the latest imapsync.exe binary (release $release_exe)
and the latest imapsync source code (release $release) at the following link:
@ -147,7 +145,7 @@ my $subject_support = "[imapsync support] imapsync release $release [$email]" ;
my $subject ;
my $text ;
if ( 'imapsync support' eq $object ) {
if ( $object =~ m{imapsync support} ) {
$text = $text_support ;
$subject = $subject_support ;
}else{
@ -194,7 +192,7 @@ EOM
print $message;
#print "[$amount] [$name] [$email] [$paypal_line] [$object]\n";
$debug and print "[$amount] [$name] [$email] [$paypal_line] [$object]\n";
sub firstline {

View file

@ -1,6 +1,6 @@
#!/bin/sh
# $Id: paypal_functions,v 1.18 2011/12/02 01:56:55 gilles Exp gilles $
# $Id: paypal_functions,v 1.19 2012/04/17 12:05:32 gilles Exp gilles $
paypal_prerequisites() {
perl -mMIME::Lite -e '' || echo 'sudo aptitude install libmime-lite-perl'
@ -105,9 +105,9 @@ convert_utf8() {
troncate_last_2_chars() {
length=`expr length "$1"`
length_2=`expr $length - 2`
expr substr "$1" 1 $length_2
length=`expr length "$1"`
length_2=`expr $length - 2`
expr substr "$1" 1 $length_2
}
@ -115,16 +115,17 @@ build_reply() {
mkdir -p $tmpdir/msg_reply/
test -z "`ls $tmpdir/msg_out/`" && echo no mail && return
for f in $tmpdir/msg_out_utf8/*/*.txt; do
echo "$f"
#echo "$f"
d=`dirname "$f"`
bd=`basename "$d"`
file_id=`troncate_last_2_chars $bd`
d_reply="$tmpdir/msg_reply/$file_id"
test -f "$d_reply/$file_id.txt" && continue
test -s "$d_reply/$file_id.txt" && continue
mkdir -p "$d_reply"
echo building "$d_reply/$file_id.txt"
echo paypal_build_reply "$f" "$tmpdir/msg_id/$file_id"
paypal_build_reply "$f" "$tmpdir/msg_id/$file_id" > "$d_reply/$file_id.txt"
test -s "$d_reply/$file_id.txt" || rm "$d_reply/$file_id.txt"
done
}

183
imapsync
View file

@ -20,7 +20,7 @@ Synchronise mailboxes between two imap servers.
Good at IMAP migration. More than 44 different IMAP server softwares
supported with success.
$Revision: 1.488 $
$Revision: 1.498 $
=head1 SYNOPSIS
@ -363,14 +363,10 @@ Success stories reported with the following 44 imap servers
- Courier IMAP 1.5.1, 2.2.0, 2.1.1, 2.2.1, 3.0.8, 3.0.3, 4.1.1 (GPL)
(http://www.courier-mta.org/)
- Critical Path (7.0.020)
- Cyrus IMAP 1.5, 1.6, 2.1, 2.1.15, 2.1.16, 2.1.18
2.2.1, 2.2.2-BETA, 2.2.10, 2.2.12,
v2.2.3-Invoca-RPM-2.2.3-8,
2.3-alpha (OSI Approved),
v2.2.12-Invoca-RPM-2.2.12-3.RHEL4.1,
2.2.13,
v2.3.1-Invoca-RPM-2.3.1-2.7.fc5,
v2.3.7,
- Cyrus IMAP 1.5, 1.6,
2.1, 2.1.15, 2.1.16, 2.1.18
2.2.1, 2.2.2-BETA, 2.2.3, 2.2.6, 2.2.10, 2.2.12, 2.2.13,
2.3-alpha (OSI Approved), 2.3.1, 2.3.7, 2.3.16
(http://asg.web.cmu.edu/cyrus/)
- David Tobit V8 (proprietary Message system).
- DBMail 1.2.1, 2.0.4, 2.0.9, 2.2rc1 (GPL) (http://www.dbmail.org/).
@ -391,7 +387,7 @@ Success stories reported with the following 44 imap servers
- Kerio 7.2.0 Patch 1 [host1] [host2]
- MailEnable 4.23 [host1] [host2], 4.26 [host1][host2], 5 [host1]
- MDaemon 7.0.1, 8.0.2, 8.1, 9.5.4 (Windows server 2003 R2 platform), 12 [host2],
12.0.3 [host1]
12.0.3 [host1], 12.5.5 [host1],
- Mercury 4.1 (Windows server 2000 platform)
- Microsoft Exchange Server 5.5, 6.0.6249.0[host1], 6.0.6487.0[host1],
6.5.7638.1 [host2], 6.5 [host1], Exchange 2007 SP1 (with Update Rollup 2),
@ -519,7 +515,7 @@ Entries for imapsync:
Feedback (good or bad) will often be welcome.
$Id: imapsync,v 1.488 2012/04/15 17:38:21 gilles Exp gilles $
$Id: imapsync,v 1.498 2012/07/20 14:28:45 gilles Exp gilles $
=cut
@ -636,7 +632,7 @@ my(
# global variables initialisation
$rcs = '$Id: imapsync,v 1.488 2012/04/15 17:38:21 gilles Exp gilles $ ';
$rcs = '$Id: imapsync,v 1.498 2012/07/20 14:28:45 gilles Exp gilles $ ';
$total_bytes_transferred = 0;
$total_bytes_skipped = 0;
@ -735,10 +731,10 @@ $split1 ||= 100;
$split2 ||= 100;
$host1 || missing_option("--host1") ;
$port1 ||= (defined $ssl1 and !defined $tls1) ? 993 : 143;
$port1 ||= ( $ssl1 ) ? 993 : 143;
$host2 || missing_option("--host2") ;
$port2 ||= (defined $ssl2 && !defined $tls2) ? 993 : 143;
$port2 ||= ( $ssl2 ) ? 993 : 143;
$debugimap1 = $debugimap2 = 1 if ( $debugimap ) ;
$debug = 1 if ( $debugimap1 or $debugimap2 ) ;
@ -870,17 +866,21 @@ my %useheader ;
print "Host1: imap server [$host1] port [$port1] user [$user1]\n";
print "Host2: imap server [$host2] port [$port2] user [$user2]\n";
$password1 || $passfile1 || do {
$password1 = ask_for_password($authuser1 || $user1, $host1);
};
$password1 || $passfile1 || 'PREAUTH' eq $authmech1 || do {
$password1 = ask_for_password( $authuser1 || $user1, $host1 ) ;
} ;
$password1 = (defined($passfile1)) ? firstline ($passfile1) : $password1;
$password1 = ( defined( $passfile1 ) ) ? firstline ( $passfile1 ) : $password1 ;
$password2 || $passfile2 || do {
$password2 = ask_for_password($authuser2 || $user2, $host2);
};
$password2 || $passfile2 || 'PREAUTH' eq $authmech2 || do {
$password2 = ask_for_password( $authuser2 || $user2, $host2 ) ;
} ;
$password2 = (defined($passfile2)) ? firstline ($passfile2) : $password2;
$password2 = ( defined( $passfile2 ) ) ? firstline ( $passfile2 ) : $password2 ;
my $dry_message = '' ;
$dry_message = "\t(not really since --dry mode)" if $dry ;
if ( ! ( 1
or ( $maxsize
@ -918,9 +918,9 @@ $debug and print "Host2 Buffer I/O: ", $imap2->Buffer(), "\n";
die_clean() unless $imap1->IsAuthenticated();
die_clean( 'Not authenticated on host1' ) unless $imap1->IsAuthenticated( ) ;
print "Host1: state Authenticated\n";
die_clean() unless $imap2->IsAuthenticated();
die_clean( 'Not authenticated on host2' ) unless $imap2->IsAuthenticated( ) ;
print "Host2: state Authenticated\n";
print "Host1 capability: ", join(" ", $imap1->capability_update()), "\n";
@ -1080,6 +1080,9 @@ print "++++ Looping on each folder\n";
FOLDER: foreach my $h1_fold (@h1_folders_wanted) {
last FOLDER if $imap1->IsUnconnected();
last FOLDER if $imap2->IsUnconnected();
my $h2_fold = imap2_folder_name( $h1_fold ) ;
#relogin1( ) if ( $relogin1 ) ;
printf( "%-35s -> %-35s\n", "[$h1_fold]", "[$h2_fold]" ) ;
@ -1107,7 +1110,7 @@ FOLDER: foreach my $h1_fold (@h1_folders_wanted) {
my $permanentflags2 = permanentflags( @select_results ) ;
$debug and print "permanentflags: $permanentflags2\n" ;
if ( $expunge or $expunge1 ){
print "Expunging host1 $h1_fold\n" ;
print "Expunging host1 $h1_fold $dry_message\n" ;
unless($dry) { $imap1->expunge() } ;
#print "Expunging host2 $h2_fold\n" ;
#unless($dry) { $imap2->expunge() } ;
@ -1121,6 +1124,9 @@ FOLDER: foreach my $h1_fold (@h1_folders_wanted) {
next FOLDER if ($justfolders);
last FOLDER if $imap1->IsUnconnected();
last FOLDER if $imap2->IsUnconnected();
my $h1_msgs_all_hash_ref = { } ;
my @h1_msgs = select_msgs( $imap1, $h1_msgs_all_hash_ref );
@ -1141,6 +1147,9 @@ FOLDER: foreach my $h1_fold (@h1_folders_wanted) {
my $cache_dir = cache_folder( $cache_base, $h1_fold, $h2_fold );
my ( $cache_1_2_ref, $cache_2_1_ref ) = ( {}, {} );
last FOLDER if $imap1->IsUnconnected();
last FOLDER if $imap2->IsUnconnected();
if ( $usecache ) {
print "cache directory: $cache_dir\n" ;
mkpath( "$cache_dir" ) ;
@ -1324,7 +1333,7 @@ FOLDER: foreach my $h1_fold (@h1_folders_wanted) {
$imap2->uidexpunge( \@h2_expunge ) if ! $dry ;
}
if ($expunge2){
print "Expunging host2 folder $h2_fold\n" ;
print "Expunging host2 folder $h2_fold $dry_message\n" ;
$imap2->expunge( ) if ! $dry ;
}
}
@ -1333,12 +1342,15 @@ FOLDER: foreach my $h1_fold (@h1_folders_wanted) {
$debug and print "Host2 uidnext: $h2_uidnext\n" ;
$h2_uidguess = $h2_uidnext ;
MESS: foreach my $m_id (@h1_hash_keys_sorted_by_uid) {
my $h1_size = $h1_hash{$m_id}{'s'};
my $h1_msg = $h1_hash{$m_id}{'m'};
my $h1_idate = $h1_hash{$m_id}{'D'};
unless (exists($h2_hash{$m_id})) {
# copy
last FOLDER if $imap1->IsUnconnected();
last FOLDER if $imap2->IsUnconnected();
copy_message( $h1_msg, $h1_fold, $h2_fold, $h1_fir_ref, $permanentflags2, $cache_dir ) ;
last FOLDER if total_bytes_max_reached( ) ;
next MESS;
@ -1363,16 +1375,20 @@ FOLDER: foreach my $h1_fold (@h1_folders_wanted) {
$debug and print
"Host1 size msg $h1_fold/$h1_msg = $h1_size <> $h2_size = Host2 $h2_fold/$h2_msg\n";
if( $delete ) {
print "Host1 msg $h1_fold/$h1_msg deleted\n";
my $expunge_message = '' ;
$expunge_message = "and expunged" if ( $expunge or $expunge1 ) ;
print "Host1 msg $h1_fold/$h1_msg marked deleted $expunge_message $dry_message\n" ;
unless( $dry ) {
$imap1->delete_message( $h1_msg );
$h1_nb_msg_deleted += 1;
$imap1->expunge() if ( $expunge or $expunge1 );
$imap1->delete_message( $h1_msg ) ;
$h1_nb_msg_deleted += 1 ;
$imap1->expunge() if ( $expunge or $expunge1 ) ;
}
}
}
# END MESS: loop
last FOLDER if $imap1->IsUnconnected();
last FOLDER if $imap2->IsUnconnected();
MESS_IN_CACHE: foreach my $h1_msg ( @h1_msgs_in_cache ) {
my $h2_msg = $cache_1_2_ref->{ $h1_msg } ;
$debugcache and print "cache messages update flags $h1_msg->$h2_msg\n";
@ -1386,16 +1402,18 @@ FOLDER: foreach my $h1_fold (@h1_folders_wanted) {
MESS_BY_UID: foreach my $h1_msg ( sort { $a <=> $b } keys %h1_msgs_copy_by_uid ) {
#
$debug and print "Copy by uid $h1_fold/$h1_msg\n" ;
last FOLDER if $imap1->IsUnconnected();
last FOLDER if $imap2->IsUnconnected();
copy_message( $h1_msg, $h1_fold, $h2_fold, $h1_fir_ref, $permanentflags2, $cache_dir ) ;
last FOLDER if total_bytes_max_reached( ) ;
}
if ($expunge or $expunge1){
print "Expunging host1 folder $h1_fold\n";
print "Expunging host1 folder $h1_fold $dry_message\n";
unless($dry) { $imap1->expunge() };
}
if ($expunge2){
print "Expunging host2 folder $h2_fold\n";
print "Expunging host2 folder $h2_fold $dry_message\n";
unless($dry) { $imap2->expunge() };
}
@ -1635,7 +1653,10 @@ sub myconnect {
$self->Banner($banner);
$self->RawSocket2($sock);
$self->State(Connected);
if ($banner =~ /\* PREAUTH/)
{
$self->State(Authenticated);
}
if ($self->Tls) {
starttls($self);
$self->Starttls( 1 ) ;
@ -1663,7 +1684,7 @@ sub starttls {
unless ($self->has_capability("STARTTLS")) {
die_clean( "No STARTTLS capability" );
}
print $socket, "\n";
print $socket "z00 STARTTLS\015\012";
CORE::select( undef, undef, undef, 0.025 );
my $txt = $socket->getline();
@ -1790,6 +1811,15 @@ sub login_imap {
print "Banner: ", server_banner($imap);
if ( $authmech eq 'PREAUTH' ) {
if ( $imap->IsAuthenticated( ) ) {
$imap->Socket ;
printf("Info: Assuming PREAUTH for host %s\n", $imap->Server ) ;
}else{
die_clean( "Failure: error login on [$host] with user [$user] auth [PREAUTH]" ) ;
}
}
if ($imap->has_capability("AUTH=$authmech")
or $imap->has_capability($authmech)
) {
@ -1808,7 +1838,7 @@ sub login_imap {
if ($proxyauth) {
$imap->Authmechanism("");
} else {
$imap->Authmechanism($authmech) unless ($authmech eq 'LOGIN');
$imap->Authmechanism( $authmech ) unless ( $authmech eq 'LOGIN' or $authmech eq 'PREAUTH' ) ;
}
$imap->Authcallback(\&plainauth) if $authmech eq "PLAIN";
@ -1826,17 +1856,20 @@ sub login_imap {
$imap->Password($password);
}
unless ($imap->login()) {
my $info = "Failure: error login [$host] with user [$user] auth";
my $einfo = $imap->LastError || @{$imap->History}[-1];
chomp($einfo);
my $error = "$info [$authmech]: $einfo\n";
print $error; # note: duplicating error on stdout/stderr
die_clean($error) if ($authmech eq 'LOGIN' or $imap->IsUnconnected() or $authuser);
print "Info: trying LOGIN Auth mechanism on [$host] with user [$user]\n";
$imap->Authmechanism("");
unless ( $authmech eq 'PREAUTH' or $imap->login( ) ) {
my $info = "Failure: error login on [$host] with user [$user] auth" ;
my $einfo = $imap->LastError || @{$imap->History}[-1] ;
chomp( $einfo ) ;
my $error = "$info [$authmech]: $einfo\n" ;
if ( $authmech eq 'LOGIN' or $imap->IsUnconnected( ) or $authuser ) {
die_clean( $error ) ;
}else{
print $error ;
}
print "Info: trying LOGIN Auth mechanism on [$host] with user [$user]\n" ;
$imap->Authmechanism("") ;
$imap->login() or
die_clean("$info [LOGIN]: ", $imap->LastError, "\n");
die_clean("$info [LOGIN]: ", $imap->LastError, "\n") ;
}
$proxyauth && $imap->proxyauth($user);
$split and $imap->Split( $split ) ;
@ -1868,8 +1901,8 @@ sub banner_imapsync {
my @argv_copy = @_;
my $banner_imapsync = join("",
'$RCSfile: imapsync,v $ ',
'$Revision: 1.488 $ ',
'$Date: 2012/04/15 17:38:21 $ ',
'$Revision: 1.498 $ ',
'$Date: 2012/07/20 14:28:45 $ ',
"\n",localhost_info(), "\n",
"Command line used:\n",
"$0 ", command_line_nopassword(@argv_copy), "\n",
@ -2746,7 +2779,7 @@ sub copy_message {
$h1_flags =~ s@\\Recent\s?@@gi;
$h1_flags = flags_regex($h1_flags) if @regexflag;
$h1_flags = flagsCase( $h1_flags ) if $flagsCase ;
$h1_flags = flags_filter($h1_flags, $permanentflags2) if ($permanentflags2);
$h1_flags = flags_filter( $h1_flags, $permanentflags2) if ( $permanentflags2 and $filterflags ) ;
my $new_id;
$debug and print "msg $h1_fold/$h1_msg date [$h1_date] flags [$h1_flags] size [$h1_size]\n";
@ -3309,6 +3342,23 @@ sub regexmess {
return($string);
}
sub bytes_display_string {
my ($bytes) = @_;
if ($bytes < (1024 * 1024)) {
return sprintf("%.1f KiB", $bytes / 1024);
} elsif ($bytes < (1024 * 1024 * 1024)) {
return sprintf("%.1f MiB", $bytes / (1024 * 1024));
} elsif ($bytes < (1024 * 1024 * 1024 * 1024)) {
return sprintf("%.1f GiB", $bytes / (1024 * 1024 * 1024));
} elsif ($bytes < (1024 * 1024 * 1024 * 1024 * 1024)) {
return sprintf("%.1f TiB", $bytes / (1024 * 1024 * 1024 * 1024));
} else {
return sprintf("%.1f PiB", $bytes / (1024 * 1024 * 1024 * 1024 * 1024));
}
# if you have exabytes (EiB) of email to transfer, you have too much email
}
sub stats {
$timeend = time();
$timediff = $timeend - $timestart;
@ -3337,17 +3387,27 @@ sub stats {
print "Messages void (noheader) on host2 : $h2_nb_msg_noheader\n";
print "Messages deleted on host1 : $h1_nb_msg_deleted\n";
print "Messages deleted on host2 : $h2_nb_msg_deleted\n";
print "Total bytes transferred : $total_bytes_transferred\n";
print "Total bytes duplicate host1 : $h1_total_bytes_duplicate\n";
print "Total bytes duplicate host2 : $h2_total_bytes_duplicate\n";
print "Total bytes skipped : $total_bytes_skipped\n";
print "Total bytes error : $total_bytes_error\n";
printf( "Total bytes transferred : %d (%s)\n",
$total_bytes_transferred,
bytes_display_string($total_bytes_transferred));
printf( "Total bytes duplicate host1 : %d (%s)\n",
$h1_total_bytes_duplicate,
bytes_display_string($h1_total_bytes_duplicate));
printf( "Total bytes duplicate host2 : %d (%s)\n",
$h2_total_bytes_duplicate,
bytes_display_string($h2_total_bytes_duplicate));
printf( "Total bytes skipped : %d (%s)\n",
$total_bytes_skipped,
bytes_display_string($total_bytes_skipped));
printf( "Total bytes error : %d (%s)\n",
$total_bytes_error,
bytes_display_string($total_bytes_error));
$timediff ||= 1; # No division per 0
printf ("Message rate : %.1f messages/s\n", $nb_msg_transferred / $timediff);
printf ("Average bandwidth rate : %.1f KiB/s\n", $total_bytes_transferred / 1024 / $timediff);
print "Reconnections to host1 : $host1_reconnect_count\n";
print "Reconnections to host2 : $host2_reconnect_count\n";
printf ("Memory consumption : %.1f MB\n", $memory_consumption / 1024 / 1024);
printf ("Memory consumption : %.1f MiB\n", $memory_consumption / 1024 / 1024);
print "Biggest message : $max_msg_size_in_bytes bytes\n";
# print "Memory/biggest message ratio : $memory_ratio\n";
print "Detected $nb_errors errors\n\n";
@ -3593,7 +3653,7 @@ sub parse_header_msg {
my $idate = $s_fir->{$m_uid}->{"INTERNALDATE"};
$size = length($headstr) unless ($size);
my $m_md5 = md5_base64($headstr);
$debug and print "$s uid $m_uid sig $m_md5 size $size\n";
$debug and print "$s uid $m_uid sig $m_md5 size $size idate $idate\n";
my $key;
if ($skipsize) {
$key = "$m_md5";
@ -3674,7 +3734,7 @@ sub check_last_release {
}
sub imapsync_version {
my $rcs = '$Id: imapsync,v 1.488 2012/04/15 17:38:21 gilles Exp gilles $ ';
my $rcs = '$Id: imapsync,v 1.498 2012/07/20 14:28:45 gilles Exp gilles $ ';
$rcs =~ m/,v (\d+\.\d+)/;
my $VERSION = ($1) ? $1: "UNKNOWN";
return($VERSION);
@ -4270,12 +4330,13 @@ sub delete_folders_in_2_not_in_1 {
print "Not deleting $folder because of --delete2foldersbutnot $delete2foldersbutnot\n";
next;
}
my $res = $dry; # always success in dry mode!
$res = $imap2->delete($folder) if ( ! $dry ) ;
if ($res) {
print "Delete $folder", "$dry_message", "\n";
my $res = $dry ; # always success in dry mode!
$imap2->unsubscribe( $folder ) if ( ! $dry ) ;
$res = $imap2->delete( $folder ) if ( ! $dry ) ;
if ( $res ) {
print "Delete $folder", "$dry_message", "\n" ;
}else{
print "Delete $folder failure", "\n";
print "Delete $folder failure", "\n" ;
}
}
}

View file

@ -5,7 +5,7 @@
<title>Imapsync: an IMAP migration tool ( release <!--#exec cmd="cat VERSION"--> )</title>
<meta name="generator" content="Bluefish 1.0.7"/>
<meta name="author" content="Gilles LAMIRAL"/>
<meta name="date" content="2012-04-15T21:16:36+0200"/>
<meta name="date" content="2012-07-20T16:47:33+0200"/>
<meta name="copyright" content="None"/>
<meta name="keywords" content="imap, transfert, migration"/>
<meta name="description" content="imap migration tool"/>
@ -63,11 +63,12 @@ for <b>2 ways synchronizations</b>.
<p>Alternatives to imapsync are listed in the <a href="#similar"><b>Similar softwares</b></a> section.
</p>
<h2><a id="NUMBERS"></a>Some numbers for 2011</h2>
<h2><a id="NUMBERS"></a>Some numbers for 2011 and 2012</h2>
<ul>
<li>Number of <b>imapsync users</b> per month: between <b>2 and 3 thousands </b>users</li>
<li>Number of <b>imapsync transfers</b> between <b>3 and 25 millions mailboxes </b>transfers per month, total is 93 millions in 2011</li>
<li>Number of <b>imapsync transfers</b> between <b>3 and 25 millions mailboxes </b>transfers per month,
total is 93 millions for 2011</li>
<li>Percentage between <b>operating systems</b> users running imapsync:
<ul>
<li><b>Linux: 65 %</b></li>
@ -93,15 +94,29 @@ for <b>2 ways synchronizations</b>.
<p>New features or bugfixes since previous releases:</p>
<ul>
<li><b>1.498</b></li>
<li><b>Usability</b>: Use KiB MiB GiB etc in result summary. Patch from Mark Atwood.</li>
<li><b>Enhancement</b>: Added --authmech PREAUTH capabiliy. (Patch from David Abrahams).</li>
<li><b>Bug fix</b>: Unsubsribe folder before deleting it (deleting alone could bug sometimes on some servers).</li>
<li><b>Bug fix</b>: Added several connection ckecks like old good imapsync-1.181 to imapsync-1.398 (Phil idea)</li>
<li><b>Bug fix</b>: Default port 993 when --ssl and --tls are set together (was 143).</li>
<li><b>Bug fix</b>: Don't filter flag when --nofilterflags is used during the message copy.</li>
<li><b>Usability</b>: Print dry mode when expunging in dry mode.</li>
<li><b>Usability</b>: Added value of internal date in --debug mode.</li>
</ul>
<ul>
<li><b>1.488</b></li>
<li><b>Bug fix</b>: Reverse half of the last patch about --delete2foldersonly since it destroyed a good feature permitting imapsync variables like ${h2_sep}
in --delete2foldersonly, the good escaping has to be done in the parameter value:
<ul>
<li>--delete2foldersonly --delete2foldersbutnot need good escaping in call, not in code. Example: --delete2foldersbutnot "/\[Gmail\]/"</li>
</ul>
</li>
<li>Bug fix: removed several useless Perl warnings in different contexts.</li>
<li><b>Bug fix</b>: Reverse half of the last patch about --delete2foldersonly since it destroyed
a good feature permitting imapsync variables like ${h2_sep} in --delete2foldersonly,
the good escaping has to be done in the parameter value.
Example: --delete2foldersbutnot "/\[Gmail\]/"</li>
<li><b>Win32 fix</b>: updated Perl modules to latest, it fixes a compile error that happened sometimes on XP.
imapsync.exe is smaller now.</li>
<li>Update: tested with Perl Module Mail-IMAPClient-3.31</li>
</ul>
<ul>
@ -150,8 +165,6 @@ Thanks to Phil Pearl for this advice.</li>
</ul>
<!--
<p>The next imapsync release should see:</p>
<ul>
@ -196,18 +209,18 @@ See <b><a href="./file.txt">file.txt</a></b> example for <b>batch massive migrat
</p>
<p>
The Perl <b>imapsync</b> source code will run anywhere a <b>Perl interpreter can run</b>: any Unix, Linux, Windows, or Mac OS operating system.
The Perl <b>imapsync</b> source code will run anywhere a <b>Perl interpreter can run</b>:
any Unix, Linux, Windows, or Mac OS operating system.
</p>
<p>
<b>+ One year</b> of imapsync <b>updates</b> without extra payment.<br/>
<b>+ 30 days money-back guarantee!</b><br/>
<b>+ Limited support</b>.
</p>
<p>
Payment by Paypal account and credit card accepted. <br/>
Price <b>42 EUR</b> is equal to around <b>54 USD</b>, no problem to pay in USD (or any currency) via paypal:
Price <b>42 EUR</b> is equal to around <b>50 USD</b>, no problem to pay in USD (or any currency) via paypal:
</p>
@ -226,34 +239,12 @@ name="submit" alt="PayPal - The safer, easier way to pay online!"/>
</p>
</form>
<p>You will receive a download link <b>just after</b> the payment.
<p>You will receive a <b>download link just after</b> the payment.<br/>
You will also receive a gpg signed <b>invoice</b> within <b>a few days by email</b>.<br/>
Please give a <b>postal address where the invoice will be needed</b> (your company for example),
since reedit is not easy (and forbidden by law).
</p>
<h2><a id="buy_support"></a>Buy full professional support for imapsync</h2>
<p>You will be able to expose your issues by email or phone and we'll work together until complete success.
</p>
<p>For <b>90 EUR</b> buy imapsync <b>full support</b> done by the imapsync designer/developper.
</p>
<p>
Payment by Paypal account and credit card accepted. <br/>
90 EUR is equal to around <b>120 USD</b>, no problem to pay in USD (or any currency) with paypal:
</p>
<form action="https://www.paypal.com/cgi-bin/webscr" method="post">
<p>
<input type="hidden" name="cmd" value="_s-xclick" />
<input type="hidden" name="hosted_button_id" value="E25UVGFNDJWW8" />
<input type="image"
src="https://www.paypalobjects.com/WEBSCR-640-20110401-1/en_US/i/btn/btn_buynowCC_LG.gif"
name="submit"
alt="PayPal - The safer, easier way to pay online!" />
<img alt="" src="https://www.paypalobjects.com/WEBSCR-640-20110401-1/fr_FR/i/scr/pixel.gif" width="1" height="1" />
<input name="return" type="hidden" value="http://imapsync.lamiral.info/paypal_return_support.shtml?utm_nooverride=1" />
</p>
</form>
<h2><a id="buy_exe"></a>Buy standalone imapsync.exe for win32</h2>
@ -266,12 +257,11 @@ buying the latest win32 <b>standalone imapsync.exe</b> for <b>42 EUR</b>
<p>
<b>+ One year</b> of imapsync <b>updates</b> without extra payment.<br/>
<b>+ 30 days money-back guarantee!</b><br/>
<b>+ Limited support</b>.
</p>
<p>
Payment by Paypal account and credit card accepted. <br/>
Price <b>42 EUR</b> is equal to around <b>54 USD</b>, no problem to pay in USD (or any currency) via paypal:
Price <b>42 EUR</b> is equal to around <b>50 USD</b>, no problem to pay in USD (or any currency) via paypal:
</p>
<form action="https://www.paypal.com/cgi-bin/webscr" method="post">
@ -290,6 +280,9 @@ name="submit" alt="PayPal - The safer, easier way to pay online!"/>
</form>
<p>You will receive a download link <b>just after</b> the payment.<br/>
You will also receive a gpg signed <b>invoice</b> within <b>a few days by email</b>.<br/>
Please give a <b>postal address where the invoice will be needed</b> (your company for example),
since reedit is not easy (and forbidden by law).
</p>
@ -299,6 +292,35 @@ thanks to Strawberry Perl 5.12 and Par::Packer module.<br/>
The build system for imapsync.exe is XP Pro SP2 on a Intel Celeron 400 MHz 256 Mo RAM. </p>
-->
<h2><a id="buy_support"></a>Buy full professional support for imapsync</h2>
<p>You will be able to expose your issues by email or phone and we'll work together until complete success.
</p>
<p>For <b>90 EUR</b> buy imapsync <b>full support</b> done by the imapsync designer/developper.
</p>
<p>
Payment by Paypal account and credit card accepted. <br/>
90 EUR is equal to around <b>110 USD</b>, no problem to pay in USD (or any currency) with paypal:
</p>
<form action="https://www.paypal.com/cgi-bin/webscr" method="post">
<p>
<input type="hidden" name="cmd" value="_s-xclick" />
<input type="hidden" name="hosted_button_id" value="E25UVGFNDJWW8" />
<input type="image"
src="https://www.paypalobjects.com/WEBSCR-640-20110401-1/en_US/i/btn/btn_buynowCC_LG.gif"
name="submit"
alt="PayPal - The safer, easier way to pay online!" />
<img alt="" src="https://www.paypalobjects.com/WEBSCR-640-20110401-1/fr_FR/i/scr/pixel.gif" width="1" height="1" />
<input name="return" type="hidden" value="http://imapsync.lamiral.info/paypal_return_support.shtml?utm_nooverride=1" />
</p>
</form>
<p>You will also receive a gpg signed <b>invoice</b> within <b>a few days by email</b>.<br/>
Please give a <b>postal address where the invoice will be needed</b> (your company for example),
since reedit is not easy (and forbidden by law).
</p>
<h2>Documentation</h2>
@ -399,15 +421,10 @@ Don't hesitate to have a try, I will help you and make efforts to switch them to
<li>Courier IMAP 1.5.1, 2.2.0, 2.1.1, 2.2.1, 3.0.8, 3.0.3, 4.1.1 (GPL)
(http://www.courier-mta.org/)</li>
<li>Critical Path (7.0.020)</li>
<li>Cyrus IMAP 1.5, 1.6, 2.1, 2.1.15, 2.1.16, 2.1.18
2.2.1, 2.2.2-BETA, 2.2.10, 2.2.12,
v2.2.3-Invoca-RPM-2.2.3-8,
2.3-alpha (OSI Approved),
v2.2.12-Invoca-RPM-2.2.12-3.RHEL4.1,
2.2.13,
v2.3.1-Invoca-RPM-2.3.1-2.7.fc5,
v2.3.1-Invoca-RPM-2.3.1-2.8.fc5 [host1],
v2.3.7,
<li>Cyrus IMAP 1.5, 1.6,
2.1, 2.1.15, 2.1.16, 2.1.18
2.2.1, 2.2.2-BETA, 2.2.3, 2.2.6, 2.2.10, 2.2.12, 2.2.13,
2.3-alpha (OSI Approved), 2.3.1, 2.3.7, 2.3.16
(http://asg.web.cmu.edu/cyrus/)
</li>
<li>David Tobit V8.</li>
@ -428,7 +445,7 @@ Don't hesitate to have a try, I will help you and make efforts to switch them to
<li>IMail 7.15 (Ipswitch/Win2003), 8.12, 11.03 [host1]</li>
<li>Kerio 7.2.0P1 [host1]</li>
<li><b>MailEnable</b> 4.23 [host1][host2], 4.26 [host1][host2], 5 [host1]</li>
<li>MDaemon 7.0.1, 8.0.2, 8.1, 9.5.4 (Windows server 2003 R2 platform), 12 [host2], 12.0.3 [host1]</li>
<li>MDaemon 7.0.1, 8.0.2, 8.1, 9.5.4 (Windows server 2003 R2 platform), 12 [host2], 12.0.3 [host1], 12.5.5 [host1]</li>
<li>Mercury 4.1 (Windows server 2000 platform)</li>
<li><b>Microsoft Exchange Server</b> 5.5, 6.0.6249.0[host1], 6.0.6487.0[host1],
6.5.7638.1 [host2], 6.5 [host1], Exchange 2007 SP1 (with Update Rollup 2),
@ -492,8 +509,8 @@ Prices are given par mailbox and may be outdated (december 2011).</p>
<li> Mailbox Mover 7 USD: <a href="https://mailboxmover.com/">https://mailboxmover.com/</a></li>
<li> Migrationwiz 10 USD: <a href="http://www.migrationwiz.com/">http://www.migrationwiz.com/</a></li>
<li> Rackspace migration 10 USD: <a href="http://www.rackspace.com/apps/email_hosting/migrations/">http://www.rackspace.com/apps/email_hosting/migrations/</a></li>
<li> Audriga Gmbh 9.99 EUR: <a href="https://www.email-umzug.de/en.html">https://www.email-umzug.de/</a></li>
<li> Yippiemove 15 USD: <a href="http://www.yippiemove.com">http://www.yippiemove.com/</a></li>
<li> Audriga Gmbh 14.99 EUR : <a href="https://www.email-umzug.de/en.html">https://www.email-umzug.de/</a></li>
<li> Trueswitch 29.5 USD: <a href="http://www.trueswitch.com">http://www.trueswitch.com</a></li>
</ul>
@ -523,7 +540,7 @@ alt="Viewable With Any Browser" />
<!--#config timefmt="%D" -->
<!--#config timefmt="%A %B %d, %Y" -->
<b>This document last modified on <!--#echo var="LAST_MODIFIED" --></b>
($Id: index.shtml,v 1.117 2012/04/15 19:16:51 gilles Exp gilles $)
($Id: index.shtml,v 1.122 2012/07/20 15:24:40 gilles Exp gilles $)
</p>
</body>

5543
patches/imapsync.dave Normal file

File diff suppressed because it is too large Load diff

View file

@ -36,7 +36,7 @@ border:0px;
<h1>imapsync donation</h1>
<p>Help the author to maintain imapsync:<br/>
(<b>1 EUR ~ 1.3 USD</b> on 02/2012)
(<b>1 EUR ~ 1.3 USD</b> on 06/2012)
</p>
<form action="https://www.paypal.com/cgi-bin/webscr" method="post">
<p>
@ -65,7 +65,7 @@ border:0px;
<!--#config timefmt="%D" -->
<!--#config timefmt="%A %B %d, %Y" -->
<b>This document last modified on <!--#echo var="LAST_MODIFIED" --></b>
($Id: paypal.shtml,v 1.6 2012/02/05 01:08:05 gilles Exp gilles $)
($Id: paypal.shtml,v 1.7 2012/06/10 09:06:46 gilles Exp gilles $)
</p>
</body>

View file

@ -1,6 +1,6 @@
#!/bin/sh
# $Id: tests.sh,v 1.194 2012/04/15 19:17:33 gilles Exp gilles $
# $Id: tests.sh,v 1.195 2012/07/18 11:10:00 gilles Exp gilles $
# Example 1:
# CMD_PERL='perl -I./Mail-IMAPClient-3.25/lib' sh -x tests.sh
@ -217,6 +217,18 @@ ll_ask_password() {
}
ll_authmech_PREAUTH() {
# No PREAUTH on my box
! $CMD_PERL ./imapsync \
--host1 $HOST1 --user1 tata --authmech1 PREAUTH \
--host2 $HOST2 --user2 titi \
--passfile2 ../../var/pass/secret.titi \
--justlogin
}
ll_timeout() {
$CMD_PERL ./imapsync \
@ -1021,12 +1033,6 @@ ll_include()
ll_exclude()
{
if can_send; then
#echo3 Here is plume
sendtestmessage
else
:
fi
$CMD_PERL ./imapsync \
--host1 $HOST1 --user1 tata \
--passfile1 ../../var/pass/secret.tata \
@ -1035,6 +1041,16 @@ ll_exclude()
--exclude '^INBOX.yop' --justfolders --nofoldersizes
}
ll_exclude_2()
{
$CMD_PERL ./imapsync \
--host1 $HOST1 --user1 tata \
--passfile1 ../../var/pass/secret.tata \
--host2 $HOST2 --user2 titi \
--passfile2 ../../var/pass/secret.titi \
--exclude '^INBOX.yop$' --justfolders --nofoldersizes
}
ll_exclude_INBOX()
{
$CMD_PERL ./imapsync \
@ -1432,6 +1448,15 @@ ll_ssl_justlogin() {
--justlogin
}
ll_ssl_tls_justlogin() {
$CMD_PERL ./imapsync \
--host1 $HOST1 --user1 tata \
--passfile1 ../../var/pass/secret.tata \
--host2 $HOST2 --user2 titi \
--passfile2 ../../var/pass/secret.titi \
--tls1 --ssl2 --tls2 \
--justlogin --debug
}
ll_ssl() {
if can_send; then
@ -1905,6 +1930,7 @@ gmail_gmail() {
}
gmail_gmail2() {
! ping -c1 imap.gmail.com || $CMD_PERL ./imapsync \
--host1 imap.gmail.com \
@ -1917,9 +1943,38 @@ gmail_gmail2() {
--passfile2 ../../var/pass/secret.imapsync.gl_gmail \
--folder INBOX
#--dry # --debug --debugimap # --authmech1 LOGIN
}
gmail_gmail3_delete() {
! ping -c1 imap.gmail.com || $CMD_PERL ./imapsync \
--host1 imap.gmail.com \
--ssl1 \
--user1 imapsync.gl@gmail.com \
--passfile1 ../../var/pass/secret.imapsync.gl_gmail \
--host2 imap.gmail.com \
--ssl2 \
--user2 gilles.lamiral@gmail.com \
--passfile2 ../../var/pass/secret.gilles_gmail \
--folder '[Gmail]/All Mail' --delete
# '[Gmail]/All Mail' is not expunge by default!
}
gmail_gmail4_tls() {
! ping -c1 imap.gmail.com || $CMD_PERL ./imapsync \
--host1 imap.gmail.com \
--ssl1 \
--user1 gilles.lamiral@gmail.com \
--passfile1 ../../var/pass/secret.gilles_gmail \
--host2 imap.gmail.com \
--ssl2 --tls2 --port2 993 \
--user2 imapsync.gl@gmail.com \
--passfile2 ../../var/pass/secret.imapsync.gl_gmail \
--folder INBOX
#--dry # --debug --debugimap # --authmech1 LOGIN
}
yahoo_xxxx_login() {
! ping -c1 imap.mail.yahoo.com || $CMD_PERL ./imapsync \
--host1 imap.mail.yahoo.com \
@ -2212,6 +2267,35 @@ ll_nofastio()
# specific tests
##########################
exchange_hoch_1() {
$CMD_PERL ./imapsync \
--host1 $HOST1 --user1 tata \
--passfile1 ../../var/pass/secret.tata \
--host2 ex.fhstp.ac.at --ssl2 --user2 nscdummy@fhstp.local \
--passfile2 ../../var/pass/secret.fhstp \
--folder INBOX.oneemail --debug --delete2
}
exchange_hoch_2() {
$CMD_PERL ./imapsync \
--host1 $HOST1 --user1 tata \
--passfile1 ../../var/pass/secret.tata \
--host2 ex.fhstp.ac.at --ssl2 --user2 nscdummy@fhstp.local \
--passfile2 ../../var/pass/secret.fhstp \
--folder INBOX.oneemail --dry --debugflags --debug --nofilterflags
}
exchange_hoch_3() {
$CMD_PERL ./imapsync \
--host1 $HOST1 --user1 tata \
--passfile1 ../../var/pass/secret.tata \
--host2 ex.fhstp.ac.at --ssl2 --user2 nscdummy2@fhstp.local \
--passfile2 ../../var/pass/secret.fhstp \
--folder INBOX.few_emails --debugflags --debug --regexflag 's#\$Forwarded#\$MDNSent#'
}
dbmail_uid() {
# --useuid alone does not work on dbmaikl server 2.2.17 ready to run
# because uids are += 2 and uidnext is in fact uidnext + 1
@ -2805,6 +2889,7 @@ ll_useuid
ll_useuid_nousecache
ll_noheader_force
ll_noheader
ll_authmech_PREAUTH
'
other_tests='