Fragment kodu z Delphi do C++ Buildera

0

Witam,

przepisuję swój program do wysyłania maili z Delphi do C++ Buildera. Jako że z C++ mam mniej doświadczenia niż z Delphi, chciałbym zapytać czy prawidłowo przetłumaczyłem poniższy kod z Delphi

idMessage := TidMessage.Create(self);

do C++ Buildera:

TIdMessage *idMessage = new TIdMessage ( this );

Pozdrawiam!

PS. Pytam dlatego że obydwa kody mi działają, ale w Delphi wysyła mi maila prawidłowo natomiast w C++ Builder zwraca mi błąd z serwera, pomimo że wszystkie parametry są takie same.

0

Powyższe jest OK. Użyj debuggera. Możesz nawet odpalić i Delphi i Buildera na raz i debuggerem przechodzić linijka po linijce w obydwu i patrzyć gdzie się pojawią różnice w wykonaniu.

0

To nie wygląda mi na winę kodu tylko na "zewnętrzny" błąd, jakby serwerowi coś nie pasowało. Idę teraz na kolokwium, jak wrócę to wkleję komunikat błędu.

0

Skoro serwer odpowiada inaczej niż powinien to sprawdź czy na pewno wysyłasz takie zapytanie jak trzeba, takie same jak w kodzie Delphi.

0

Dla ścisłości oto kod w C++ Builderze:

//====================== wysylanie maila ze statusem ===========================
TIdMessage *idMessage = new TIdMessage ( this );//!!!!!!!
     IdMessage->Body->Assign(Memo1->Lines); //tekst maila
     IdMessage->From->Text = "[email protected]";
     IdMessage->Recipients->EMailAddresses = "[email protected]";
     IdMessage->Subject = "Temat maila";

     IdSMTP->Host = "poczta.interia.pl";
     IdSMTP->Port = 587;
     IdSMTP->AuthenticationType = atLogin;
     IdSMTP->UserId = "[email protected]";
     IdSMTP->Password = "haselko";

     try
     {
       IdSMTP->Connect();
       IdSMTP->Send(idMessage);
     }
     __finally
     {
       IdSMTP->Disconnect();
       idMessage->Free();
       ShowMessage("Mail poszedl!");
     }

//------------------------------------------------------------------------------
}

A to w Delphi:

procedure TGlowna.FormCreate(Sender: TObject);
var
  idMessage: TidMessage;
begin 

//====================== wysylanie maila ze statusem ===========================
idMessage := TidMessage.Create(self);
     idMessage.Body.Append('');
     idMessage.From.Text := '[email protected]';
     idMessage.Recipients.EMailAddresses := '[email protected]';
     idMessage.Subject := 'Temat maila';

     idSMTP.Host := 'poczta.interia.pl';
     idSMTP.Port := 587;
     idSMTP.AuthenticationType := atLogin;
     idSMTP.Username := '[email protected]';
     idSMTP.Password := 'haselko';

     try
       idSMTP.Connect;
       idSMTP.Send(idMessage);

     finally
       idSMTP.Disconnect;
       idMessage.Free;
     end;

//------------------------------------------------------------------------------
end;

I wyskakuje mi komunikat: 554 5.5.1 Error: no valid recipients.

A w Delphi normalnie działa.

0

Sprawdź debuggerem, linijka po linijce co się dzieje i jakie są wartości poszczególnych pól/zmiennych.

0

Używasz innych pól:

IdSMTP->UserId = "[email protected]";

idSMTP.Username := '[email protected]';

  1. Jakiego typu jest IdMessage->Recipients->EMailAddresses?
0

adf88 użyłem

IdSMTP->UserId = "[email protected]";

ponieważ w komponentach Indy z C++ Builder 6 nie ma takiego pola jak idSMTP.Username.

A IdMessage->Recipients->EMailAddresses jest typu AnsiString.

0

The 554 5.5.1 error is the SMTP error "no valid recipients". It can occur if you've misspelled the recipient addresses but it can also occur if you are not properly authenticating to the outgoing server.
(źródło: http://answers.microsoft.com/en-us/office/forum/office_2003-outlook/error-554-551-y-sent-messages-are-stopped-by/49514fd3-2621-42cb-a911-1710bc7a72f5?msgId=ab6059c9-35e2-4729-ab5b-62f6ab64d764)

Tak więc wydaje mi się, że coś może być nie tak danymi do logowania. Czy zawierają one może jakieś znaki spoza ascii? Może z kodowaniem jest problem? Może to pole UserID to jednak nie to o co chodzi?

0

Kod jest poprawny (z wyjątkiem błędów typu komunikat o poprawnym wysłaniu w __finally, braku sprawdzania Connected itp) i mail jest wysyłany jeżeli tylko podasz poprawne dane logowania.

0
kAzek napisał(a):

Kod jest poprawny (z wyjątkiem błędów typu komunikat o poprawnym wysłaniu w __finally, braku sprawdzania Connected itp) i mail jest wysyłany jeżeli tylko podasz poprawne dane logowania.

Nie jest wysyłany bo na Delphi działa ana Builderze nie.

0

Co znaczy "działa". Wysyła maila czy nie?

0

Tak, w Delphi wysyła maila normalnie. Na BCB nie. Spokoju nie daje mi ten komunikat. Wydaje mi się że jakoś źle definiuję metodę gdzie wpisuję adres odbiorcy skoro pokazuje "brak prawidłowych odbiorców"...

0

Tłumaczę po raz 2 że sprawdziłem i ten kod działa przynajmniej w C++ Builder 6 i Indy 8.0.25 (czyli wersja która się instaluje wraz z kompilatorem).

Chwilunia proszę Pana a czemu raz IdMessage a raz idMessage dla C++ wielkość liter to przecież różnica tu tworzysz w kodzie dynamicznie idMessage a na formie pewnie masz położony IdMessage kod się skompiluje ale efekt może być taki o jakim piszesz.

0

kAzek właśnie chodzi o to że próbowałem to skompilować na BCB6 z tą wersją która instaluje się z kompilatorem i już myślałem że to kwestia wersji indy (bo na delphi 7 są już Indy 9) więc próbowałem ściągać indy 9 i do tego zainstalowałem update do BCB i troszkę mi się chyba sknocił. Teraz gdy uruchamiam ten program, pokazuje mi się komunikat:
user image

Nie wiem czy to jest spowodowane bibliotekami indy czy jak.

Co do problemu z wielkościami liter, idMessago to element tworzony w metodzie:

TIdMessage *idMessage = new TIdMessage ( this );

natomiast IdMessage to komponent IdMessage1, więc na końcu mamy wysyłanie tego pierwszego za pomocą komponentu:

IdSMTP->Send(idMessage);
0

Wypełniasz IdMessage. Wysyłasz idMessage. Czyż nie?

0
  1. Co do błędu usuń Indy i zainstaluj ponownie
  2. co z tego że wysyłasz idMessage (to utworzone dynamicznie) jak wypełniasz wszędzie IdMessage zdecyduj się i wywal albo to tworzenie dynamicznie czyli:
TIdMessage *idMessage = new TIdMessage ( this )

oraz

idMessage->Free();

i wyślij

IdSMTP->Send(IdMessage);

albo odwrotnie zmień wszędzie w kodzie na z małej litery.

0

Ahh sorry kAzek, nie zrozumiałem Cię, już rozumiem :) Powiedz mi tylko jak usunąć Indy i zainstalować jeszcze raz? Nie mam tego w Dodaj/Usuń programu a jak reinstaluję całego BCB to problem wciąż jest ten sam. Pytam bo poprawiłem ten kod na małe litery ale ten komunikat znowu się pojawia.

0

Błąd ten nie musi być powodowany zwaleniem Indy być może coś w projekcie dziwnie namieszałeś i BCB po prostu głupieje i sypie dziwnymi komunikatami. Zanim weźmiesz się za instalację spróbuj kod odpowiedzialny za wysłanie maila zrobić jako nowy projekt.

Jeżeli jednak będziesz musiał instalować to:
Component -> Intall Packages tam zaznacz Internet Direct i Remove jak usunie zamknij BCB a następnie pobierz
http://www.indyproject.org/downloads/Indy_9_00_17_src.zip
a jak zainstalować masz opisane http://www.elektroda.pl/rtvforum/topic1736739.html#8374319

0

kAzek to nic nie daje, jest to samo. Co ciekawe - ten komunikat pojawia się jak uruchamiam ten program osobno, nie spod środowiska BCB. Spróbuje jeszcze raz go przeinstalować. Być może ten update mi namieszał.

0

Nie, nowego nie robiłem. Usunąłem indy, zainstalowałem jeszcze raz i to samo. Już usunąłem BCB i usuwam jeszcze po nim wpisy i pliki. Zainstaluje na nowo bez update i zobacze co mi to da.

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