我正在开发一款iOS和Android应用程序中的电子邮件发送功能。这是一个使用OpenSSL通过Gmail发送电子邮件的功能。我使用Delphi 10.2.3 Tokyo和 Indy 10。但是,我提交我的iOS应用程序到iTunes Connect后,他们拒绝了我的应用程序,因为此功能在IPv6下不起作用。他们说:“我们在iPad和iPhone上回顾运行iOS 11.4.1,并连接到IPv6网络的Wi-Fi时,在您的应用程序中发现一个或多个错误。” 他们还向我发送了一个显示错误的屏幕截图,显示“解析地址smtp.gmail.com时发生错误:(8)”。我该如何修复这个错误以正确使用IPv6?以下是我的代码:
Procedure MailSend;
Var
Connected: Boolean;
Begin
IdSMTP := TIdSMTP.Create(nil);
try
IdSMTP.Host := 'smtp.gmail.com';
IdSMTP.Port := 587;
IdSMTP.Username := 'xxxx@gmail.com'; // UserName
IdSMTP.Password := 'xxxx'; // Password
SSL := TIdSSLIOHandlerSocketOpenSSL.Create;
try
SSL.Host := IdSMTP.Host;
SSL.Port := IdSMTP.Port;
SSL.Destination := SSL.Host + ':' + IntToStr(SSL.Port);
IdSMTP.IOHandler := SSL;
IdSMTP.UseTLS := utUseExplicitTLS;
IdSMTP.Socket.IPVersion := Id_IPv6;
try
IdSMTP.Connect;
Connected := True;
except
Connected := False;
end;
If Connected = False then
Begin
IdSMTP.Socket.IPVersion := Id_IPv4;
IdSMTP.Connect;
End;
Msg := TIdMessage.Create(IdSMTP);
try
Msg.OnInitializeISO := IdMessage_InitializeISO;
Msg.ContentType := 'text/plain';
Msg.CharSet := 'UTF-8';
Msg.ContentTransferEncoding := 'BASE64'; // BASE64 (7bit)
//Msg.ContentTransferEncoding := '8bit'; // RAW(8bit)
Msg.From.Name := SsNoSt;
Msg.From.Address := 'xxxx@gmail.com';
Msg.Recipients.EMailAddresses := 'xxxx@gmail.com';
Msg.Subject := SsNoSt;
Msg.Body.Text := 'Unicode String (body)';
IdSMTP.Send(Msg);
finally
Msg.Free;
end;
IdSMTP.Disconnect;
finally
SSL.Free;
end;
finally
IdSMTP.Free;
End;
End;
nil
指针,所以你需要找到它。但是,在打开URL之前没有任何理由执行手动TCP检查。你正在生成一个外部应用程序来打开URL,因此让该应用程序根据需要处理连接错误。特别是当两个Connect()
调用都失败时,您仍然会继续打开URL。因此,完全摆脱您的过程中的TIdTCPClient
,它不属于那里。这可能是您的nil
指针来自的地方。 - Remy Lebeau