1

我找到了使用默认电子邮件引擎从 Delphi 应用程序发送电子邮件的代码

Procedure SendEmail(Const eAddress, eObject, eText, eAttach : String);
var
  Intent : JIntent;
  D, S   : JString;
Begin
  Intent := TJIntent.Create;

  Intent.setAction(TJIntent.JavaClass.ACTION_Send);
  Intent.setFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK);
  Intent.putExtra(TJIntent.JavaClass.EXTRA_EMAIL, StringToJString(eAddress));
  Intent.putExtra(TJIntent.JavaClass.EXTRA_SUBJECT, StringToJString(eObject));
  intent.putExtra(TJIntent.JavaClass.EXTRA_TEXT, StringToJString(eText));

  Intent.setType(StringToJString('vnd.android.cursor.dir/email'));

  SharedActivity.startActivity(Intent);
End;

问题出在附件上。在原始示例代码中有这样的构造

Intent.putExtra(TJIntent.JavaClass.EXTRA_STREAM,
                TJnet_Uri.JavaClass.fromFile(FileName));

但 FileName 必须是 JFile。

如何将字符串转换为 JFile?或者我如何发送带有附件的电子邮件,将文件名传递给函数?

4

2 回答 2

3

您可以使用类的parse方法URI。像这样

Uri:=TJnet_Uri.JavaClass.parse(StringToJString(FileName));
Intent.putExtra(TJIntent.JavaClass.EXTRA_STREAM, Uri);

你的代码看起来像这样

var
  Intent : JIntent;
  D, S   : JString;
  Uri    : TJnet_Uri;
Begin
  Intent := TJIntent.Create;

  Intent.setAction(TJIntent.JavaClass.ACTION_Send);
  Intent.setFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK);
  Intent.putExtra(TJIntent.JavaClass.EXTRA_EMAIL, StringToJString(eAddress));
  Intent.putExtra(TJIntent.JavaClass.EXTRA_SUBJECT, StringToJString(eObject));
  intent.putExtra(TJIntent.JavaClass.EXTRA_TEXT, StringToJString(eText));
  Uri:=TJnet_Uri.JavaClass.parse(StringToJString(FileName));
  Intent.putExtra(TJIntent.JavaClass.EXTRA_STREAM, Uri);
  Intent.setType(StringToJString('vnd.android.cursor.dir/email'));
  SharedActivity.startActivity(Intent);
End;
于 2013-10-04T17:19:40.317 回答
0

我使用以下过程发送带有附件和 SSL 加密的电子邮件。有用:

procedure TForm1.ButtoMailClick(Sender: TObject);
var
  IdSSLIOHandlerOpenSSL1 : TIdSSLIOHandlerSocketOpenSSL;
begin
  IdSMTP1.Host:='smtp.gmail.com';
  IdSMTP1.Username:='username@gmail.com';
  //IdSMTP1.Port:=465;
  IdSMTP1.Password:='password';
  IdSMTP1.ReadTimeout := 9900;

  if (IdSMTP1.Port = 465) then
     IdSMTP1.UseTLS := utUseImplicitTLS
  else
     IdSMTP1.UseTLS := utUseExplicitTLS;

  //IdSMTP1.IOHandler := IdSSLIOHandlerOpenSSL1.Create(IdSMTP1);

  if IdSMTP1.Connected = True then
     IdSMTP1.Disconnect;

  IdMessage1.Clear;
  IdMessage1.From.Text :='Testing';
  IdMessage1.BccList.EMailAddresses :='sebastiankozub@gmail.com';
  IdMessage1.Priority := mpHigh;
  IdMessage1.Sender.Text:='Umail';
  IdMessage1.Subject := 'Subject';
  IdMessage1.Body.Add('test');

  if FileExists('Attach.txt') then
     TIdAttachmentFile.Create(IdMessage1.MessageParts, 'Attach.txt');

  try
    IdSMTP1.Connect;
    IdSMTP1.Authenticate;
    IdSMTP1.Send(IdMessage1);
  except
    on E : Exception do
       ShowMessage('little problem');
  end;
end;

如果您在设计时不这样做,注释行也很重要。我填写了端口并在设计器中创建了 SSL 处理程序,因此现在对它们进行了评论。

于 2014-03-13T10:15:22.110 回答