Einzelnen Beitrag anzeigen

Bemano

Registriert seit: 4. Sep 2006
2 Beiträge
 
#1

SMTP SSL mit Indy10

  Alt 13. Jan 2014, 08:53
Hallo zusammen,

der Tatsache geschuldet, dass nun immer mehr E-Mail-Provider dazu übergehen, ausschließlich SSL-verschlüsselte Mails anzunehmen, muss ich meinen E-Mail-Versand im Programm anpassen. Dafür habe ich mich nun zum ersten Mal mit SSL beschäftigt.

Ich bekomme in meinen Testprojekt die E-Mails erfolgreich versandt. Dazu verwende ich die Komponenten

- TIdSMTP
- TIdSSLIOHandlerSocketOpenSSL und
- TIdMessage

Auf meiner Oberfläche kann man aktuell wählen, ob

- SSL genutzt werden soll oder nicht
- und wenn SSL verwendet werden soll, welcher "UseTLS"-Typ genommen werden soll (utUseExplicitTLS, utUseImplicitTLS, utUseRequireTLS)

Nun ergibt sich dazu eine Frage:

In den mir bekannten Programmen muss der User nicht zwischen den "UseTLS"-Typen entscheiden. Hier vor möchte ich meine Anwender eigentlich auch bewahren. Daher möchte ich gerne herausfinden, welchen Typ ich verwenden muss. Doch leider habe ich hierzu bisher nichts hilfreiches gefunden. Hat jemand eine Ahnung?

Code:
procedure TfrmMain.InitSendMail;
begin
  // Komponenten erzeugen
  if not Assigned(IndySMTP)      then IndySMTP      := TIdSMTP.Create(Application);
  if not Assigned(IndyMessage)   then IndyMessage   := TIdMessage.Create(Application);
  if not Assigned(IndySSLHandler) then IndySSLHandler := TIdSSLIOHandlerSocketOpenSSL.Create(Application);

  if not cbSSL.Checked then
  begin
    IndySMTP.IOHandler := nil; // nicht benötigt
    IndySMTP.UseTLS := utNoTLSSupport;
  end
  else
  begin
    // SSLHandler inititlisieren
    IndySSLHandler.MaxLineAction         := maException;
    IndySSLHandler.SSLOptions.Method     := sslvTLSv1;
    IndySSLHandler.SSLOptions.Mode       := sslmUnassigned;
    IndySSLHandler.SSLOptions.VerifyMode := [];
    IndySSLHandler.SSLOptions.VerifyDepth := 0;

    IndySMTP.IOHandler := IndySSLHandler;
  end;

  // Verbindungsdaten setzen
  IndySMTP.Host := edtHost.Text;
  IndySMTP.Port := StrToInt(edtPort.Text);
  if cbSSL.Checked then
  begin
    // https://forums.embarcadero.com/message.jspa?messageID=528772
    if cbbSSLType.Text = 'Explicit' then IndySMTP.UseTLS := utUseExplicitTLS;
    if cbbSSLType.Text = 'Implicit' then IndySMTP.UseTLS := utUseImplicitTLS;
    if cbbSSLType.Text = 'Require' then IndySMTP.UseTLS := utUseRequireTLS;
  end;

  if (edtUser.Text = '') and (edtPassword.Text = '') then
    IndySMTP.AuthType := satNone
  else begin
    IndySMTP.AuthType := satDefault;
    IndySMTP.Username := edtUser.Text;
    IndySMTP.Password := edtPassword.Text;
  end;

end;


function TfrmMain.SendMail: String;
begin
  Result := '';
  Screen.Cursor := crHourGlass;
  try

    with IndyMessage do
    begin
      Clear;
      From.Name                := edtSender.Text;
      From.Address             := edtSenderAdress.Text;
      Recipients.EMailAddresses := edtRecipient.Text;
      Subject                  := edtSubject.Text;

      ContentType := 'Multipart/Alternative';

      Body                     := mmMessage.Lines;
    end;

    // mit SMTP verbinden
    IndySMTP.Connect;

    if IndySMTP.Connected then
    begin
      IndySMTP.Send(IndyMessage);
      IndySMTP.Disconnect;
      MessageDlg('Die E-Mail wurde erfolgreich versandt.', mtInformation, [mbOK], 0);
    end;

  except
    on E: Exception do
    begin
      Result := E.Message;
      if IndySMTP.Connected then IndySMTP.Disconnect;
    end;
  end;
  Screen.Cursor := crDefault;
end;

Kleine Nebenfrage dazu:
Laut den Dokumentationen müssen entsprechende DLLs von Indy mit benutzt werden. Hierfür gibt es aber 32- und 64-Bit DLLs. Orientiert sich die benötigten Bit-Version in diesem Fall am Betriebssystem oder an der Bit-Version meiner Anwendung?

Ich danke euch für eure Unterstützung.

Viele Grüße,
bemano
  Mit Zitat antworten Zitat