Using INDY SMTPServer

老子叫甜甜 提交于 2019-12-01 00:05:37

To pass the email on to another system (Gmail in this case), use the TIdSMTPRelay component, eg:

procedure TForm1.IdSMTPServer1RcptTo(ASender: TIdSMTPServerContext;                
  const AAddress: string; AParams: TStrings; var VAction: TIdRCPToReply;                
  var VForward: string);                
begin                
  if (AAddress represents a user in your network) then
    VAction := rAddressOk
  else if (AAddress is outside of your network) then
    VAction := rWillForward;                    
end;

procedure TForm1.IdSMTPServer1MsgReceive(ASender: TIdSMTPServerContext; AMsg: TStream; var LAction: TIdDataReply); 
var 
  LMsg : TIdMessage; 
  LMsgClient: TIdMessageClient;
  LStream : TFileStream; 
  LRelayRecipients: TIdEMailAddressList;
  LRelay: TIdSMTPRelay;
  I: Integer;
begin 
  // When a message is received by the server, this event fires. 
  // The message data is made available in the AMsg : TStream. 
  // In this example, we will save it to a temporary file, and load it using 
  // IdMessage to parse some header elements. 

  LStream := TFileStream.Create(ExtractFilePath(Application.exename) + 'test.eml', fmCreate); 
  Try 
    LStream.CopyFrom(AMsg, 0); 
  Finally 
    LStream.Free; 
  End; 
  AMsg.Position := 0;

  LMsg := TIdMessage.Create; 
  Try 
    //LMsg.LoadFromFile(ExtractFilePath(Application.exename) + 'test.eml', False); 

    // Do not use the TIdMessage.LoadFrom...() methods here! The email
    // data contained in the AMsg stream does not escape leading periods
    // on lines of text. That escaping is only used when the email was
    // transmitted over the socket, as a period character has special
    // meaning to the SMTP protocol.  TIdSMTPServer removes the escaping
    // from the data before firing this event. However, the LoadFrom...()
    // methods (which uses TIdMessageClient internally) require the
    // data to be escaped!  This is a known limitation in Indy's core
    // architecture and will be addressed in Indy 11.  Until then,
    // use TIdMessageClient manually so the necessary escaping can be
    // re-introduced into the data while it is being parsed...

    LMsgClient := TIdMessageClient.Create(nil);
    try
      LMsgClient.IOHandler := TIdIOHandlerStreamMsg.Create(LMsgClient, AMsg);
      with TIdIOHandlerStreamMsg(LMsgClient.IOHandler) do
      begin
        FreeStreams := False;
        EscapeLines := True;
      end;
      LMsgClient.IOHandler.Open;
      LMsgClient.ProcessMessage(LMsg, False);
    finally
      LMsgClient.Free;
    end;

    // process LMsg as needed...

    // save the email for local users and forward it to other SMTP servers as needed...

    LRelayRecipients := nil;
    try
      for I := 0 to ASender.RCPTList.Count-1 do
      begin
        if (ASender.RCPTList[I] represents a user in your network) then
        begin
          // save AMsg in the user's mailbox somewhere on the local
          // machine/network where an POP3/IMAP4 client can retreive
          // it from later...
        end else
        begin
          if not Assigned(LRelayRecipients) then LRelayRecipients := TIdEMailAddressList.Create(nil);
          LRelayRecipients.Add.Assign(ASender.RCPTList[I]);
        end;
      end;

      if Assigned(LRelayRecipients) then
      begin
        LRelay := TIdSMTPRelay.Create(nil);
        try
          // you must supply the IP/Host of a DNS server that
          // will be used for determining the SMTP server of
          // each recipient domain...
          LRelay.DNSServer := ...;

          LRelay.Send(LMsg, LRelayRecipients);
        finally
          LRelay.Free;
        end;
      end;
    finally
      LRelayRecipients.Free;
    end;

  Finally 
    LMsg.Free; 
  End; 
end; 
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!