Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!

Ogłoszenie

Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.

#1  2011-09-29 18:20:49

  Jacekalex - Podobno człowiek...;)

Jacekalex
Podobno człowiek...;)
Skąd: /dev/random
Zarejestrowany: 2008-01-07

C i kodowanie utf w mailu...

Witam

Chcę poprawić jeden błąd w qmailadminie, polegający na braku obsługi utf8 w module autoresponder.
Kod jest dość prosty, tylko nigdzie nie widzę, jak w iconv kodować nagłówki maila.

W php sprawa jest banalnie prosta:

Kod:

<?php
    $subjecttext = "zażółć gęślą jaźń";
    $settings = array(
        "scheme" => 'B',
        "input-charset" => 'UTF-8');

    $subject = iconv_mime_encode("Subject", $subjecttext, $settings);

?>

Tylko ja to potrzebuję w języku C,  wsadzić tutaj:

/*
   * Make the autoresponder message file
   */
sprintf(TmpBuf, "%s/message", TmpBuf2);
  if ( (fs = fopen(TmpBuf, "w")) == NULL ) ack("150", TmpBuf);
  fprintf(fs, "From: %s@%s\n", ActionUser,Domain);
fprintf(fs, "Subject: %s\n", Alias);
for (i = 400; i < 450; i++) {
     if (html_text[i] == NULL)
        break;

     if ((*(html_text[i]) == ' ') || (*(html_text[i]) == '\t') || (!(*(html_text[i]))))
        continue;

Wszelkie uwagi mile widziane.

Pozdrawiam
;-)

Ostatnio edytowany przez Jacekalex (2011-09-29 18:22:25)


W demokracji każdy naród ma taką władzę, na jaką zasługuje ;)
Si vis pacem  para bellum  ;)       |       Pozdrawiam :)

Offline

 

#2  2011-09-29 19:15:32

  NIC - Członek DUG

NIC
Członek DUG
Skąd: Wrocław
Zarejestrowany: 2006-12-25
Serwis

Re: C i kodowanie utf w mailu...

Coś takiego?

Kod:

#include <iconv.h>

iconv_handle = iconv_open ("UTF-8", "ASCII"); // ASCII?
// TODO: error handling
int result;
int AliasLen;
int utf8AliasLen;
char *utf8Alias;

AliasLen = strlen(Alias);
utf8Alias = malloc(3 * AliasLen);
result = iconv (iconv_handle, &Alias, &AliasLen, &utf8Alias, &utf8AliasLen);
// TODO: error handling
result = iconv_close (iconv_handle);
// TODO: error handling

//replace fprintf(fs, "Subject: %s\n", Alias);
fwrite(fs, 9, 1, "Subject: ");
fwrite(fs, utf8AliasLen, 1, utf8Alias);
fwrite(fs, 1, 1, "\n");

free(utf8Alias);

Programowanie też jest spisane w man'ach:
http://www.manpagez.com/man/3/iconv/
http://www.manpagez.com/man/3/iconv_open/

Ostatnio edytowany przez NIC (2011-09-29 19:15:47)


Stronka-dom: http://titek.victorygames.pl
Jabber: nic@jabster.pl
Hobby: kompilowanie Linuksa, Bluetooth
Dystrybucja: żadna, bliski krewny LFS, składak

Offline

 

#3  2011-09-29 20:10:59

  ponury_kostek - Użytkownik

ponury_kostek
Użytkownik
Skąd: Wałbrzych
Zarejestrowany: 2007-01-02
Serwis

Re: C i kodowanie utf w mailu...

Możesz użyć g_base64_encode http://developer.gnome.org/glib/2.28/glib-Base64-En … base64-encode

Kod:

fprintf(fs, "Subject: =?UTF-8?B?%s?=\n", g_base64_encode(Alias, strlen(Alias)));

Offline

 

#4  2011-09-29 20:30:32

  Minio - Użyszkodnik

Minio
Użyszkodnik
Skąd: Poznań, Polska
Zarejestrowany: 2007-12-22
Serwis

Re: C i kodowanie utf w mailu...

ponury_kostek napisał(-a):

Możesz użyć g_base64_encode http://developer.gnome.org/glib/2.28/glib-Base64-En … base64-encode

Kod:

fprintf(fs, "Subject: =?UTF-8?B?%s?=\n", g_base64_encode(Alias, strlen(Alias)));

Nie tylko może, a wręcz powinien. Bo niby skąd klient ma wiedzieć, że temat listu jest w UTF-8?

Offline

 

#5  2011-09-29 20:34:40

  Jacekalex - Podobno człowiek...;)

Jacekalex
Podobno człowiek...;)
Skąd: /dev/random
Zarejestrowany: 2008-01-07

Re: C i kodowanie utf w mailu...

NIC napisał(-a):

Coś takiego?

Kod:

#include <iconv.h>

iconv_handle = iconv_open ("UTF-8", "ASCII"); // ASCII?
// TODO: error handling
int result;
int AliasLen;
int utf8AliasLen;
char *utf8Alias;

AliasLen = strlen(Alias);
utf8Alias = malloc(3 * AliasLen);
result = iconv (iconv_handle, &Alias, &AliasLen, &utf8Alias, &utf8AliasLen);
// TODO: error handling
result = iconv_close (iconv_handle);
// TODO: error handling

//replace fprintf(fs, "Subject: %s\n", Alias);
fwrite(fs, 9, 1, "Subject: ");
fwrite(fs, utf8AliasLen, 1, utf8Alias);
fwrite(fs, 1, 1, "\n");

free(utf8Alias);

wygląda ciekawie, spróbuję, choć na razie C ma dla mnie urok języka starochińskiego

Te many mam w kompie, i przejrzałem je dość dokładnie, ale nic ciekawego w nich nie wyczytałem.

Jednak  po napisaniu 15% kalkulatora konsolowego w C++, to ja się za programistę nie uważam ;D

Minio napisał(-a):

ponury_kostek napisał(-a):

Możesz użyć g_base64_encode http://developer.gnome.org/glib/2.28/glib-Base64-En … base64-encode

Kod:

fprintf(fs, "Subject: =?UTF-8?B?%s?=\n", g_base64_encode(Alias, strlen(Alias)));

Nie tylko może, a wręcz powinien. Bo niby skąd klient ma wiedzieć, że temat listu jest w UTF-8?

Może np z tego dokumentu?

A konkretnie z tego fragmentu:

2. Syntax of encoded-words

   An 'encoded-word' is defined by the following ABNF grammar.  The
   notation of RFC 822 is used, with the exception that white space
   characters MUST NOT appear between components of an 'encoded-word'.

  encoded-word = "=?" charset "?" encoding "?" encoded-text "?="

   charset = token    ; see section 3

   encoding = token   ; see section 4

@MInio, bardzo cenię Twoją znajmość perla, i zagadnień programowania, ale niektóre uwagi (jak cytowana powyżej) świadczą o twojej bystrości w nieco odmienny sposób.

Pozdrawiam
;-)

Ostatnio edytowany przez Jacekalex (2011-09-29 22:59:47)


W demokracji każdy naród ma taką władzę, na jaką zasługuje ;)
Si vis pacem  para bellum  ;)       |       Pozdrawiam :)

Offline

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
Możesz wyłączyć AdBlock — tu nie ma reklam ;-)