проблема заголовков maildir - PullRequest
1 голос
/ 22 января 2009

У меня есть следующий скрипт 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 ]

1 голос
/ 22 января 2009

Кажется, у меня все работает, попробуйте эту маленькую пустышку и посмотрите, что вы получите.

#!/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.

Перефразируя самого Шерлока, как только вы устранили все другие возможности, все, что осталось, как бы маловероятно это ни было, должно иметь место. И одна вещь, которую я заметил: вы только что заявили, что сообщение не отображается вообще (или что у него неправильная дата, как я думал, о которой мы говорили)?

Если последнее, вам нужно заглянуть в почтовый клиент, чтобы увидеть, откуда он на самом деле получает свою дату. Просто ради интереса, какую дату клиент думает, что это (и соответствует ли она какой-либо дате в заголовке?

Если первое, то это другая проблема, которую мы можем обсудить.

Я думаю, что это (клиент), куда вам нужно пойти отсюда, и, поскольку мой опыт в создании сценариев больше, чем в почтовых клиентах, я не смогу помочь в дальнейшем. Тем не менее, мне интересно посмотреть, как это получится, поэтому я буду любить этот вопрос.

1 голос
/ 24 февраля 2011

В следующих сценариях вместо даты полученного атрибута почтового сообщения использовалась дата. Это устанавливает дату, совпадающую с датой, используемой некоторыми почтовыми приложениями, а также упрощает оператор 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
0 голосов
/ 22 января 2009

Ты уверен - у меня это работает.

Единственные изменения, которые я сделал:

#!/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
...