Mutt'u çağrı cihazındaki yerel saat dilimimdeki tarih başlığını görüntüleyecek şekilde nasıl yapılandırabilirim?


13

Çağrı cihazı mutt'taki bir mesajı görüntülediğimde, Tarih üstbilgisindeki saati yerel saat dilimim yerine UTC olarak görüntüler. Dizin görünümü yerel saati doğru görüntüler. Ekranın altındaki durum çubuğunda yerel saatin nasıl görüntüleneceğini açıklayan bu eski posta listesi gönderisini buldum , ancak bu yine de ekranın üst kısmındaki Tarih üstbilgisindeki saati "düzeltmez". Çağrı tarihçesini yerel saate dönüştürmek için çağrı cihazı almanın herhangi bir yolu var mı?

Yanıtlar:


3

Senin içinde .muttrceklenti aşağıdaki satırı:

set display_filter="exec sed -r \"s/^Date:\\s*(([F-Wa-u]{3},\\s*)?[[:digit:]]{1,2}\\s+[A-Sa-y]{3}\\s+[[:digit:]]{4}\\s+[[:digit:]]{1,2}:[[:digit:]]{1,2}(:[[:digit:]]{1,2})?\\s+[+-][[:digit:]]{4})/date +'Date: %a, %d %b %Y %H:%M:%S %z' -d '\\1'/e\""

Bu, Date:başlık geçerli bir RFC biçimli tarih içeriyorsa iletideki üstbilgiyi (yalnızca görüntüleme için) yerel saat diliminize değiştirir. Sağlanan tarih biçimi yanlışsa (sonuçta güvenilmeyen kullanıcı girişi ile ilgileniyoruz) korunacaktır. Kabuk kodunu başlıktan enjekte etmek için olası bir girişimle mücadele etmek için, seddesen RFC 5322'ye dayalı bir beyaz liste uygular (bu RFC Date:alanın biçimini tanımlar ).

Not mutten fazla 255 karakter olmak için komut satırını sınırlar uzun, dolayısıyla ben orijinal optimize sed255 bayt sığmayacak beyaz listesi sıkı vardı komutu. İletiyle başka şeyler yapmayı planlıyorsanız sed, bir komut dosyasına koyabileceğiniz tam komut:

sed -r "s/^Date:\s*(((Mon|Tue|Wed|Thu|Fri|Sat|Sun),\s*)?[[:digit:]]{1,2}\s+(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s+[[:digit:]]{4}\s+[[:digit:]]{1,2}:[[:digit:]]{1,2}(:[[:digit:]]{1,2})?\s+[+-][[:digit:]]{4})/date +'Date: %a, %d %b %Y %H:%M:%S %z' -d '\1'/e"

MacOS üzerinde çalışmasını sağlamak için bir olasılık var mı? Bunu dosyama eklemek istiyorum filter.sed. Teşekkürler!
Philipp L.

GNU sed (örneğin Homebrew aracılığıyla) kullanmadığınız sürece, yukarıdaki sedkomutlar komuta yönelik edeğiştiriciye dayanır s. Bu değiştirici bir GNU oluşumudur ve macOS'lar BSD'dir sed.
galaksi

Tarafından cevap @viric iyidir. Filtreden mesaj değiştirmenize gerek yoktur.
Jangid

@Jangid, lütfen orijinal isteği okuyun ve özellikle durum satırında değil, sayfanın üstünde yerel bir bölgenin düzgün bir şekilde görüntülenmesini ister .
galaksi

@galaxy Oh! Evet. Sadece fark ettim. Doğru.
Jangid

11

Dizindeki biçimlendirme index_formatayar tarafından kontrol edilir - mutt tarafından oluşturulur. DateBaşlık mutt tarafından kontrol edilmeyen, sadece görüntülenen alır mesajla birlikte bir başlık var. UTC saatini gösteriyorsa, gönderen sunucunun üstbilgiyi oluştururken UTC kullanmaya karar vermesidir. Değiştirmenin tek yolu, iletiyi aldığınızda veya görüntülediğinizde kendisini değiştirmektir.

Geldiği gibi değiştirmek, posta dağıtım aracısına bir filtre eklemek anlamına gelir, ancak mevcut Dateüstbilgiyi ayrıştırmak ve yeniden yazmak için yeterince karmaşık olması gerekir. Mesajı gördüğünüzde sadece mesajı yeniden biçimlendirmek neredeyse kesinlikle daha iyidir. display_filterÖzelliği yürütülebilir bir dosya olarak ayarlayabilirsiniz ve yürütülebilir dosyayı açmadan önce açtığınız tüm iletileri göstermez.

İletinin her satırını okuyan ve bunu Tarih üstbilgisi ile değiştiren bir program veya kabuk komut dosyası yazmanız veya var olan bir komut dosyasını bulmanız gerekir ( burada olması gereken gibi görünmüyor olsa da, geçici bir dosya eklemek için gerekli)



5

Gilles'in tavsiyesini alarak, burada geçici bir dosya ve formail.

#!/bin/bash
TMPFILE=$(mktemp)

# save the message to a file
cat - >"$TMPFILE"
# extract the date header
DATE=$( formail -xDate: < "$TMPFILE" )
# convert to the current timezone (defined by TZ)
DATE=$( date -R -d "$DATE" )
# output the modified message
echo "Date: $DATE"
formail -fI Date < "$TMPFILE"
# clean up
rm -f "$TMPFILE"

Bu, hatalı biçimlendirilmiş bir Date:başlık aracılığıyla kod enjeksiyon saldırılarına açıktır - bir alt kabuk içine girerseniz girişi doğrulamanız / sterilize etmeniz gerekir.
galaksi

2

İşte bir procmail çözümü:

# extract date from mail
:0
TMPDATE=| formail -x Date

# get local date
LOCALDATE=`date --rfc-2822 -d "$TMPDATE"`

# add it new header to the mail
:0 f
| formail -I "LocalDate: $LOCALDATE"

Ve localDate: öğesini muttrc içinde görüntüle:

unignore localdate

bunu nasıl çağırıyorsun?
Janus Troelsen

@JanusTroelsen, sana senaryoyu atamak inanıyoruz display_filteriçinde .muttrc.
galaksi

2

set display_filter="/PATH/TO/THIS/PYTHON/FILE"sizin .muttrc.

Python 3.3:

#!/usr/bin/env python3
import sys
import re
# import subprocess
from email.utils import format_datetime, parsedate_to_datetime

in_headers = True
for line in sys.stdin.readlines():
    if line == "\n": in_headers = False
    match = re.match(r'^Date: (.+)', line)

    if not in_headers or not match:
        print(line, end="")
        continue

    date_string = match.group(1)
    # use this if you do not have python 3.3+
    # converted_date = subprocess.Popen(['date','-d',date_string], stdout=subprocess.PIPE).communicate()[0].strip()
    converted_date = format_datetime(parsedate_to_datetime(date_string).astimezone(tz=None))
    print('Date:', converted_date)

Yorumlanan satır, hatalı biçimlendirilmiş bir Date:başlık aracılığıyla kod enjeksiyon saldırılarına açıktır - bir alt kabuk içine girerseniz girişi doğrulamanız / sterilize etmeniz gerekir, aksi takdirde komut dosyası güvenlik açısından tamamdır. Ancak, göz attığınız her iletide çalışan bir komut dosyası için oldukça ağırdır.
galaksi

2

Localtime sürümünü içerecek ek bir "Local-Date" üstbilgisi eklerken "Date" başlığını koruyan Zorunlu Perl çözümü:

#!/usr/bin/perl -n

use Date::Parse;
use POSIX;
use strict;

if (/^Date: (.*)$/) {
    my $datestr = $1;
    my $date = strftime ("%a, %d %b %Y %H:%M:%S",
                         localtime (str2time ($datestr)));
    print "Local-Date: $date\n";
}

print;

0

Benim için işi yapan Michael'ın cevabının sonunda anlatıldığı gibi bir kabuk senaryosu yaptım:

#!/bin/bash
while IFS= read -r LINE; do
    if [[ "${LINE}" =~ ^Date:\ .* ]]; then
        DATE=${LINE#Date: }
        # convert to the current timezone (defined by TZ)
        DATE=$(date -d "${DATE}")
        printf '%s' "Date: ${DATE}"
    elif [[ -n $LINE ]]; then
      # We've reach the end of the headers, so stop parsing
      echo
      exec cat
    else
        printf '%s\n' "${LINE}"
    fi
done

1
E-postaları ayrıştırmak oldukça zor. Ben özel bir gibi araç kullanarak tavsiye formail(parçası Procmail'in paketinde) ya da reformail(bir kısmını maildrop mevcut ayıklamak için) Date:başlık ve yerinde bir yenisini koymak. Eksik veya hatalı biçimlendirilmiş Date:başlık gibi kenar durumlarına dikkat edin .
Gilles 'SO- kötü olmayı kes'
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.