ฉันจะกำหนดค่า mutt เพื่อแสดงส่วนหัววันที่ในเขตเวลาท้องถิ่นของฉันในเพจเจอร์ได้อย่างไร


13

เมื่อฉันดูข้อความในเพจเจอร์ mutt แสดงเวลาในส่วนหัว Date ใน UTC แทนที่จะเป็นเขตเวลาท้องถิ่นของฉัน มุมมองดัชนีแสดงเวลาท้องถิ่นอย่างถูกต้อง ฉันพบโพสต์รายชื่อผู้รับจดหมายเก่าที่อธิบายวิธีรับเวลาท้องถิ่นเพื่อแสดงในแถบสถานะที่ด้านล่างของหน้าจอ แต่นี่ยังไม่ "แก้ไข" เวลาในส่วนหัว Date ที่ด้านบนของหน้าจอ มีวิธีใดที่จะทำให้เพจเจอร์แปลงเวลาส่วนหัว Date เป็นเวลาท้องถิ่นหรือไม่?

คำตอบ:


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ไฟล์ของฉัน ขอบคุณ!
Philipp L.

ไม่มีเว้นแต่คุณจะใช้ GNU sed (เช่นผ่าน Homebrew) - sedคำสั่งข้างต้นขึ้นอยู่กับeตัวดัดแปลงของsคำสั่ง ตัวดัดแปลงนั้นเป็นส่วนขยาย GNU และ macOS'es sedเป็น BSD ตัวหนึ่ง
กาแล็กซี่

คำตอบโดย @viric เป็นสิ่งที่ดี ไม่จำเป็นต้องเปลี่ยนข้อความผ่านตัวกรอง
Jangid

@Jangid โปรดอ่านคำขอต้นฉบับและมันจะถามเฉพาะสำหรับการแสดงที่เหมาะสมของโซนท้องถิ่นที่ด้านบนของหน้าและไม่ได้อยู่ในบรรทัดสถานะ
กาแล็

@galaxy โอ้! ใช่. เพิ่งสังเกตเห็นว่า แก้ไข.
Jangid

11

การจัดรูปแบบในดัชนีถูกควบคุมโดยการindex_formatตั้งค่า - มันถูกสร้างโดย mutt Dateส่วนหัวไม่ได้ถูกควบคุมโดยคนโง่ก็โหม่งพร้อมกับข้อความที่เพิ่งได้รับการแสดง หากแสดงเวลา UTC เป็นเพราะเซิร์ฟเวอร์ผู้ส่งตัดสินใจใช้ UTC เมื่อสร้างส่วนหัว วิธีเดียวในการเปลี่ยนคือการเปลี่ยนข้อความเองเมื่อคุณได้รับหรือเมื่อคุณดู

การเปลี่ยนตามที่ปรากฏหมายถึงการเพิ่มตัวกรองไปยังตัวแทนส่งจดหมายของคุณ แต่ต้องมีความซับซ้อนเพียงพอที่จะวิเคราะห์Dateส่วนหัวที่มีอยู่แล้วเขียนใหม่ มันเกือบจะดีกว่าถ้าคุณเพิ่งทำเป็นรูปข้อความเมื่อคุณดู คุณสามารถตั้งค่าdisplay_filterคุณสมบัติเป็นไฟล์เรียกทำงานและมันจะไพพ์ข้อความใด ๆ ที่คุณเปิดผ่านไฟล์สั่งการก่อนที่จะแสดงมัน

คุณจะต้องเขียนโปรแกรมหรือเชลล์สคริปต์ที่อ่านแต่ละบรรทัดของข้อความและแทนที่อันนั้นด้วยส่วนหัว Date หรือค้นหาสคริปต์ที่มีอยู่ (มีอยู่ที่นี่ที่อาจใช้งานได้แม้ว่ามันจะดูเหมือนไม่ควรจริง ๆ จำเป็นต้องเกี่ยวข้องกับไฟล์ชั่วคราว)



5

การแนะนำกิลส์นี่เป็นรุ่นที่ใช้ไฟล์ temp 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:ส่วนหัวที่ผิดรูปแบบ- หากคุณเข้าสู่ subshell คุณจำเป็นต้องตรวจสอบ / ฆ่าเชื้ออินพุต
กาแล็กซี่

2

นี่คือทางออก procmail:

# 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ในของคุณ

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:ส่วนหัวที่มีรูปแบบไม่ถูกต้อง- หากคุณเข้าสู่ subshell คุณต้องตรวจสอบ / ฆ่าเชื้ออินพุตมิฉะนั้นสคริปต์จะตกลงจากจุดรักษาความปลอดภัย อย่างไรก็ตามมันค่อนข้างหนักสำหรับสคริปต์ที่ทำงานกับทุกข้อความที่คุณเรียกดู
กาแล็กซี่

2

โซลูชัน Perl แบบบังคับที่รักษาส่วนหัว "Date" ในขณะที่เพิ่มส่วนหัว "Local-Date" พิเศษเพื่อให้มีรุ่น 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:ส่วนหัวที่ขาดหายไปหรือผิดรูปแบบ
Gilles 'หยุดชั่วร้าย'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.