【发布时间】:2018-08-01 19:13:00
【问题描述】:
我正在我的 iOS 和 Android 应用程序中开发电子邮件发送功能。
这是一个使用 OpenSSL 通过 Gmail 发送电子邮件的功能。
我正在使用 Delphi 10.2.3 Tokyo 和 Indy 10。
我向 iTunes Connect 提交了我的 iOS 应用程序,但他们拒绝了我的应用程序,因为此功能在 IPv6 中不起作用。
他们说
在通过连接到 IPv6 网络的 Wi-Fi 运行 iOS 11.4.1 的 iPad 和 iPhone 上进行审查时,我们发现您的应用存在一个或多个错误。
他们还给我发了一张错误提示的屏幕截图
解析地址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;
【问题讨论】:
-
您在问两个完全独立且不相关的问题。 StackOverflow 指南要求每个帖子一个问题。所以,请删除关于打开网址的第二个问题并单独重新发布,它不属于关于通过 IPv6 连接到 SMTP 的第一个问题。
-
在第二个问题中,错误消息告诉您正在访问
nil指针,因此您需要找到它。但是完全没有理由在打开一个 url 之前执行手动 TCP 检查。您正在生成一个外部应用程序来打开 url,因此让该应用程序根据需要处理连接错误。特别是因为如果两个Connect()调用都失败了,您仍然会继续打开 url。因此,只需从您的程序中完全删除TIdTCPClient,它不属于那里。这可能是您的nil指针的来源。 -
@Remy 非常感谢你教我 StackOverFlow 的指导方针。首先,我按照您的指示将第二个问题分开并重新发布。
-
没有理由从这个问题的正文链接到另一个问题,因为它与这个问题无关。我已将其删除。如果有的话,它应该已经发布在评论中。有兴趣的朋友请看stackoverflow.com/questions/51643713。