У меня есть настройка exim для получения текста автоответа из базы данных sqlite. Он отлично отправляет автоответ, за исключением того, что я не могу получить новые строки в автоответе.
Это строка в транспорте:
text = ${lookup sqlite{SQLDB \
SELECT body FROM autoreply WHERE \
(username='$local_part' AND domain='$domain') \
AND (sender ='$sender_address' or sender ='$reply_address' or sender ='*') \
AND enabled=1 \
AND (valid_from <= strftime('%s', 'now') OR valid_from IS NULL) \
AND (valid_to >= strftime('%s', 'now') OR valid_to IS NULL) \
LIMIT 1\
}\
}
Как я уже упоминал, это возвращает правильный текст, электронное письмо просто содержит фактические символы \ n вместо новых строк.
Я пробовал такие вещи, как \\ n, и ничего не работает.
Я довольно долго искал в Интернете и не могу найти ничего о том, чтобы сделать это или что-то, что говорило бы, что это невозможно.
Я предполагаю, что вы сохранили символы новой строки как escape-последовательности в базе данных, то есть строку "\n
"вместо фактического символа новой строки. Поиск sqlite вернет именно это, и exim с радостью поместит строку как есть в сообщение автоответа. Причина в том, что поиск уже является расширением строки; вы можете использовать его как часть другая строка, и в этом случае exim заменит ее тем, что есть в базе данных, Exim не будет расширять ее во второй раз.
Для того, чтобы Exim расширил символьные литералы в результате поиска, вы должны указать ему сделать это явно, заключив весь поиск в expand
оператор, например:
text = ${expand:${lookup sqlite{SQLDB \
SELECT body FROM autoreply WHERE \
...
}}}
Затем exim возьмет строку, возвращаемую поиском, и выполнит ее раскрытие. Подробнее см. Спецификация exim, Глава 11, Раздел 6, относительно оператора расширения и Глава 9 относительно поиска файлов и баз данных.