Delphi XE5 и электронная почта

Я нашел этот код для отправки электронной почты из приложения 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? Или как я могу отправить электронное письмо с вложением, передав имя файла функции?


person David Guadagnini    schedule 04.10.2013    source источник


Ответы (2)


Вы можете использовать метод 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;
person RRUZ    schedule 04.10.2013
comment
В XE5 Update 2 я получаю E2250 There is no overloaded version of 'putExtra' that can be called with these arguments. Как передать TJnet_Uri в Intent.putExtra? - person Martijn; 24.01.2014

Я использую следующую процедуру для отправки электронной почты с вложением и шифрованием SSL. Оно работает:

procedure TForm1.ButtoMailClick(Sender: TObject);
var
  IdSSLIOHandlerOpenSSL1 : TIdSSLIOHandlerSocketOpenSSL;
begin
  IdSMTP1.Host:='smtp.gmail.com';
  IdSMTP1.Username:='[email protected]';
  //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 :='[email protected]';
  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 в дизайнере, поэтому теперь они прокомментированы.

person Sebastian Xawery Wiśniowiecki    schedule 13.03.2014