Làm cách nào để định cấu hình mutt để hiển thị tiêu đề ngày trong múi giờ địa phương của tôi trong máy nhắn tin?


13

Khi tôi xem một tin nhắn trong mutt máy nhắn tin sẽ hiển thị thời gian trong tiêu đề Ngày trong UTC thay vì múi giờ địa phương của tôi. Giao diện chỉ mục hiển thị thời gian cục bộ chính xác. Tôi đã tìm thấy bài đăng danh sách gửi thư cũ này mô tả cách lấy giờ địa phương để hiển thị trên thanh trạng thái ở cuối màn hình, nhưng điều này vẫn không "sửa" thời gian trong tiêu đề Ngày ở đầu màn hình. Có cách nào để khiến máy nhắn tin chuyển đổi thời gian tiêu đề Ngày thành giờ địa phương không?

Câu trả lời:


3

Trong dòng của bạn .muttrcthêm dòng sau:

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

Điều này sẽ thay đổi Date:tiêu đề trong thông báo (chỉ hiển thị) thành múi giờ địa phương của bạn nếu tiêu đề chứa ngày định dạng RFC hợp lệ. Nếu định dạng ngày được cung cấp không chính xác (chúng tôi đang xử lý đầu vào của người dùng không tin cậy) thì nó sẽ được giữ nguyên. Để chống lại một nỗ lực có thể để tiêm mã shell thông qua tiêu đề, sedmẫu thực hiện một danh sách trắng dựa trên RFC 5322 (RFC này xác định định dạng của Date:trường).

Lưu ý rằng muttgiới hạn dòng lệnh dài không quá 255 ký tự, do đó tôi đã tối ưu hóa sedlệnh ban đầu có danh sách trắng chặt chẽ hơn để phù hợp với 255 byte. Nếu bạn dự định làm những việc khác với thông báo, thì sedlệnh đầy đủ bạn có thể đặt trong một tập lệnh là:

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"

Có khả năng để làm cho nó hoạt động trên macOS? Tôi muốn bao gồm điều đó trong filter.sedtập tin của tôi . Cảm ơn!
Philipp L.

Không có, trừ khi bạn đang sử dụng GNU sed (ví dụ thông qua Homebrew) - các sedlệnh trên phụ thuộc vào công cụ esửa đổi cho slệnh. Công cụ sửa đổi đó là một phần mở rộng GNU và macOS sedlà BSD.
thiên hà

Trả lời bởi @viric là tốt. Không cần thay đổi tin nhắn qua bộ lọc.
Jangid

@Jangid, vui lòng đọc yêu cầu ban đầu và nó đặc biệt yêu cầu hiển thị đúng vùng cục bộ ở đầu trang chứ không phải trong dòng trạng thái.
thiên hà

@gal Wax ơi! Đúng. Chỉ cần chú ý rằng. Chính xác.
Jangid

11

Định dạng trong chỉ mục được kiểm soát bởi index_formatcài đặt - nó được tạo bởi mutt. Các Datetiêu đề không được kiểm soát bởi mutt, đó là một tiêu đề kèm với thông điệp rằng chỉ được hiển thị. Nếu nó hiển thị thời gian UTC thì đó là do máy chủ gửi đã quyết định sử dụng UTC khi tạo tiêu đề. Cách duy nhất để thay đổi nó là thực sự thay đổi chính thông điệp, khi bạn nhận được nó hoặc khi bạn xem nó.

Thay đổi nó vì nó có nghĩa là thêm một bộ lọc vào tác nhân gửi thư của bạn, nhưng nó cần phải đủ tinh vi để phân tích Datetiêu đề hiện có và viết lại nó. Gần như chắc chắn sẽ tốt hơn khi chỉ mutt định dạng lại thông điệp khi bạn nhìn vào nó. Bạn có thể đặt thuộc display_filtertính thành một tệp thực thi và nó sẽ chuyển bất kỳ thông báo nào bạn mở qua tệp thực thi trước khi hiển thị nó.

Bạn sẽ cần phải viết một chương trình hoặc tập lệnh shell đọc từng dòng tin nhắn và thay thế tập lệnh bằng tiêu đề Ngày hoặc tìm tập lệnh hiện có (có một tập lệnh ở đây có thể hoạt động, mặc dù có vẻ như nó thực sự không nên cần thiết để liên quan đến một tập tin tạm thời)



5

Theo lời khuyên của Gilles, đây là phiên bản sử dụng tệp tạm thời và 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"

Điều này dễ bị tấn công tiêm mã thông qua một Date:tiêu đề không đúng định dạng - nếu bạn đi vào một nhánh con, bạn cần xác thực / vệ sinh đầu vào.
thiên hà

2

Đây là một giải pháp 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"

Và hiển thị LocalDate: trong muttrc:

unignore localdate

Làm thế nào để bạn gọi điều này?
Janus Troelsen

@JanusTroelsen, tôi tin rằng bạn gán kịch bản để display_filter.muttrc.
thiên hà

2

set display_filter="/PATH/TO/THIS/PYTHON/FILE"trong của bạn .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)

Dòng nhận xét dễ bị tấn công mã tiêm thông qua Date:tiêu đề không đúng định dạng - nếu bạn đi vào một mạng con, bạn cần xác thực / vệ sinh đầu vào, nếu không thì kịch bản vẫn ổn từ quan điểm bảo mật. Tuy nhiên, nó khá nặng đối với một tập lệnh chạy trên mọi tin nhắn bạn duyệt.
thiên hà

2

Giải pháp Perl bắt buộc bảo tồn tiêu đề "Ngày" trong khi thêm tiêu đề "Ngày cục bộ" bổ sung để chứa phiên bản giờ địa phương:

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

Tôi đã tạo một kịch bản shell như được mô tả ở cuối câu trả lời của Michael, công việc đó đối với tôi:

#!/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
Phân tích email là khá khó khăn. Tôi khuyên bạn nên sử dụng một công cụ chuyên dụng như formail(một phần của gói procmail ) hoặc reformail(một phần của hộp thư ) để trích xuất Date:tiêu đề hiện có và đặt một tiêu đề mới vào vị trí. Chăm sóc các trường hợp cạnh như Date:tiêu đề bị thiếu hoặc không đúng định dạng .
Gilles 'SO- ngừng trở nên xấu xa'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.