Fix emails date-time after migration to Dovecote
Many mail clients show wrong email receiving date-time, because file creation time is wrong after migration or restore. Here short review how to fix it for Dovecote on ISPConfig.
For right email migration the better solution - sync all emails over IMAP. Tools with I use is imapsync. But not always is possible. If email already in place, with wrong data - Not all so bad, we also can fix it.
fix_imap_time_for_apple_mail_app.sh I copy this script AS-IS.
For right email migration the better solution - sync all emails over IMAP. Tools with I use is imapsync. But not always is possible. If email already in place, with wrong data - Not all so bad, we also can fix it.
fix_imap_time_for_apple_mail_app.sh I copy this script AS-IS.
#!/bin/bash
#
# Date : July 4th, 2005
# Author: Benson Wong
# tummytech@gmail.com
#
# This shell script corrects email messages where the file system
# date does not match the Date: header in the email.
#
# This will fix problems with mail clients like Apple's mail.app
# which uses the file system timestamp resulting in emails with the
# wrong file system timestamp to display the wrong received date
#
# This script has to be run by a user [root] with the
# necessary privileges to read/modify files in a user's Maildir.
#
# To run this script on OSX, first install the coreutils and gawk
# packages from Homebrew or MacPorts.
#
function usage() {
if [ "$1" != "" ]; then
echo "$1"
fi
echo "Usage: $0 /path/to/user/Maildir"
exit 1
}
function email_date() {
local DATELINE=`grep -e "^Date: " "$1" | head -1`
local DELIVERYDATELINE=`grep -e "^Delivery-date: " "$1" | head -1`
if [ -n "$DELIVERYDATELINE" ]; then
local DATELINE="${DELIVERYDATELINE/elivery-d/}"
fi
# Fucked up date like Mon, 03 Nov 03 11:37:04 Romance Standard Time
local regex='^Date: ([A-Za-z]{3}, [0-9]{2} [A-Za-z]{3} [0-9]{2,4} [0-9]{1,2}:[0-9]{2}:[0-9]{2}) ([A-Za-z ]*)$'
if [[ $DATELINE =~ $regex ]]; then
EDATE=`$DATE -d "${BASH_REMATCH[1]}" "+%Y%m%d%H%M"`
return 0
fi
# Missing "+" before timezone
local regex='^Date: ([A-Za-z]*, [0-9]* [A-Za-z]* [0-9]{4} [0-9]{1,2}:[0-9]{2}:[0-9]{2}) ([0-9]{4})$'
if [[ $DATELINE =~ $regex ]]; then
EDATE=`$DATE -d "${BASH_REMATCH[1]} +${BASH_REMATCH[2]}" "+%Y%m%d%H%M"`
return 0
fi
# Remove day of the week
local regex='^Date: ([A-Za-z]*,) (.*)$'
if [[ $DATELINE =~ $regex ]]; then
EDATE=`$DATE -d "${BASH_REMATCH[2]}" "+%Y%m%d%H%M"`
return 0
fi
local regex='^Date: (.*)$'
if [[ $DATELINE =~ $regex ]]; then
EDATE=`$DATE -d "${BASH_REMATCH[1]}" "+%Y%m%d%H%M"`
return 0
fi
}
MDIR_PATH="$1"
if [ -x `which gls` ]; then
LS=gls
DATE=gdate
AWK=gawk
else
LS=ls
DATE=date
AWK=awk
fi
[ $# -lt 1 ] && usage
[ ! -d "$MDIR_PATH" ] && usage "Error: $MDIR_PATH does not exist"
[ ! -r "$MDIR_PATH" ] && usage "Error: $MDIR_PATH is not readable"
[ ! -w "$MDIR_PATH" ] && usage "Error: $MDIR_PATH is not writable"
# set the internal field separator to the newline character
# instead of the default "".
# This is required for handling filenames and directories with spaces
IFS="
"
set -f
echo "start"
# Find all emails
for i in `find $MDIR_PATH -type f | egrep -v "(courierimap|maildirsize|maildirfolder)"`; do
email_date "$i"
if [ -z "$EDATE" ]; then
echo ""
echo "Unparsable date for" `basename $i`
continue
fi
FDATE=`$LS -l --time-style=long-iso "$i" | $AWK '{print $6,$7}'`
# Reformat the date for touch.
ODATE=`$DATE -d "$FDATE" "+%Y%m%d%H%M"`
if [ "$EDATE" -eq "$ODATE" ]; then
# Skip it if the times are correct.
echo -n "."
continue
fi
echo ""
echo `basename $i` "from $ODATE to $EDATE"
touch -c -t "$EDATE" "$i"
done
echo ""
echo "done"
This script parse any email in Maildir, and change files date to email send date. What not right on Centos 7? This case not work as expected. You need just keep ls, date and awk.
if [ -x `which gls` ]; then LS=gls DATE=gdate AWK=gawk else LS=ls DATE=date AWK=awk fiAdd more exception. "dovecot" files.
for i in `find $MDIR_PATH -type f | egrep -v "(courierimap|maildirsize|maildirfolder|dovecot)"`; doHere you can rewrite to echo, for make some viability.
touch -c -t "$EDATE" "$i"And after all you need remove cache.
find $1 -name 'dovecot.index.cache' -delete
Comments
Post a Comment