我尝试使用Indy组件从Delphi XE5 (android)发送电子邮件:
在表单中,我有一个TIdSMTP
和一个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;
有人用这个吗?!
Form Dont SHOW应用程序暂停... 请在此处查看完整来源http://pastebin.com/iGtJrHHs
答案 0 :(得分: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;
我会把它留给其他人来解决Indy问题。
答案 1 :(得分:1)
user1147833;
连接到服务器后,您应该进行身份验证操作。
刚刚开始使用您的代码;
IdSMTP1.Connect;
IdSMTP1.Authenticate;
Try
IdSMTP1.Send(IdMessage1);
except
End;
答案 2 :(得分: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.
答案 3 :(得分:1)
Indy与Android兼容。这不是Android问题,而是配置问题。
Gmail的端口465使用隐式SSL加密连接。连接到端口465后,服务器希望您的应用程序启动SSL握手以建立SSL会话,然后才能交换任何SMTP数据。
在连接之前,您必须将TIdSSLIOHandlerOpenSSL
组件附加到TIdSMTP.IOHandler
属性,然后将TIdSMTP.UseTLS
属性设置为utUseImplicitTLS
。
没有它,TIdSMTP
将不会发送SSL握手。它只是等待服务器的SMTP问候语,服务器在首先建立SSL会话之前不会发送。因此会发生死锁,除非您将TIdSMTP.ReadTimeout
属性设置为非无限值,因此TIdSMTP.Connect()
可以在未收到SMTP问候语时引发异常。
答案 4 :(得分:0)
在部署到Android设备之前,请在Win32平台上运行以检查是否正常。 请记住将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;