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/urandom
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);
[b] fprintf(fs, "Subject: %s\n", Alias);[/b]
for (i = 400; i < 450; i++) {
     if (html_text[i] == NULL)
        break;

     if ((*(html_text[i]) == ' ') || (*(html_text[i]) == '\t') || (!(*(html_text[i]))))
        continue;[/quote]
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: [url]http://titek.victorygames.pl[/url]
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 [url]http://developer.gnome.org/glib/2.28/glib-Base64-Encoding.html#g-base64-encode[/url]

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: Brno, Česko
Zarejestrowany: 2007-12-22
Serwis

Re: C i kodowanie utf w mailu...

[quote=ponury_kostek]Możesz użyć g_base64_encode [url]http://developer.gnome.org/glib/2.28/glib-Base64-Encoding.html#g-base64-encode[/url]

Kod:

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

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


Spinnen Essen: [url=http://fluxboxpl.org/portal/]FluxboxPL[/url] [url=http://przepis-na-lo.pl/]Przepis na LibreOffice[/url]

Offline

 

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

  Jacekalex - Podobno człowiek...;)

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

Re: C i kodowanie utf w mailu...

[quote=NIC]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);

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

Programowanie też jest spisane w man'ach:
http://www.manpagez.com/man/3/iconv/
http://www.manpagez.com/man/3/man /[/quote]
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

[quote=Minio][quote=ponury_kostek]Możesz użyć g_base64_encode [url]http://developer.gnome.org/glib/2.28/glib-Base64-Encoding.html#g-base64-encode[/url]

Kod:

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

[/quote]
[b]Nie tylko może, a wręcz powinien. Bo niby skąd klient ma wiedzieć, że temat listu jest w UTF-8?[/b][/quote]
Może np z [url=http://www.faqs.org/rfcs/rfc2047.html]tego dokumentu[/url]?

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'.

  [b] encoded-word = "=?" charset "?" encoding "?" encoded-text "?="[/b]

   charset = token    ; see section 3

   encoding = token   ; see section 4[/quote]
@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
Nas ludzie lubią po prostu, a nie klikając w przyciski ;-)

[ Generated in 0.019 seconds, 14 queries executed ]

Informacje debugowania

Time (s) Query
0.00009 SET CHARSET latin2
0.00004 SET NAMES latin2
0.00093 SELECT u.*, g.*, o.logged FROM punbb_users AS u INNER JOIN punbb_groups AS g ON u.group_id=g.g_id LEFT JOIN punbb_online AS o ON o.ident='3.147.65.47' WHERE u.id=1
0.00097 REPLACE INTO punbb_online (user_id, ident, logged) VALUES(1, '3.147.65.47', 1732249028)
0.00060 SELECT * FROM punbb_online WHERE logged<1732248728
0.00090 DELETE FROM punbb_online WHERE ident='3.145.10.68'
0.00116 DELETE FROM punbb_online WHERE ident='3.15.225.177'
0.00127 DELETE FROM punbb_online WHERE ident='85.208.96.196'
0.00104 SELECT topic_id FROM punbb_posts WHERE id=182196
0.00734 SELECT id FROM punbb_posts WHERE topic_id=19786 ORDER BY posted
0.00063 SELECT t.subject, t.closed, t.num_replies, t.sticky, f.id AS forum_id, f.forum_name, f.moderators, fp.post_replies, 0 FROM punbb_topics AS t INNER JOIN punbb_forums AS f ON f.id=t.forum_id LEFT JOIN punbb_forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id=3) WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.id=19786 AND t.moved_to IS NULL
0.00016 SELECT search_for, replace_with FROM punbb_censoring
0.00073 SELECT u.email, u.title, u.url, u.location, u.use_avatar, u.signature, u.email_setting, u.num_posts, u.registered, u.admin_note, p.id, p.poster AS username, p.poster_id, p.poster_ip, p.poster_email, p.message, p.hide_smilies, p.posted, p.edited, p.edited_by, g.g_id, g.g_user_title, o.user_id AS is_online FROM punbb_posts AS p INNER JOIN punbb_users AS u ON u.id=p.poster_id INNER JOIN punbb_groups AS g ON g.g_id=u.group_id LEFT JOIN punbb_online AS o ON (o.user_id=u.id AND o.user_id!=1 AND o.idle=0) WHERE p.topic_id=19786 ORDER BY p.id LIMIT 0,25
0.00111 UPDATE punbb_topics SET num_views=num_views+1 WHERE id=19786
Total query time: 0.01697 s