Вопрос или проблема
Я сталкиваюсь с проблемой при добавлении подписей к электронным письмам с помощью скрипта. Подписи корректно вставляются в новые сообщения, но возникает проблема при работе с письмами “Ответ”, которые содержат историю сообщений.
В этих случаях подпись не появляется непосредственно под самым недавним сообщением, а вместо этого размещается под всей цепочкой писем.
Существует ли рекомендуемый способ, чтобы убедиться, что подпись расположена правильно, прямо под текстом ответа?
Я пробовал некоторые исправления, но они часто приводят к проблемам с форматированием, например, подпись корректно отображается в обычном тексте, но нарушается в HTML, или наоборот.
Любой совет или идеи будут очень полезны. Спасибо!
Скрипт:
#!/bin/sh
# DB etc
INSPECT_DIR="/var/spool/filter"
SENDMAIL="/usr/sbin/sendmail"
DB_USER="XXXXXX"
DB_PASS="XXXXXX"
DB_NAME="admin"
# Exits
EX_TEMPFAIL=75
EX_UNAVAILABLE=69
#del temps
trap "rm -f $INSPECT_DIR/in.$$ $INSPECT_DIR/signature.$$" 0 1 2 3 15
cd $INSPECT_DIR || {
echo "$INSPECT_DIR не существует"
exit $EX_TEMPFAIL
}
cat > "$INSPECT_DIR/in.$$" || {
echo "Письмо не может быть сохранено."
exit $EX_TEMPFAIL
}
FROM_EMAIL=$(grep -i "^From:" "$INSPECT_DIR/in.$$" | awk '{print $2}')
SIGNATURE=$(mysql --default-character-set=utf8mb4 -u $DB_USER -p$DB_PASS -D $DB_NAME -se "SELECT signature FROM signature_mail WHERE mail="$FROM_EMAIL" AND enable=1 LIMIT 1;")
if [ -z "$SIGNATURE" ]; then
echo "Подпись не найдена или отключена, пропуск добавления подписи."
else
echo "$SIGNATURE" > "$INSPECT_DIR/signature.$$"
/usr/bin/altermime --input="$INSPECT_DIR/in.$$" \
--disclaimer="$INSPECT_DIR/signature.$$" \
--disclaimer-html="$INSPECT_DIR/signature.$$" \
--force-for-bad-html
fi
$SENDMAIL -oi "$@" < "$INSPECT_DIR/in.$$"
exit $?
Ответ на сообщение:
Return-Path: <[email protected]>
X-Original-To: [email protected]
Delivered-To: [email protected]
Received: by secret.server.com (Postfix, from userid 994)
id 145C3126147; Thu, 2 Jan 2025 09:53:23 +0100 (CET)
Received: from secret.server.com (localhost.localdomain [127.0.0.1])
(Authenticated sender: [email protected])
by secret.server.com (Postfix) with ESMTPSA id E2FD2122704
for <[email protected]>; Thu, 2 Jan 2025 09:53:22 +0100 (CET)
MIME-Version: 1.0
Date: Thu, 02 Jan 2025 09:53:22 +0100
From: [email protected]
To: [email protected]
Subject: Re: XX
In-Reply-To: <[email protected]>
References: <[email protected]>
<[email protected]>
Message-ID: <[email protected]>
X-Sender: [email protected]
Content-Type: multipart/alternative;
boundary="=_655151f4ae60099bae8c7da9532d2d24"
X-Spam-Score: -2.43
--=_655151f4ae60099bae8c7da9532d2d24
Content-Transfer-Encoding: 8bit
Content-Type: text/plain; charset=UTF-8;
format=flowed
XX3 - с подписью (но плохо)
Dne 2025-01-02 09:53, [email protected] написал:
> XX2 - без подписи (это правильно)
>
> Dne 2025-01-02 09:52, [email protected] написал:
>
>> XX1
>> С уважением,
>>
>> Рыбичка +ěščřžý(
<p>С уважением,</p>
<p>Рыбичка +ěščřžý(</p>
--=_655151f4ae60099bae8c7da9532d2d24
Content-Transfer-Encoding: quoted-printable
Content-Type: text/html; charset=UTF-8
<html><head><meta http-equiv=3D"Content-Type" content=3D"text/html; charset=
=3DUTF-8" /></head><body style=3D'font-size: 10pt; font-family: Verdana,Gen=
eva,sans-serif'>
<p>XX3 - с подписью (но плохо)</p>
<div id=3D"signature"></div>
<p><br /></p>
<p id=3D"reply-intro">Dne 2025-01-02 09:53, [email protected] написал:</p>
<blockquote type=3D"cite" style=3D"padding: 0 0.4em; border-left: #1010ff 2=
px solid; margin: 0">
<div id=3D"replybody1" style=3D"font-size: 10pt; font-family: Verdana,Genev=
a,sans-serif;">
<p>XX2 - без подписи (это правильно)</p>
<div id=3D"v1signature"></div>
<p><br /></p>
<p id=3D"v1reply-intro">Dne 2025-01-02 09:52, [email protected] написал:</p>
<blockquote style=3D"padding: 0 0.4em; border-left: #1010ff 2px solid; marg=
in: 0;">
<div id=3D"v1replybody1" style=3D"font-size: 10pt; font-family: Verdana,Gen=
eva,sans-serif;">
<p>XX1</p>
<br />
<p>С уважением,</p>
<p>Рыби=C4=8Dка +=C4=9Bš=C4=8D=C5=99=C5=BEý(</p>
</div>
</blockquote>
</div>
</blockquote>
<br>=
<p>С уважением,</p>=0D=0A
<p>Рыби=C4=8Dка +=C4=9B=C5=A1=C4=8D=C5=99=C5=BE=C3=BD(</p>=0D=0A
=0A
<br>=
</body></html>
--=_655151f4ae60099bae8c7da9532d2d24--
Ответ или решение
Ваша задача — внести корректировки в сценарий, который должен добавлять подписи к письмам, таким образом, чтобы они появлялись непосредственно под текстом ответа, а не в конце переписки.
На данный момент проблема заключается в том, что подпись, вместо того чтобы быть интегрированной под последним ответом, размещается в конце всего письма, особенно при работе с HTML-форматированием. Рассмотрим, как можно разрешить эту ситуацию, учитывая указанный сценарий на Shell script и подставляя подписи через altermime
.
Основные причины проблемы
-
Неправильное определение границ текста для вставки: Наиболее вероятная причина заключается в том, что используется стандартная вставка, которая не учитывает структуру электронной почты и игнорирует разделение на секции ответа и историю переписки.
-
Форматирование HTML: Различия в обработке текста между простым текстом и HTML могут приводить к различиям в отображении.
-
Статический подход скрипта: Скрипт
altermime
, вероятно, используется без учета необходимости отдельной обработки для письма с ответами.
Рекомендации по исправлению
Чтобы добиться желаемого поведения, следует выполнить несколько шагов:
-
Идентификация текста для вставки подписи: Применить регулярные выражения или другие методы для четкой идентификации конца основного текста в ответе.
-
Интеграция с
altermime
: Использовать функциюinsert
для выбора правильной позиции в HTML и текстовом формате. Возможно, это потребует написания собственного патча или подключения другого инструмента. -
Создание более сложного логического сценария: Вместо статичного добавления подписи, разрабатывать сценарии, которые динамически определяют формат и содержание сообщения.
Вот пример того, как можно улучшить скрипт:
#!/bin/sh
# Настройка переменных и окружения
INSPECT_DIR="/var/spool/filter"
SENDMAIL="/usr/sbin/sendmail"
DB_USER="XXXXXX"
DB_PASS="XXXXXX"
DB_NAME="admin"
# Обработка сигнатур и выходов
trap "rm -f $INSPECT_DIR/in.$$ $INSPECT_DIR/signature.$$" 0 1 2 3 15
cd $INSPECT_DIR || {
echo "$INSPECT_DIR не существует"
exit $EX_TEMPFAIL
}
cat > "$INSPECT_DIR/in.$$" || {
echo "Не удается сохранить email."
exit $EX_TEMPFAIL
}
FROM_EMAIL=$(grep -i "^From:" "$INSPECT_DIR/in.$$" | awk '{print $2}')
SIGNATURE=$(mysql --default-character-set=utf8mb4 -u $DB_USER -p$DB_PASS -D $DB_NAME -se "SELECT signature FROM signature_mail WHERE mail='$FROM_EMAIL' AND enable=1 LIMIT 1;")
if [ -z "$SIGNATURE" ]; then
echo "Подпись не найдена или отключена, пропуск добавления подписи."
else
echo "$SIGNATURE" > "$INSPECT_DIR/signature.$$"
# Переменная для идентификации конца ответа
PATTERN_END_REPLY="\n--\n"
# Динамическое определение места для вставки подписи
gawk -v signature="$SIGNATURE" -v end_reply="$PATTERN_END_REPLY" '
BEGIN { RS=end_reply }
NR==1 { print $0; print signature }
NR >1 { print end_reply $0 }
' "$INSPECT_DIR/in.$$" > "$INSPECT_DIR/processed.$$"
mv "$INSPECT_DIR/processed.$$" "$INSPECT_DIR/in.$$"
fi
$SENDMAIL -oi "$@" < "$INSPECT_DIR/in.$$"
exit $?
SEO и профессиональное написание
При написании технической документации или ответа убедитесь, что вы учитываете потребности целевой аудитории, включая использование актуальных ключевых слов, таких как скрипты Postfix, обработка электронной почты, altermime
и т.д. Это поможет значительно усилить видимость вашего материала и привлечь нужную аудиторию.
Таким образом, корректировки вашего скрипта должны улучшить интеграцию подписи в текста ответа на электронные письма, сохраняя форматирование и корректно обрабатывая HTML и текстовый формат. Учитывайте требования к SEO и избегайте стандартных формулировок, чтобы ваш материал оставался актуальным и полезным.