Polskie kodowanie e-mailów pod Indy10 i kłopoty z załącznikami

0

Od jakiegoś czasu pracuję nad aplikacją automatycznie wysyłającą wiadomości e-mail z załącznikami, wykorzystując do tego celu technologię Indy 10 pod Delphi 7. Zgodnie z poradnikiem na http://www.indyproject.org/sockets/blogs/rlebeau/2005_08_17_a.en.aspx oficjalnej stronie projektu, posłużyłem się poniższym kodem komponującym wiadomość składającą się z tekstu HTML i załączonego pliku:

with TIdText.Create(IdMessage1.MessageParts, nil) do begin
    CharSet := 'windows-1250';
    Body.LoadFromFile('html z treścią');
    ContentType := 'text/html';
end;
 
with TIdAttachmentFile.Create(IdMessage1.MessageParts, 'tu załącznik') do begin
    ContentType := 'application/pdf';
    FileName := 'tu załącznik';
end;
 
IdMessage1.ContentType := 'multipart/mixed';

No i wiadomość dochodzi do adresata prawidłowo, zawiera treść z dokumentu źródłowego i załączony plik, ale nadal pojawiają się dwa problemy:

  1. Niezależnie jakie kodowanie nie ustawić w CharSet, wiadomość nigdy nie wyświetla polskich znaków. Próbowałem wpisać windows-1250, ISO-8859-2, UTF-8, cp1250, default czy co tam jeszcze ludzie zawsze proponują, ale za każdym razem polskie znaki były albo zastąpione losowymi niepolskimi literami (zwykle dużymi) albo w ogóle znikały. Co ciekawe, w normalnym e-mailu bez załączników i wykorzystującym tylko Body (bez MessageParts) wszystkie polskie znaki wyświetlają się bez problemu.
  2. Skrzynka odbiorcza nie rozpoznaje nazwy ani typu załącznika (pomimo że są jasno w kodzie określone) i wyświetla go tylko jako plik_0. O dziwo podczas pobierania typ (pdf) jest rozpoznany, ale nazwa jest jako noname, zaś na dysku jest po prostu zapisywano jak plik noname bez żadnego typu i trzeba go dopiero otworzyć w Acrobat Reader. O dziwo załączniki graficzne typu image/png są wyświetlane jako plik_0.png z miniaturką w ikonie, ale reszta dokładnie tak samo. (też noname etc.)
    Próbowałem wysyłać e-maile na dwa różne konta, na Onet Poczta i GMail, w obydwu przypadkach to samo. Szukałem czy może już ktoś na tym forum udzielił odpowiedź na tego typu problem ale jedyna rada jaką znalazłem to "Nie używać Indy", co w moim wypadku nie wchodzi w grę bo muszę akurat na tym pakiecie to zrobić...

`dodanie znaczników # i ``` - @furious programming

1

widzę jak się męczysz... no dobra łapaj kod... co do indy, to jak ktoś ni ema pojęcia co robi to będzie narzekał na wszystko.

 with TIdText.Create(FMail.FMessage.MessageParts, nil) do
  begin
    ContentType := 'multipart/alternative';
  end;

  if FMail.FBodyPlainText.Text <> '' then
    with TIdText.Create(FMail.FMessage.MessageParts, nil) do begin
      Body.Text := FMail.FBodyPlainText.Text;
      ContentType := 'text/plain';
      CharSet := ACharSet; // kodowanie znakowe
      ParentPart := 0;
    end;

  if FMail.FBodyHTMLText.Text <> '' then
    with TIdText.Create(FMail.FMessage.MessageParts, nil) do
    begin
      Body.Text := FMail.FBodyHTMLText.Text;
      ContentType := 'text/html';
      CharSet := ACharSet; // kodowanie znakowe
      ParentPart := 0;
    end;

  if FileExists(FMail.FFileName) then
    with TIdAttachmentFile.Create(FMail.FMessage.MessageParts, FMail.FFileName) do
    begin
      ContentID := FMail.FFileName;
      ContentType := 'application/octet-stream';
      CharSet := ACharSet; // kodowanie znakowe
      FileIsTempFile := False;
      ContentDisposition := 'inline';
      FileName := FMail.FFileName;
      DisplayName := FMail.FFileName;
    end;

  FMail.FMessage.ContentType := 'multipart/related; type="multipart/alternative"';
  FMail.FMessage.CharSet := ACharSet;  // kodowanie znakowe
  FMail.FMessage.Subject := FMail.FSubject;
  FMail.FMessage.From.Address := FMail.FFrom;
  FMail.FMessage.Recipients.EMailAddresses := FMail.FRecipients;
  FMail.FMessage.BCCList.EMailAddresses := FMail.FHideRecipients;

  try
    FSMTP.Connect();

    if FSMTP.Connected then
    begin
      FSMTP.Send(FMail.FMessage);

      if Assigned(ALog) then
        ALog.Add('Pomyślnie wysłano e-mail na adres/y: ' + FMail.FRecipients + #10#13 + FMail.FHideRecipients);

      Result := True;
    end;
  except
    on E: Exception do
    begin
      if Assigned(ALog) then
        ALog.Add('Wysyłanie zakończone niepowodzeniem! ' + E.Message);
    end;
  end;
0
danny napisał(a):
CharSet := ACharSet; // kodowanie znakowe

Eeee a te ACharSet to skąd wziąć? Bo googlałem za tym i jedynie gdzie to znalazłem to jako parametr jakiejś funkcji...

0

hmm.....

ACharset to jest zmienna string, podaj w tym miejscu kodowanie np 'UTF-8', 'cp-1250' etc itp itd.

2

A ja robię tak i nigdy nie natrafiłem na problemy:

procedure TForm1.ButtonSendClick(Sender: TObject);
var
  bmppart: TIdAttachmentFile;
  SenderDomian, AttachPath, AttachFileName: string;
begin
  IdMessage1.ContentType:= 'multipart/mixed; charset=UTF-8';
  IdMessage1.CharSet:= 'UTF-8';
  IdMessage1.ContentTransferEncoding:= 'BASE64';

  SenderDomian:= '@wp.pl';
  IdSMTP1.Password:= '*******';
  IdSMTP1.Username:= '*******';

  IdMessage1.From.Name:= 'Od kogo mail';
  IdMessage1.From.Address:= IdSMTP1.Username +  SenderDomian;

  //IdSMTP1.Host := 'poczta.o2.pl';
  IdSMTP1.Host := 'smtp.wp.pl';

  IdMessage1.Recipients.EMailAddresses := '*******';

  IdMessage1.Subject:= 'ąćęłńóśźżĄĆĘŁŃÓŚŹŻ';

  with TIdText.Create(IdMessage1.MessageParts, nil) do
  begin
    CharSet := 'UTF-8';
    Body.Text:= AnsiToUTF8('ąćęłńóśźżĄĆĘŁŃÓŚŹŻ');
    ContentType:= 'text/html; charset=UTF-8';;
  end;

  AttachPath:= 'C:\Users\kAzek\Documents\';
  AttachFileName:= 'Dokument.rtf';
  with TIdAttachmentFile.Create(IdMessage1.MessageParts, AttachPath + AttachFileName) do
  begin
    DisplayName:= AttachFileName;
    FileName:= AttachFileName;
    ExtraHeaders.Values['Content-ID']:= '<' + AttachFileName + SenderDomian + '>';
  end;

  try
  IdSMTP1.Connect;
  IdSMTP1.Send(IdMessage1);
  finally
    IdSMTP1.Disconnect;
  end;
end;

procedure TForm1.IdMessage1InitializeISO(var VHeaderEncoding: Char;
  var VCharSet: String); //zdarzenie IdMessage - ważne
begin
  VHeaderEncoding := 'B'; //base64
  VCharSet := 'UTF-8';
end;
0

A ja robię tak i nigdy nie natrafiłem na problemy:

Przepisałem dokładnie tak jak powyżej (tylko z innymi parametrami) i nadal obydwa problemy tak samo :(

1

Pod Delphi 7 i indy 10? Jak host skrzynki nadawczej i jaki odbiorczej? Polskich znaków nie ma na skrzynce wchodząc przez przeglądarkę czy w jakimś programie pocztowym? Jakimi innymi parametrami chyba nie kodowania?

0

Parametry zmieniałem tylko te które miały być inne np. adresy etc., ale mimo wszystko okazało się że chyba i ten i wszystkie poprzednie wersje kodu były jednak prawidłowe, bo dziś akurat ktoś przyszedł i pogrzebał u mnie w Delphi, powywalał kilka plików, coś skopiował, cośtam skompilował, i teraz nawet o dziwo ten pierwszy kod chodzi bez problemów, więc wygląda na to że to była wina komputera a nie Indy...

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