पेजर में अपने स्थानीय समय क्षेत्र में दिनांक शीर्ष लेख प्रदर्शित करने के लिए मैं म्यूट को कैसे कॉन्फ़िगर करूं?


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 sedBSD है।
आकाशगंगा

@Viric द्वारा उत्तर अच्छा है। संदेश को फ़िल्टर के माध्यम से बदलने की आवश्यकता नहीं है।
जांगिड़

@ जांगिड़, कृपया मूल अनुरोध पढ़ें और यह विशेष रूप से पृष्ठ के शीर्ष में स्थानीय ज़ोन के उचित प्रदर्शन के लिए कहता है न कि स्टेटस लाइन में।
गैलेक्सी

@ हेगलैक्सी ओह! हाँ। बस इतना ही देखा। सही बात।
जांगिड़

11

सूचकांक में स्वरूपण index_formatसेटिंग द्वारा नियंत्रित किया जाता है - यह उत्परिवर्तन द्वारा उत्पन्न होता है। Dateहैडर मठ द्वारा नियंत्रित नहीं है, यह एक हेडर संदेश है कि बस प्रदर्शित किया जाता के साथ शामिल है। यदि यह UTC का समय दिखाता है, क्योंकि भेजने वाले सर्वर ने हेडर बनाते समय UTC का उपयोग करने का निर्णय लिया है। इसे बदलने का एकमात्र तरीका वास्तव में संदेश को बदलना है, या तो जब आप इसे प्राप्त करते हैं या जब आप इसे देखते हैं।

इसे बदलने के रूप में यह अपने मेल डिलीवरी एजेंट के लिए एक फिल्टर जोड़ने का मतलब है, लेकिन यह मौजूदा Dateहेडर पार्स और इसे फिर से लिखना करने के लिए पर्याप्त परिष्कृत करने की आवश्यकता है। जब आप इसे देखते हैं, तो यह निश्चित रूप से बेहतर होता है कि संदेश को केवल म्यूट करेक्ट करें। आप display_filterसंपत्ति को एक निष्पादन योग्य फ़ाइल पर सेट कर सकते हैं, और यह आपके द्वारा प्रदर्शित करने से पहले निष्पादन योग्य के माध्यम से खुले किसी भी संदेश को पाइप कर देगा।

आपको एक प्रोग्राम या शेल स्क्रिप्ट लिखने की आवश्यकता होगी जो संदेश की प्रत्येक पंक्ति को पढ़ती है और एक को दिनांक हेडर के साथ बदल देती है, या एक मौजूदा स्क्रिप्ट ढूंढती है ( यहां एक है जो काम कर सकती है, हालांकि ऐसा नहीं लगता है कि यह वास्तव में होना चाहिए। एक अस्थायी फ़ाइल शामिल करना आवश्यक है)


7

http://www.mail-archive.com/mutt-users@mutt.org/msg44341.html

यह 'पेजरफॉर्म' का उपयोग करने का सुझाव देता है, ताकि यह स्थानीय समय क्षेत्र में पत्र की तारीख दिखा सके:

सेट pager_format = "% 4C% Z% [!% b% e%% I:% M% p]% ।20n% s% * - (% P)"


यह बहुत अच्छी तरह से काम करता है, index_format के लिए भी।
फिल

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 प्रदर्शित करें: muttrc में:

unignore localdate

आप इसे कैसे लागू करते हैं?
Janus Troelsen

@JanusTroelsen, मैं तुम्हें करने के लिए स्क्रिप्ट आवंटित मानना है कि display_filterमें .muttrc
आकाशगंगा

2

set display_filter="/PATH/TO/THIS/PYTHON/FILE"अपने में .muttrc

पायथन 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

Obligatory Perl समाधान जो स्थानीय समय संस्करण को शामिल करने के लिए एक अतिरिक्त "लोकल-डेट" हेडर जोड़ते हुए "दिनांक" हेडर को संरक्षित करता है:

#!/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:शीर्षलेख जैसे किनारे के मामलों का ध्यान रखें ।
गिल्स एसओ- बुराई को रोकना '
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.