Як налаштувати mutt для відображення заголовка дати в моєму часовому поясі в пейджері?


13

Коли я переглядаю повідомлення в пейджерській мутті, відображається час у заголовку Дата в UTC, а не мій локальний часовий пояс. У показі індексів правильно відображається місцевий час. Я знайшов цю стару публікацію списку розсилки, яка описує, як отримати місцевий час для відображення в рядку стану в нижній частині екрана, але це все ще не "фіксує" час у заголовку "Дата" у верхній частині екрана. Чи є спосіб зробити так, щоб пейджер перетворив час заголовка Дати в місцевий час?

Відповіді:


3

У вашому .muttrcдодати наступний рядок:

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\""

Це змінить Date:заголовок у повідомленні (лише для відображення) на ваш локальний часовий пояс, якщо заголовок міститиме дійсну дату, відформатовану RFC. Якщо наданий формат дати був невірним (ми маємо справу з ненадійним введенням користувача), він буде збережений. Для боротьби з можливою спробою введення коду оболонки через заголовок sedшаблон реалізує білий список на основі RFC 5322 (цей RFC визначає формат Date:поля).

Зауважте, що muttобмеження командного рядка має бути не більше 255 символів, отже, я оптимізував оригінальну sedкоманду, яка мала суворіший білий список, щоб вміститись у 255 байт. Якщо ви плануєте робити інші речі із повідомленням, то повна sedкоманда, яку ви можете ввести в сценарій, це:

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? Я хотів би включити це у свій filter.sedфайл. Дякую!
Філіп Л.

Немає, якщо ви не використовуєте GNU sed (наприклад, через Homebrew) - вищезазначені sedкоманди покладаються на eмодифікатор sкоманди. Цей модифікатор - це розширення GNU, а macOS'es sed- BSD.
галактика

Відповідь @viric хороша. Не потрібно змінювати повідомлення через фільтр.
Jangid

@Jangid, будь ласка, прочитайте оригінальний запит, і він спеціально вимагає належного відображення локальної зони вгорі сторінки, а не в рядку статусу.
галактика

@galaxy О! так. Щойно це помітив. Правильно.
Джангід

11

Форматування в індексі контролюється index_formatналаштуванням - воно генерується mutt. DateЗаголовок не контролюється собачка, це заголовок , який включається з повідомленням , що тільки отримує відображається. Якщо він показує час UTC, це тому, що сервер, що відправляє, вирішив використовувати UTC при генерації заголовка. Єдиний спосіб змінити це - фактично змінити саме повідомлення, або коли ви отримуєте його, або коли його переглядаєте.

Змінити його так, як воно входить, означає додати фільтр до агента доставки пошти, але він повинен бути досить складним, щоб розібрати існуючий Dateзаголовок і переписати його. Майже напевно краще просто переформатувати повідомлення, коли ви дивитесь на нього. Ви можете встановити display_filterвластивість для виконуваного файлу, і він передасть будь-яке повідомлення, яке ви відкриєте через виконуваний файл, перш ніж відобразити його.

Вам потрібно буде написати програму або скрипт оболонки, який читає кожен рядок повідомлення та замінює його на заголовок Date, або знайти існуючий сценарій ( тут може працювати такий, хоча він, здається, не справді необхідно залучати тимчасовий файл)



5

Беручи підказки Гілла, ось версія, яка використовує темп-файл і 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"

Це чутливо до атак ін'єкцій коду через неправильно сформований Date:заголовок - якщо ви входите в додаткову оболонку, вам потрібно перевірити / санітувати вхід.
галактика

2

Ось протокольне рішення:

# 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"

І відобразити LocalDate: in muttrc:

unignore localdate

як ти це викликаєш?
Янус Трольсен

@JanusTroelsen, я вважаю, ви призначили сценарій display_filterв .muttrc.
галактика

2

set display_filter="/PATH/TO/THIS/PYTHON/FILE"у вашому .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)

Коментований рядок чутливий до атак введення коду через неправильно сформований Date:заголовок - якщо ви переходите в додаткову оболонку, вам потрібно перевірити / переосмислити вхід, інакше сценарій буде в порядку з точки зору безпеки. Однак сценарій, який працює на кожному повідомленні, яке ви переглядаєте, є досить важким.
галактика

2

Обов’язкове рішення Perl, яке зберігає заголовок "Дата", додаючи додатковий заголовок "Місцева дата", щоб містити версію localtime:

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

Я створив сценарій оболонки, як описано в кінці відповіді Майкла, який робить для мене роботу:

#!/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
Розбір електронних листів досить складний. Я рекомендую використовувати спеціальний інструмент, як-от formail(частина пакета procmail ) або reformail(частина maildrop ), щоб витягти існуючий Date:заголовок і поставити нове на місце. Слідкуйте за крайніми справами, такими як відсутній або неправильно відформатований Date:заголовок.
Жил 'SO- перестань бути злим'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.