Problem z polskimi znakami przy wysyłaniu poczty

0

Cześć!
Napisałem prostą aplikację pocztową bazującą na kompenentach z pakiety Indy (idsmtp, itdMessage itd). Treść wiadomości pobieram z komponentu Memo. Tu pojawia się problem, bo w MEMO wszystko łądnie wygląda, natomiast wysłana wiadomość ma krzaczki zamiast polskich znaków.
Czym jest to spowodowane? Nie wiem czy mam szukać przyczyny w MEMO czy w idSMTP. Pomóżcie proszę!!! Dodam, że banalan rzecz jak zmiana czcionki nie pomaga ;-)

Pozdrowionka

0

a zmiana strony kodowej? albo kodowanie polskich liter metodą Quoted Printable?

0

Napiszcie na ten temat coś więcej - mam ten sam problem, a nie mogę sobie z nim poradzić. :-[

0

kodowanie Quoted Printable - zamieniasz wszystkie znaczki o kodach powyżej 127 lub 61 (znaczek '=') na =XX gdzie XX to numer (szesnastkowy) kodowanej litery. wtedy żaden program zajmujący się przekazywaniem poczty nie zmieni strony kodowej liter.
odkodowywanie to banał - jeśli gdziekolwiek trafi w tekscie się znaczek =, to pobieramy dwa następne znaki i wstawiamy znaczek, który kryje się pod ich wartościami.

0

No tak, ale jak ktoś odbierze tak wysłaną wiadomość na przykład Outlookiem, to nie będzie miał tam krzaków?

0

No tak, ale jak ktoś odbierze tak wysłaną wiadomość na przykład Outlookiem, to nie będzie miał tam krzaków?

Nie (popatrz sobie do źródeł wiadomości w LookOucie).


(...ciach...tu nagłówek) Content-Type: multipart/alternative;   boundary="----=_NextPart_000_00A9_01C3CB06.34C25860" (...ciach... tu reszta nagłówka)

(linijka przerwy i treść:)
This is a multi-part message in MIME format.

------=_NextPart_000_00A9_01C3CB06.34C25860
Content-Type: text/plain;
charset="iso-8859-2"
Content-Transfer-Encoding: quoted-printable

=3D=3D> dzi=EAkuj=EA bardzo (...ciach...)


=3D=3D> dziekuj=EA
oznacza
==> dziękuję

0

Coś mi dzisiaj nie idzie. Mógłbyś podpowiedzieć co dalej...

Mam MessageSend:TidMessage i chcę załóżmy MessageSend.Body.Append(tekst) gdzie tekst:string='ąęśćóń'.

To jak to będzie po kolei?
MessageSend.CharSet:='iso-8859-2';
MessageSend.ContentType:='text/plain';
MessageSend.ContentTransferEncoding:= 'quoted-printable';

a dalej???

0

Mam MessageSend:TidMessage i chcę załóżmy MessageSend.Body.Append(tekst) gdzie tekst:string='ąęśćóń'.

To jak to będzie po kolei?

no nie, bez przesady, przekonwertuj sobie sam te literki, przecież nie będę pisać całego algorytmu, zwłaszcza że jest to dość proste.

0

Miej litość nad tępotą i pokaż w kodzie Delphi przykładowo jedną literkę

// jaka samokrytyka, fajnie [soczek]. napisał bym ten kod, ale na szczęście berl mnie ubiegł i chwała mu za to - ŁF

0

No, zrobiłem tak i uzyskałem to com chciał :

function ZamienNaQuotedPrintable(tekst : string) : string;
var
    i : integer;
    poczatek : string;
    koniec : string;
    Wstaw : string;
begin
    i := 1;
    repeat
        if (Ord(tekst[i]) > 127) or (Ord(tekst[i]) = 61) then begin
            Poczatek := Copy(tekst, 0, i-1);
            Koniec := Copy(tekst, i+1, Length(tekst));
            Wstaw := '=' + IntToHex(Ord(tekst[i]),2);
            Tekst := Poczatek + Wstaw + Koniec;
            i := i + 3;
        end
        else i := i + 1;
    until i = Length(tekst) + 1;
    Result := tekst;
end;

Wysyłanie :

IdMessage1.CharSet:='Windows-1250';
IdMessage1.ContentType:='text/plain';
IdMessage1.ContentTransferEncoding:= 'quoted-printable';

IdMessage1.Body.Append(ZamienNaQuotedPrintable(TrescEmaila.Text));
IdMessage1.From.Address := 'Od kogo email';
IdMessage1.From.Name := 'Od kogo nazwa';
IdMessage1.Recipients.EMailAddresses := 'do kogo email';
IdMessage1.Subject := 'temat';

IdSMTP1.UserName := 'user';
IdSMTP1.Password := 'haslo';
IdSMTP1.Host := 'smtp.host';
IdSMTP1.Connect;
IdSMTP1.Send(IdMessage1);
0

Wielkie Dzięki!
Brakowało mi tego momentu: Wstaw := '=' + IntToHex(Ord(tekst[i]),2);

0

Pozwoliłem sobie trochę zmodyfikować tą funkcję:

function ZamienNaQuotedPrintable(tekst:string):string;
var
i:Integer;
tekstH:string;
begin
tekstH:='';
if tekst<>'' then
begin
tekstH:='';
for i:=1 to Length(tekst) do
if (Ord(tekst[i]) > 127) or (Ord(tekst[i]) = 61) then
tekstH:=tekstH+'='+IntToHex(Ord(tekst[i]),2)
else
tekstH:=tekstH+tekst[i];
end;
Result:=tekstH;
end;
I wszystko byłoby OK tylko pod warunkiem, że program pocztowy odbiorcy poczty ustawiony jest na kodowanie Windows, dla ISO niestety...

0

To jaki to jest problem? Przy wysyłaniu ustawiasz

IdMessage1.CharSet:='Windows-1250';

, a program pocztowy taki jak outlook sobie sam ustawi kodowanie, a twój program przecież cały czas może jechać na kodowaniu Windows, albo możesz też odczytywać ze źródeł wiadomości jaki jest charset, a potem konwertować przychodzącą wiadomości na kodowanie Windows. Swoją drogą jak napiszesz taką funkcję do konwertowania z dowolnej strony kodowej na inną dowolną stronę, to poproszę.

0

No tak, masz rację - wielkie dzięki.

0

Swoją drogą jak napiszesz taką funkcję do konwertowania z dowolnej strony kodowej na inną dowolną stronę, to poproszę.

Proszę bardzo - wersja pierwsza konwertera, gdzieś miałem kod, który robi to jeszcze szybciej, ale niw mogę go znaleźć.

function ConvertISO852(ch : char) : char;  { Z 8859-2 na IBM cp-852 }
begin
  case ch of
  #161 : ConvertISO852 := #164;
  #198 : ConvertISO852 := #143;
  #202 : ConvertISO852 := #168;
  #163 : ConvertISO852 := #157;
  #209 : ConvertISO852 := #227;
  #211 : ConvertISO852 := #224;
  #166 : ConvertISO852 := #151;
  #172 : ConvertISO852 := #141;
  #175 : ConvertISO852 := #189;
  #177 : ConvertISO852 := #165;
  #230 : ConvertISO852 := #134;
  #234 : ConvertISO852 := #169;
  #179 : ConvertISO852 := #136;
  #241 : ConvertISO852 := #228;
  #243 : ConvertISO852 := #162;
  #182 : ConvertISO852 := #152;
  #188 : ConvertISO852 := #171;
  #191 : ConvertISO852 := #190;
  '&#8222;'  : ConvertISO852 := '"';
  else ConvertISO852 := ch;
  end;
end;

function ConvertISO1250(ch : char) : char;  { Z 8859-2 na Windows Latin-2 1250 }
begin
  case ch of
  #161 : ConvertISO1250 := #165;
  #166 : ConvertISO1250 := #140;
  #172 : ConvertISO1250 := #143;
  #177 : ConvertISO1250 := #185;
  #182 : ConvertISO1250 := #156;
  #188 : ConvertISO1250 := #159;
  '&#8222;'  : ConvertISO1250 := '"';
  else ConvertISO1250 := ch;
  end;
end;

function Convert1250ISO(ch : char) : char;  { Z 1250 na 8859-2 }
begin
  case ch of
  #165 : Convert1250ISO := #161;
  #140 : Convert1250ISO := #166;
  #143 : Convert1250ISO := #171;
  #185 : Convert1250ISO := #177;
  #156 : Convert1250ISO := #182;
  #159 : Convert1250ISO := #188;
  '&#8222;'  : Convert1250ISO := '"';
  else Convert1250ISO := ch;
  end;
end;


function Convert852ISO(ch : char) : char;  { z cp-852 na 8895-2}
begin
  case ch of
  #164 : Convert852ISO := #161;
  #143 : Convert852ISO := #198;
  #168 : Convert852ISO := #202;
  #157 : Convert852ISO := #163;
  #227 : Convert852ISO := #209;
  #224 : Convert852ISO := #211;
  #151 : Convert852ISO := #166;
  #141 : Convert852ISO := #172;
  #189 : Convert852ISO := #175;
  #165 : Convert852ISO := #177;
  #134 : Convert852ISO := #230;
  #169 : Convert852ISO := #234;
  #136 : Convert852ISO := #179;
  #228 : Convert852ISO := #241;
  #162 : Convert852ISO := #243;
  #152 : Convert852ISO := #182;
  #171 : Convert852ISO := #188;
  #190 : Convert852ISO := #191;
  '&#8222;'  : Convert852ISO := '"';
    else Convert852ISO := ch;
  end;
end;

Tylko coś się popaćkało z '„', chodzi o znaczek [code]'„'[/code]

1 użytkowników online, w tym zalogowanych: 0, gości: 1