3

我正在尝试使用 Indy 组件从 Delphi XE5 (android) 发送电子邮件:

在表格中,我有 aTIdSMTP和 a TIDMessage

创建表单时:

testform:=Ttestform.create(self);
testform.show;

应用程序停止了,我不知道出了什么问题……我想 Indy 组件在 Android 中不兼容……

  IdSMTP1.Heloname:='test';
  IdSMTP1.Host:='smtp.gmail.com';
  IdSMTP1.Username:='umail@gmail.com';
  IdSMTP1.Port:=465;
  IdSMTP1.Password:='pass';

  if IdSMTP1.Connected=True then IdSMTP1.Disconnect;

  IdMessage1.clear;
  IdMessage1.From.Text :='Testing';
  IdMessage1.BccList.EMailAddresses :='umail@gmail.com';
  IdMessage1.Priority := mpHigh;
  IdMessage1.Sender.Text:='Umail';
  IdMessage1.Subject := 'Subject';
  IdMessage1.Body.Add('test');
  IdSMTP1.Connect;
  Try
    IdSMTP1.Send(IdMessage1);
  except
  End;

有人用这个吗?!

表格 Dont SHOW 应用程序已停止...请在此处查看完整来源http://pastebin.com/iGtJrHHs

4

5 回答 5

4

这不是 Indy 问题的直接答案,但如果您考虑切换策略并使用 Android 上的内置电子邮件创建选项,您可以使用如下代码:

uses
  FMX.Helpers.Android,
  Androidapi.JNIBridge,
  Androidapi.JNI.JavaTypes,
  Androidapi.JNI.GraphicsContentViewText;
...
procedure CreateEmail(const Recipient, Subject, Content: string);
var
  Intent: JIntent;
  Recipients: TJavaObjectArray<JString>;
begin
  Intent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_SEND);
  Recipients := TJavaObjectArray<JString>.Create(1);
  Recipients.Items[0] := StringToJString(Recipient);
  Intent.putExtra(TJIntent.JavaClass.EXTRA_EMAIL, Recipients);
  Intent.putExtra(TJIntent.JavaClass.EXTRA_SUBJECT, StringToJString(Subject));
  Intent.putExtra(TJIntent.JavaClass.EXTRA_TEXT, StringToJString(Content));
  Intent.setType(StringToJString('plain/text'));
  SharedActivity.startActivity(TJIntent.JavaClass.createChooser(Intent,
    StrToJCharSequence('Which email app?')));
end;

我会把它留给其他人来提供解决印地问题的方法。

于 2013-10-02T12:38:03.323 回答
1

用户1147833;

您应该在连接到服务器后进行身份验证操作。

只需切换到您的代码;

IdSMTP1.Connect;
IdSMTP1.Authenticate;
  Try
    IdSMTP1.Send(IdMessage1);
  except
  End;
于 2013-10-02T13:16:49.167 回答
1

清理了许多项目,如果您的表单实际上没有显示,这些都无济于事。
下面使用需要身份验证并在端口 25 上运行的 SMTP 服务器从第一代 Nexus 7 成功发送了一条消息。

如果您真的要连接到 Google 服务器上的端口 465,则必须使用此代码未解决的加密。

IdMessage1.From.Text := 'blah blah'; 的简单赋值 没有工作,所以你会看到我用 IdMessage1.From.Address 替换了其他 IdMessage1 属性的类似属性。

unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
  IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
  IdExplicitTLSClientServerBase, IdMessageClient, IdSMTPBase, IdSMTP, IdMessage,
  FMX.StdCtrls, FMX.Edit;

type
  Ttestform = class(TForm)
    IdSMTP1: TIdSMTP;
    IdMessage1: TIdMessage;
    btnMessageSend: TButton;
    edtUsername: TEdit;
    edtPassword: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    edtFrom: TEdit;
    Label3: TLabel;
    edtTo: TEdit;
    Label4: TLabel;
    edtServer: TEdit;
    Label5: TLabel;
    edtPort: TEdit;
    Label6: TLabel;
    procedure btnMessageSendClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  testform: Ttestform;

implementation

{$R *.fmx}

procedure Ttestform.btnMessageSendClick(Sender: TObject);
var
  intPort: Integer;
begin
  ShowMessage('In button click');
  IdSMTP1.Heloname:='test';
  IdSMTP1.Host:=edtServer.Text;
  IdSMTP1.Username:=edtUsername.Text;
  intPort := 25;
  ShowMessage('Before strtoint');
  TryStrToInt(edtPort.Text, intPort);
  ShowMessage('After strtoint');
  IdSMTP1.Port:= intPort;
  IdSMTP1.Password:=edtPassword.Text;

  if IdSMTP1.Connected=True then IdSMTP1.Disconnect;
  IdMessage1.Clear;
  IdMessage1.From.Address := edtFrom.Text;
  IdMessage1.Recipients.Add;
  IdMessage1.Recipients.Items[0].Address := edtTo.Text;
  IdMessage1.Priority := mpHigh;
  IdMessage1.Sender.Address:=edtFrom.Text;
  IdMessage1.Subject := 'Subject';
  IdMessage1.Body.Add('test');
  IdSMTP1.Connect;
  IdSMTP1.Send(IdMessage1);
end;

end.
于 2013-10-02T15:59:21.863 回答
1

Indy 与 Android 兼容。这不是安卓问题,是配置问题。

Gmail 的 465 端口使用隐式 SSL 来加密连接。连接到端口 465 后,服务器希望您的应用程序启动 SSL 握手以建立 SSL 会话,然后才能交换任何 SMTP 数据。

在连接之前,您必须将TIdSSLIOHandlerOpenSSL组件附加到TIdSMTP.IOHandler属性,然后将TIdSMTP.UseTLS属性设置为utUseImplicitTLS。没有那个,TIdSMTP将不会发送 SSL 握手。它将简单地等待服务器的 SMTP 问候,服务器在 SSL 会话首先建立之前不会发送该问候。因此会发生死锁,除非您将该TIdSMTP.ReadTimeout属性设置为非无限值,以便TIdSMTP.Connect()在它没有收到 SMTP 问候语时引发异常。

于 2013-10-02T16:20:15.177 回答
0

在部署到安卓设备之前,在Win32平台上运行,检查是否OK。记得把 OpenSSL DLL(libeay32.dll 和 ssleay32.dll)放在同一个目录下,但是 Android 不行。这是我的代码。

procedure TForm1.Button1Click(Sender: TObject);
begin
with IdMessage1 do
begin
  Recipients.EMailAddresses := 'test@gmail.com';
  From.Address              := 'test@gmail.com';
  From.Name                 := 'Self';
  CCList.EMailAddresses     := '';
  BccList.EMailAddresses    := '';
  Priority                  := mpNormal;
  Subject                   := 'Test Mail Subject';
  Body.Add('Test Mail Body');
end;

with IdSMTP1 do
begin
  Host      := 'smtp.gmail.com';
  Username  := 'xxxxxxx';
  Password  := 'yyyyyyy';
  IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(Self);
  Port      := 465;
  UseTLS    := utUseImplicitTLS;

  try
  Connect;
  except
  end;

  if not Connected then
  begin
    Showmessage('Error');
    Exit;
  end;

  try
  Send(IdMessage1);
  finally
  Disconnect;
  end;

 end;
end;
于 2014-06-16T20:18:29.873 回答