Проблема заголовков maildir
У меня есть следующий скрипт bash для обновления mtimes для файлов maildir:
#!/bin/bash
for i in /test/emailfile
do
date=$(sed -n '/Received: from/ { :a; n; /;/ {s/.*; //p;q}; b a }' "$i")
newdate=$(date -d "$date" +'%Y%m%d%H%M.%S')
touch -t "$newdate" "$i"
done
Этот скрипт всегда работал нормально со стандартными заголовками, такими как эти:
Delivery-date: Sun, 22 Apr 2007 00:15:13 -0600
Received: from an-out-0708.google.com ([209.85.132.243])
by x.xxxx.com with esmtp (Exim 4.63)
(envelope-from <xxxxxx@gmail.com>)
id 1HfVLs-0002Io-RQ
for x@xxxxx.com; Sun, 22 Apr 2007 00:15:13 -0600
Который имеет дату поставки 2007 года. Если я коснусь этого файла, чтобы дата файла была с сегодняшнего дня, а затем запустил мой сценарий, дата файла будет восстановлена до даты получения.
Однако при попытке запустить мой сценарий по электронной почте со следующими заголовками:
Delivery-date: Mon, 15 Dec 2008 17:26:37 -0800
Received: from xxxxxx ([130.194.13.165])
by xxxxxxx with esmtp (Exim 4.69)
(envelope-from <xxxxxi@xxxxx.xxx.xx>)
id 1LCOhp-0006fm-2g
for xxxxx@xxxxxx.com; Mon, 15 Dec 2008 17:26:37 -0800
Дата явно не восстановлена. Я не вижу, что заголовки, очевидно, отличаются в любом случае. Мне нужно сбросить mtimes, потому что многие почтовые клиенты используют время файла для отображения как полученное от времени. Мой сценарий обработал более 3000 электронных писем, гарантируя, что все клиенты отображают электронные письма в правильном порядке после всех серверов и все файлы, имеющие одинаковую дату, но по какой-то причине он не будет работать с определенным письмом. Я оставил что-то очевидное из сценария?
edit: дата, по-видимому, восстанавливается из скрипта, однако клиенты, использующие mtimes, не будут отображать это сообщение независимо от того, для какого скрипта установлена дата. Разрешения такие же, как формат и формат файла. Ниже сообщение от ls -la
-rw-rw---- 1 username username 11769 Dec 14 21:25 1229318728.H329820P11297.xxxxx.serverxxxxx.com:2,S
-rw-rw---- 1 username username 3366 Dec 15 17:26 1229390797.H476913P25671.xxxxx.serverxxxxx.com:2,S
-rw-rw---- 1 username username 1149 Dec 22 05:39 1229953142.H901034P11016.xxxxx.serverxxxxx.com:2,S
-rw-rw---- 1 username username 7557 Dec 23 15:43 1230075791.H700954P8392.xxxxx.serverxxxxx.com:2,S
Файл, который не будет отображаться правильно, является вторым сверху. Есть ли способ отладки, почему это вообще происходит?
3 ответа
Похоже, что это работает нормально для меня, попробуйте эту маленькую пустышку и посмотрите, что вы получите.
#!/bin/bash
echo 'Delivery-date: Sun, 22 Apr 2007 00:15:13 -0600
Received: from an-out-0708.google.com ([209.85.132.243])
by x.xxxx.com with esmtp (Exim 4.63)
(envelope-from <xxxxxx@gmail.com>)
id 1HfVLs-0002Io-RQ
for x@xxxxx.com; Sun, 22 Apr 2007 00:15:13 -0600' | sed -n '/Received: from/ { :a; n; /;/ {s/.*; //p;q}; b a }'
date -d "Sun, 22 Apr 2007 00:15:13 -0600" +'%Y%m%d%H%M.%S'
echo 'Delivery-date: Mon, 15 Dec 2008 17:26:37 -0800
Received: from xxxxxx ([130.194.13.165])
by xxxxxxx with esmtp (Exim 4.69)
(envelope-from <xxxxxi@xxxxx.xxx.xx>)
id 1LCOhp-0006fm-2g
for xxxxx@xxxxxx.com; Mon, 15 Dec 2008 17:26:37 -0800' | sed -n '/Received: from/ { :a; n; /;/ {s/.*; //p;q}; b a }'
date -d "Mon, 15 Dec 2008 17:26:37 -0800" +'%Y%m%d%H%M.%S'
Я получаю (как и ожидалось):
Sun, 22 Apr 2007 00:15:13 -0600
200704221415.13
Mon, 15 Dec 2008 17:26:37 -0800
200812161026.37
Так что я не уверен, почему ваш не работает, хотя вывод этого скрипта должен быть хорошей отправной точкой.
Другая вещь, которую вы можете сделать, это временно изменить ваш скрипт следующим образом:
: : : : :
echo touch -t "$newdate" "$i"
touch -t "$newdate" "$i"
: : : : :
Это выведет фактическую команду, которую вы пытаетесь.
Также проверьте права доступа к файлам для каталога и отдельных файлов.
Что "ls -l" (mtime) и "ls -lc" (ctime) дают вам в подозрительном почтовом файле? Возможно, ваш скрипт работает нормально, но почтовый клиент пользователя не использует mtime/ctime.
После редактирования:
Цитируя "однако клиенты, которые полагаются на mtimes, не будут отображать это сообщение независимо от того, какой сценарий устанавливает дату", я отвечаю, что клиент не полагается на mtimes.
Перефразируя самого Шерлока, как только вы устранили все другие возможности, все, что осталось, пусть и маловероятно, должно иметь место. И одна вещь, которую я заметил: вы только что заявили, что сообщение не отображается вообще (или что у него неправильная дата, как я и думал)?
Если последнее, вам нужно заглянуть в почтовый клиент, чтобы увидеть, откуда он на самом деле получает свою дату. Просто ради интереса, какую дату клиент думает, что это (и соответствует ли она какой-либо дате в заголовке?
Если первое, то это другая проблема, которую мы можем обсудить.
Я думаю, что это (клиент), куда вам нужно пойти отсюда, и, поскольку мой опыт в создании сценариев больше, чем в почтовых клиентах, я не смогу помочь в дальнейшем. Тем не менее, мне интересно посмотреть, как это получается, поэтому я буду любить этот вопрос.
Следующие сценарии использовали дату, а не атрибут "Дата получения" почтового сообщения. Это устанавливает дату, совпадающую с датой, используемой некоторыми почтовыми приложениями, а также упрощает оператор sed. Это также включает улучшенную обработку ошибок, когда встречается неправильная / недействительная дата.
#!/bin/bash
echo "Process folder : $@"
for i in $( ls -1 $@ )
do
# date=$(sed -n '/Received: from/ { :a; n; /;/ {s/.*; //p;q}; b a }' "$i")
# date=$(sed -n -f ~/scripts/fix.sed "$i")
date=$(sed -n '/^Date: / {s/^Date: //p;q}' "$i")
newdate=$(date -d "$date" +'%Y%m%d%H%M.%S')
returnCode=$?
if [ "$returnCode" != "0" ]
then
echo "Date Return Code : $returnCode"
echo "Message file : $i received at : $date"
fi
touch -c -t "$newdate" "$i"
done
Вы уверены - это работает для меня.
Единственные изменения, которые я сделал, были:
#!/bin/bash
for i in "$@"
do
date=$(sed -n '/Received: from/ { :a; n; /;/ {s/.*; //p;q}; b a }' "$i")
newdate=$(date -d "$date" +'%Y%m%d%H%M.%S')
touch -c -t "$newdate" "$i"
done
touch -c
так что файлы не создаются на ощупь.
for i in "$@"
так что он работает с аргументами командной строки, а не с фиксированным файлом.
$ touch data2 ; ls -l data2
-rw-r--r-- 1 leeder leeder 250 2009-01-22 11:43 data2
$ bash test.sh data data2 ; ls -l data2
-rw-r--r-- 1 leeder leeder 250 2008-12-16 01:26 data2