#c #html #perl #forms
#c #HTML #perl #формы
Вопрос:
У меня есть HTML-форма, которая в настоящее время принимает входные данные и отправляет их в электронном письме с форматированием HTML, так что электронное письмо выглядит в основном как веб-страница формы, но со всеми заполненными полями.
<form method="post" action="/cgi-bin/perlscript.pl" enctype="x-www-form-encoded" name="Form">
<input type="text" name="txtMyText" id="txtMyText" />
</form>
Сценарий post-action написан на Perl, и в настоящее время я конвертирую его на C просто потому, что так мне намного проще читать и поддерживать. Кроме того, я думаю, что это более гибко для будущих дополнений.
В Perl я смог использовать «SendMail» для отправки электронного письма, и я мог бы сделать что-то вроде этого:
sub PrintStyles
{
print MAIL <<ENDMAIL
<html>
<head>
<style>
h1.title { color: Red; }
h3.title { color : Black; background-color: yellow; }
</style>
<!-- Put any valid HTML here that you want -->
<!-- You can even put variables ($xxxx) into the HTML as well, like this: -->
<td>$myVariable</td>
ENDMAIL
}
Что было приятно в этом, так это то, что я мог буквально копировать и вставлять все свои CSS и HTML файлы (очень объемные), если они находились между тегами «ENDMAIL», и они отображались бы идеально. Я мог бы даже поместить туда переменные без необходимости выполнять какую-либо дополнительную работу.
Мои вопросы: Существует ли библиотека C с аналогичной функциональностью?Я действительно не думаю, что могу позволить себе сделать что-то подобное:
cout << "<html>" << endl;
cout << "<head>" << endl;
cout << "......" << endl;
Я бы хотел, чтобы оно было достаточно легким.
Спасибо.
Комментарии:
1. C / C не поддерживают
here
документы. Это должна быть строка в кавычках. Но компилятор автоматически объединит несколько строк в исходном файле.2. Не используйте
endl
. Просто используйте'n'
. Это быстрее и так же переносимо.3. В C должна быть хорошая библиотека шаблонов, которая сгенерировала бы текст электронного письма. Вам нужна хорошая библиотека MIME для создания самого электронного письма, но тело HTML-сообщения должно быть создано шаблонизатором.
4. @Omnifarious: Вы имеете в виду более быстрое по производительности? Мне больше нравится разделять «endl» по визуальным соображениям, и я могу вводить его быстрее, чем n.
5. Да, производительность выше. Оно постоянно сбрасывается, и для вывода тонны HTML это совершенно не нужно. Кто-то должен придумать красиво названную символьную константу для использования всеми, которая не сбрасывается постоянно.
Ответ №1:
Самый простой способ, о котором я знаю, — использовать класс SMTPClientSession из библиотек POCO C . Вот хороший пример.
Ответ №2:
Вы могли бы определить текст как const char *
что облегчило бы боль и страдания при выводе каждой строки через cout
:
const char email_text[] =
"<html>n"
"<head>n"
"....";
cout.write(email_text, sizeof(email_text) - 1);
cout.flush();
std::string email_string(email_text);
cout << email_text;
cout.flush();
Я не использовал библиотеку, но я предполагаю, что вам нужно будет передать ее либо std::string
, либо char *
.
Ответ №3:
Вы могли бы рассмотреть mimetic
Ответ №4:
C не поддерживает here documents.
Вам нужно будет использовать строку и отправить ее в нужный поток:
void PrintStyles(ostreamamp; mailstream)
{
mailstream <<
"<html>n"
" <head>n"
" <style>n"
" h1.title { color: Red; }n"
" h3.title { color : Black; background-color: yellow; }n"
" </style>n"
"n"
"<!-- Put any valid HTML here that you want -->n"
"<!-- You can even put variables (" << xxxx << ") into the HTML as well, like this: -->n"
" <td>" << myVariable << "</td>n"
"n"
"n";
}
Откуда вы получаете почтовый поток, будет зависеть от того, какой почтовый пакет вы используете.
Комментарии:
1. Спасибо за ссылку. Я не был знаком с термином «здесь документы».
Ответ №5:
Спасибо всем за ответы. Я решил просто вызвать Perl-скрипт из своего кода и отправить данные ответа в качестве аргумента. Я знаю, что это, вероятно, не лучшее решение, но я не думаю, что мои варианты C того стоили.
// Retrieve the POST data
char* contentLength = getenv{"CONTENT_LENGTH"};
int contentSize = atoi(contentLength);
char* contentBuffer = (char*)malloc(contentSize);
fread(contentBuffer, 1, contentSize, stdin);
string data = contentBuffer;
// Execute "sendmail.pl" script
string perlFile = "sendmail.pl";
string command = "perl " perlFile " "" data """;
system(command.c_str());