Простой способ отправить электронное письмо в формате HTML на C

#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());