Jump to content

Recommended Posts

Is it possible to use smtp on android to send multiple emails with attachments and are there any examples of this available.  I don't want the email client popping up for each email .... just all done in the background.

 

Thanks in advance.

 

Bill Zwirs

Share this post


Link to post
6 hours ago, bzwirs said:

Is it possible to use smtp on android

Sure. It's just a TCP connection to a server, like any other. Why would you think it's not possible? 

6 hours ago, bzwirs said:

are there any examples of this available.  I don't want the email client popping up for each email .... just all done in the background.

Indy 10 ships pre-installed with the IDE, and works on Android (mostly). It has TIdSMTP and TIdMessage components for sending emails. For TLS up to 1.2, there is TIdSSLIOHandlerSocketOpenSSL, and OpenSSL 1.0.2s libs for Android at https://github.com/IndySockets/OpenSSL-Binaries

 

Or, you could simply use Android's built-in SSL/Socket class and implement the SMTP protocol yourself.

Share this post


Link to post
On 6/15/2024 at 1:05 AM, Remy Lebeau said:

Why would you think it's not possible? 

Several years ago I googled on the same issue and all I could find at the time was advise that it could not be done and needed to use Android Intents which called the mail client.  This solution was Ok at the time as it would only be occasionally used in the app.  But now I need to be able to send multiple emails so don't want the mail client popping up for each so asked the question in case things had changed.

 

By the way, I am using Delphi 12 with latest updates.

 

Since your reply I have been trying to use the Indy approach and found a post on Stackoverflow and followed the following advice:

  1. Add the 2 .so files to your project deployment and set them to deploy to the .\assets\internal\ folder

  2. add the System.StartupCopy unit as the first unit in your DPR's uses clause.

  3. call IdOpenSSLSetLibPath(TPath.GetDocumentsPath) at app startup.

I am using the 64bit files included in openssl-1.0.2s_Android and keep getting the 'could not load SSL library' error.  I have used FileExists to check if file (just for one of the files) is there.  Here is the code I use in the OnFormCreate event.  Compiled for Android64.

 

Quote

var aFile := TPath.Combine(TPath.GetDocumentsPath,'libssl.so');
IdOpenSSLSetLibPath(TPath.GetDocumentsPath);
if FileExists(aFile) then
  IdSSLOpenSSLHeaders.Load();

Is there anything else I can try to make this work.

 

Bill Zwirs

 

 

Share this post


Link to post
Posted (edited)
16 minutes ago, bzwirs said:

I am using the 64bit files included in openssl-1.0.2s_Android and keep getting the 'could not load SSL library' error.

What do Indy's IdSSLOpenSSLHeaders.WhichFailedToLoad() and IdSSLOpenSSL.OpenSSLVersion() functions report after the load fails?

Edited by Remy Lebeau

Share this post


Link to post
22 hours ago, bzwirs said:

Is there anything else I can try to make this work.

I'm using to deploy the .so files in "library\lib\arm64-v8a\" and I don't have to do nothing at startup, no loads or other ...

 

Try to put only:

 

ShowMessage(OpenSSLVersion());

in a Form Create event and see if the version will show.

Share this post


Link to post
22 minutes ago, DelphiUdIT said:

Try to put only:


ShowMessage(OpenSSLVersion());

in a Form Create event and see if the version will show.

It is not just a matter of IF it shows, but also WHICH VERSION it shows. Anything above 1.0.2 is not going to work with the default TIdSSLIOHandlerSocketOpenSSL at this time.

Share this post


Link to post
7 minutes ago, Remy Lebeau said:

It is not just a matter of IF it shows, but also WHICH VERSION it shows. Anything above 1.0.2 is not going to work with the default TIdSSLIOHandlerSocketOpenSSL at this time.

He said to use 1.0.2s version. This means that the library should be that version. I only suggest to load on the default library path and see what happens.

In the past time I have some issues with some versions of Android with .so libs loaded around the systems (in Shared Doc, External Doc, etc...). So I always loaded them in the default library paths.

Share this post


Link to post

Remy and DelphiUdIT

 

Have changed loading .so files to "library\lib\arm64-v8a\" and all appears to be working now. 

 

OpenSSLVersion now reports as "OpenSSL 1.0.2s-fips 28 May 2019".  Previously I was just getting an empty string so maybe assume I was doing something wrong.

 

Thanks for all your help.

 

Bill Zwirs

Share this post


Link to post

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×