【问题标题】:Delphi Indy IdSMTP1.Send works on Nexus (4.3) but not Galaxy S3 (4.1) device with exception Unknow commandDelphi Indy IdSMTP1.Send 适用于 Nexus (4.3) 但不适用于 Galaxy S3 (4.1) 设备,但有异常 Unknow 命令
【发布时间】:2014-02-21 17:32:11
【问题描述】:

我正在使用下面的 gmail 服务器(Delphi XE5 和 Indy,SMTP)代码从应用程序内部发送电子邮件。如果应用程序在 Nexus 7(或 Windows 中的模拟器)上运行,一切都很好。但在 Galaxy S2 上,它引发了一个异常“无法识别的命令 ix5msxxx.36 -gsmtp”

我做错了什么。我一直在寻找这种不规则行为的答案,但没有运气。

try  //setup mail message
 IdMessage1                             := TIdMessage.Create(NIL);
 IdMessage1.From.Address                := 'XXX@gmail.com';  // change to thier emia
 IdMessage1.Recipients.EMailAddresses   := 'yyy@gmail.com';
 IdMessage1.Subject                     := 'hello';
 IdMessage1.Body.Text                   := 'hello again';
 if FileExists(datafilename) then
    IdAttachmentFile :=  TIdAttachmentFile.Create(IdMessage1.MessageParts, 
                         datafilename);
 except Showmessage('Could not create message, please try later');
 end; // of try to create an email

try
  IdSSLIOHandlerSocketOpenSSL1  :=       TIdSSLIOHandlersocketopenSSL.Create(NIL);
  IdSSLIOHandlerSocketOpenSSL1.Destination            := 'smtp.gmail.com:587';
  IdSSLIOHandlerSocketOpenSSL1.Host                   := 'smtp.gmail.com';
  IdSSLIOHandlerSocketOpenSSL1.Port                   := 587;
  IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Method      := sslvTLSv1;
  IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Mode        := sslmUnassigned;
  IdSSLIOHandlerSocketOpenSSL1.SSLOptions.VerifyMode  := [];
  IdSSLIOHandlerSocketOpenSSL1.SSLOptions.VerifyDepth := 0;                    
except Showmessage('Could createe SSL handle ');
end; // of try ssl

try
//setup SMTP
  IdSMTP1           := TIdSMTP.Create(NIL);
I dSMTP1.Host      := 'smtp.gmail.com';
  IdSMTP1.Port      :=  587; 
  IdSMTP1.IOHandler := IdSSLIOHandlerSocketOpenSSL1;
  IdSMTP1.UseTLS    := utUseExplicitTLS;
  IdSMTP1.Username  := 'xxx@gmail.com';
  IdSMTP1.password  := 'password';
except Showmessage('Could not send secure email connection, please try later');
end; // of try

try
  try
     IdSMTP1.Connect;// (1000) ;
     IdSMTP1.Send(IdMessage1) ;
  except on E:Exception do 
     showmessage('ERROR: ' + E.Message) ;
   end;
finally
  if IdSMTP1.Connected then IdSMTP1.Disconnect;
  IdSMTP1.Free ;
  IdSSLIOHandlerSocketOpenSSL1.Free;
  IdMessage1.Free
end;

【问题讨论】:

    标签: delphi smtp gmail indy


    【解决方案1】:

    我严重怀疑TIdSMTP 正在发送ix5msxxx.36 -gsmtp 命令。它看起来更像是一个可能的数据损坏问题,好像 SSL 层没有发送正确的数据。您可以将TIdLog... 组件(例如TIdLogEvent)附加到TIdSMTP.Intercept 属性,以验证TIdSMTP 实际上正在发送有效的SMTP 命令并接收有效的SMTP 回复。

    除此之外,我认为您的代码没有任何问题可能导致此类问题。不过,IT 可以进行一些清理工作:

    try
      IdMessage1 := nil;
      IdSSLIOHandlerSocketOpenSSL1 := nil;
      IdSMTP1 := nil;
      try
        //setup mail message
        try
          IdMessage1                             := TIdMessage.Create(nil);
          IdMessage1.From.Address                := 'XXX@gmail.com';  // change to their email
          IdMessage1.Recipients.EMailAddresses   := 'yyy@gmail.com';
          IdMessage1.Subject                     := 'hello';
          IdMessage1.Body.Text                   := 'hello again';
          if FileExists(datafilename) then
            IdAttachmentFile := TIdAttachmentFile.Create(IdMessage1.MessageParts, datafilename);
        except
          Exception.RaiseOuterException(Exception.Create('Could not create message, please try again later'));
        end;
    
        //setup TLS
        try
          IdSSLIOHandlerSocketOpenSSL1                        := TIdSSLIOHandlersocketopenSSL.Create(nil);
          IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Method      := sslvTLSv1;
          IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Mode        := sslmUnassigned;
          IdSSLIOHandlerSocketOpenSSL1.SSLOptions.VerifyMode  := [];
          IdSSLIOHandlerSocketOpenSSL1.SSLOptions.VerifyDepth := 0;                    
        except
          Exception.RaiseOuterException(Exception.Create('Could not create SSL handler, please try again later'));
        end; // of try ssl
    
        //setup SMTP
        try
          IdSMTP1           := TIdSMTP.Create(nil);
          IdSMTP1.IOHandler := IdSSLIOHandlerSocketOpenSSL1;
          IdSMTP1.UseTLS    := utUseExplicitTLS;
          IdSMTP1.Host      := 'smtp.gmail.com';
          IdSMTP1.Port      := 587; 
          IdSMTP1.Username  := 'xxx@gmail.com';
          IdSMTP1.password  := 'password';
        except
          Exception.RaiseOuterException(Exception.Create('Could not create SMTP handler, please try again later'));
        end; // of try
    
        try
          IdSMTP1.Connect;
          try
            IdSMTP1.Send(IdMessage1) ;
          finally
            IdSMTP1.Disconnect;
          end;
        except
          Exception.RaiseOuterException(Exception.Create('Could not send secure email, please try again later'));
        end;
      finally
        IdSMTP1.Free;
        IdSSLIOHandlerSocketOpenSSL1.Free;
        IdMessage1.Free;
      end;
    except
      on E: Exception do
      begin
        if E.InnerException <> nil then
          ShowMessage('ERROR: ' + E.Message + #13#13 + E.InnerException.Message)
        else
          ShowMessage('ERROR: ' + E.Message);
      end;
    end;
    

    【讨论】:

    • 感谢回复,我有一个奇怪的更新。在不间断地测试和阅读这个问题 3 天后,没有明显的原因,这一切似乎都与我在我正在测试的所有设备上的原始代码一起工作得很好。会不会是谷歌以某种方式更改了某些设备的某些通信参数,然后又改回来了?我意识到这真的很重要,但是对于正在运行的代码突然出现错误并且只有一个 Android 设备并且它重新开始工作,我没有其他解释!
    • SMTP 协议无法识别访问 SMTP 服务器的客户端类型,因此 Google 无法根据设备类型自定义其通信。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-17
    • 2013-07-02
    • 2011-03-28
    • 2021-05-02
    • 2020-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多