In this post, we will configure the Oracle Cloud to support our instances, databases and Oracle APEX to send out emails. In my blog post 5. Setup APEX in ATP and create first APEX app, I initially said you can't use APEX_MAIL in APEX in ATP, but I was wrong, so I few days after my post I updated it, to point you to the documentation with the configuration steps you have to do to make it work.
The reason I thought you can't use APEX_MAIL was that during my tests, sending emails failed. I hadn't read the documentation ;) In this post, I will share how I got it to work after all.
The first thing you have to do is create an SMTP Credential for your user. You do that by logging into your Oracle Cloud account, go to Identity > Users and select your user:
Click the SMTP Credentials in the left menu:
Hit the Generate SMTP Credentials button, and give it a name:
On the next screen, you will see the USERNAME and PASSWORD. Take a note of this as you won't get to see it anymore after:
BEGIN
APEX_INSTANCE_ADMIN.SET_PARAMETER('SMTP_HOST_ADDRESS', 'smtp.us-ashburn-1.oraclecloud.com');
APEX_INSTANCE_ADMIN.SET_PARAMETER('SMTP_USERNAME', 'ocid1.user.oc1..xxxxxxxxxxx@ocid1.tenancy.oc1..xxxxxxx');
APEX_INSTANCE_ADMIN.SET_PARAMETER('SMTP_PASSWORD', 'Fxxxx');
COMMIT;
END;
/
Here is a screenshot when running:
Log in to Oracle APEX, go to SQL Workshop and try to send out emails:
It says statement processed, but when you query the APEX_MAIL_QUEUE, you will see it's still stuck with an error ORA-29278: SMTP transient error: 471 Authorization failed:
There's one more step you have to do, specify the email addresses you want to allow to send emails from. Go in your Oracle Cloud Account Dashboard to Email Delivery and click the Email Approved Senders and hit the Create Approved Sender button
Add the email address you want to send emails from and hit the Create Approved Sender button:
In the overview you will see all allowed email addresses:
When we try to send again and check the APEX_MAIL_LOG, we see the emails are effectively sent:
That's it, you can now send emails out of your APEX apps :)
We are almost done with the series. In the next post we will create a second compute instance and set up a Load Balancer.
Thank you for the blogpost!
ReplyDeleteIt seems that unfortunately on eu-frankfurt E-Mails are not (yet) available...
Regards
Niko
Thank you for the blog post!
ReplyDeleteIt seems that on region eu-frankfurt-1 E-Mails are not (yet) available...
Regards
Niko
Hi Nico,
ReplyDeleteYou have to also subscribe one of the regions that are currently valid;
(sadly not all are valid/possible today)
And be sure to also use this region for this:
APEX_INSTANCE_ADMIN.SET_PARAMETER('SMTP_HOST_ADDRESS', 'smtp.us-phoenix-1.oraclecloud.com');
For me this one works and I can send mail now:
One more thig to consider.
If you don’t take care another step, then the mails remain in the INTERNAL mail Queue as long
If you don’t take care another step, then the mails remain in the INTERNAL mail Queue.
1. you create a scheduled job to "really" send out by running APEX_MAIL.PUSH_QUEUE.
2. you call APEX_MAIL.PUSH_QUEUE; after your call(s) of apex_mail.send;
Regards
Andre
Hi Nico, hi Andre,
ReplyDeletemy Home Region is Frankfurt too. In the beginning of my project I added Australia East (Sydney) to my regions.
In the top menu I can see my Home Region "Frankfurt" and the next entry is "Australia East (Sydney)". When I click on Australia nothing changed/happend.
I also pushed the right command "APEX_INSTANCE_ADMIN.SET_PARAMETER('SMTP_HOST_ADDRESS', 'smtp.ap-sydney-1.oraclecloud.com');"
But when I click on Email Delivery it is showing that no email function is available in Frankfurt. How could I tell the system that my second region should be used?
I also tried to login via "https://login.ap-sydney-1.oraclecloud.com" but after entering my cloud tenant name it changed to Frankfurt URL.
Best,
Carsten
Oracle said the free cloud can send 1000 emails per month but the Email Delivery
ReplyDeleteservice is showing that the account have to upgrade to a paid account before you can send mail.
This article helped me to send mail from Oracle Cloud - Oracle Apex Application.
ReplyDeleteThat's Great. Only thing to remember in smtp host ; region host name should be give carefully as mentioned in the article.
one thing I want to know mails are going in Spam.
second thing can i give my own (domain)credentials) to send emails.
Thank you.
ReplyDeleteDid you get any issue verifying your email? Mine's stuck on 'Verification Pending'.
I am in a simmular situation as Niko.
ReplyDeleteMy Apex app runs in my Home Region "Frankfurt", in wich email delivery Service is not available.
So I also subscribed to uk-london-1. In the London Region I created an Email approved Sender and i set the SMTP_HOST_ADDRESS to smtp.email.uk-london-1.oci.oraclecloud.com.
But if I now try to send a Mail i dont get any immediate responce. But after a few seconds to minutes I get "ORA-29278: SMTP transient error: 421 Service not available".
My approved Senders Mail domain is registerd under World4you(where I added the spf record) and uses Microsoft office 365 as Mail service.
I hope someone can tell me what I did wrong.
Best
Michael
Hi
ReplyDeleteThanks for the post .
Does this solution work with free trail ATP account?
Thanks
Nahid
Yes, you get 1000 emails for free.
ReplyDeleteHi Dimitri,
ReplyDeleteThanks a lot for your great blog's about the Free Tier!
I almost finished them all.
At the moment I got stuck in the email-part.
"Email Delivery is not available with your current permissions.
Please Contact Support for further assistance."
Any idea on this one?
Kind regards, Joost
And in the meantime:
ReplyDeleteFrom Oracle Support
CAUSE
Cause for this error is because an IDCS user is being used to access this service. A native user needed to access Email Delivery service.
SOLUTION
Follow step creates native user:
From OCI Menu Choose Identity > Users > Create User
Select the Created User and press Create/Reset Password
Copy the password
Copy the URL of the page (https://console.XX-XXXX.oraclecloud.com)
Start a new browser tab with copied URL and sign with the created user and password.
Select Email Deliver service.
Once the user is created, to setup Email Delivery, complete the following steps:
See: https://docs.cloud.oracle.com/iaas/Content/Email/Concepts/overview.htm
Generate SMTP credentials for a user.
Create an approved sender.
Configure SPF.
Configure the SMTP connection.
I also have Apex running in Germany Central (Frankfurt) and had problems trying to get emails sent through using Email Delivery in UK South (London) through smtp.email.uk-london-1.oci.oraclecloud.com. It would always fail with "ORA-29278: SMTP transient error: 421 Service not available".
ReplyDeleteHowever, after setting up Email Delivery in US East (Ashburn) and configuring Apex to send emails through smtp.us-ashburn-1.oraclecloud.com everything seems to work just fine.
So the problem seemed to be particular to trying to use Email Delivery in London from Apex in Frankfurt.
Hi Dimitri,
ReplyDeleteI have just set up everything with all the settings as noted above. Unfortunately, still getting a ORA-29278: SMTP transient error: 421 Service not available.
Also to add : I have integrated "Postfix with Email Delivery Configure Postfix to Send Email Through Email Delivery" from this link https://docs.cloud.oracle.com/iaas/Content/Email/Reference/postfix.htm
Email sending works from the Linux command line, just not from APEX.
Ran the following, noting that the SMTP host address is noted in the Oracle Email Delivery settings as smtp.email.uk-london-1.oci.oraclecloud.com
BEGIN
APEX_INSTANCE_ADMIN.SET_PARAMETER('SMTP_HOST_ADDRESS' , 'smtp.email.uk-london-1.oci.oraclecloud.com');
APEX_INSTANCE_ADMIN.SET_PARAMETER('SMTP_USERNAME' , 'ocid1.user.oc1..aaaaaaaaxxxxxxxxxxxxxxxxx@ocid1.tenancy.oc1..aaaaaaaaxxxxxxxxxxx.xh.com');
APEX_INSTANCE_ADMIN.SET_PARAMETER('SMTP_PASSWORD' , 'xxxxxxxxx');
COMMIT;
END;
/
Any ideas on what might be going wrong ? Thanks for your time putting together a great post!
Hi
ReplyDeleteI too am having issues with getting emails to send. (I actually upgraded to the paid service, hoping I won't get billed if less than 1000 / month).
I configured as in the post, set up STMP Credentials, email apprpved sender and configured instance as below:
BEGIN
APEX_INSTANCE_ADMIN.SET_PARAMETER('SMTP_HOST_ADDRESS', 'smtp.email.uk-london-1.oci.oraclecloud.com');
APEX_INSTANCE_ADMIN.SET_PARAMETER('SMTP_USERNAME', 'ocid1.user.oc1..aaaaxxxxxxxxxxxxxxxxocid1.tenancy.oc1..axxxxxxxxxxxxxdq.gz.com');
APEX_INSTANCE_ADMIN.SET_PARAMETER('SMTP_PASSWORD', 'xxxxxxxxxxxxxx');
COMMIT;
END;
/
However am still getting error "ORA-29278: SMTP transient error: 421 Service not available" when querying the apex_mail_queue.
Any thoughts on where I'm going wrong here very much appreciated!
Thanks
Dave
Hi
ReplyDeleteI too am having issues with getting emails to send. (I actually upgraded to the paid service, hoping I won't get billed if less than 1000 / month).
I configured as in the post, set up STMP Credentials, email approved sender and configured instance as below:
BEGIN
APEX_INSTANCE_ADMIN.SET_PARAMETER('SMTP_HOST_ADDRESS', 'smtp.email.uk-london-1.oci.oraclecloud.com');
APEX_INSTANCE_ADMIN.SET_PARAMETER('SMTP_USERNAME', 'ocid1.user.oc1..aaaaxxxxxxxxxxxxxxxxocid1.tenancy.oc1..axxxxxxxxxxxxxdq.gz.com');
APEX_INSTANCE_ADMIN.SET_PARAMETER('SMTP_PASSWORD', 'xxxxxxxxxxxxxx');
COMMIT;
END;
/
However am still getting error "ORA-29278: SMTP transient error: 421 Service not available" when querying the apex_mail_queue.
Any thoughts on where I'm going wrong here very much appreciated!
Thanks
Dave
Follow steps as suggested but not able to send mail.
ReplyDeletesee all mails struck in "select mail_SUBJ, mail_from, mail_message_created, mail_send_error from apex_mail_queue" with no error in mail_send_error.
No data found in Select * from APEX_MAIL_LOG.
APEX_INSTANCE_ADMIN.SET_PARAMETER('SMTP_HOST_ADDRESS', 'smtp.email.eu-frankfurt-1.oci.oraclecloud.com');
While user is in Mumbai region.
Please help.
Dear Dimitri,
ReplyDeleteI have followed all steps and I am using the autonomous TP database on the cloud.
I have executed the code to add ACL in both APEX_190100 and the workspace schema:
BEGIN
DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
host => '*',
ace => xs$ace_type(privilege_list => xs$name_list('connect’, 'resolve','smtp'),
principal_name => 'APEX_190100',
principal_type => xs_acl.ptype_db));
END;
and in the apex_mal_queue I am getting the error:
ORA-24247: network access denied by access control list (ACL)
Any ideas?
my email delivery is from:
smtp.email.eu-frankfurt-1.oci.oraclecloud.com
at always free tier it happening
ReplyDeleteThe limit for this compartment has been exceeded.
when i create approved sender
What is the process to add smtp.gmail.com to always free tier ?
ReplyDeleteDear Dimitri,
ReplyDeleteunder Manage Instance there is no
1.Instance Settings (which is need for private smtp setting )
2.Security (to control file upload etc)
3.Workspace Purge Settings (language task)
its seems oracle gives nothing about apex at always free tier.
its not helping developers to bring some client to oracle cloud ,
its not helping developers to start a startup.
please take a step , otherwise its good for nothing ...
Hi Dimitri!
ReplyDeletePlease note that Oracle Email Delivery Service is not available in Free Tier. This is the response I got in a Service Request:
Reviewing your account with our internal teams, we were able to confirm that the error you received is due to your account now being listed as 'free tier'. Email Delivery is not included in the 'free tier' of service. With that said, we can certainly increase your Email Delivery limits in order to allow you to continue sending emails, however this would cause you to be billed for the services.
The SMTP error message was: ORA-29278: SMTP transient error: 455 Maximum messages sent per minute reached : limit is 0
Regards,
Hello Dimitri!
ReplyDeleteI have a problem... https://community.oracle.com/message/15572475#15572475
Can you help?
Thanks!!!
Thanks for yet another wonderful post Dimitri.
ReplyDeleteFor all those getting a "ORA-29278: SMTP transient error: 421 Service not available" error.
Please check your SMTP_HOST_ADDRESS very carefully referencing the documentation found below as the format changes by region.
https://docs.cloud.oracle.com/iaas/Content/Email/Concepts/overview.htm
Regions and Availability Domains list where email is available.
SMTP Authentication and Connection Endpoints provides the required values.
For example, to get email working on my London region environment I had to change
'smtp.us-ashburn-1.oraclecloud.com'
not to 'smtp.uk-london-1.oraclecloud.com' as you would expect
but to 'smtp.email.uk-london-1.oci.oraclecloud.com'.
Hope this helps.
You say this works on always free, but reading always free cannot allow email delivery.
ReplyDeletethere is another way to send email, without using oracle email delivery?
Email delivery cannot be used because, email sender approve cannot be created.
thanks,
In the first month you can setup the approved list.
ReplyDeleteAfter that if you provide a credit card, it will be enabled and you can set it up too.
You won't be charged for the first 1000 emails (or read the documentation about the exact number that you get at the time you read this).
Hope that helps,
Dimitri
In my experience always free account does not allow you to send emails after trial expires. As already mentioned above "ORA-29278: SMTP transient error: 455 Maximum messages sent per minute reached : limit is 0"
ReplyDeleteregards
Martin
hey! not working ):
ReplyDeletewhen i try to run the first code its ask for "substitution variables"
Hi Unknown,
ReplyDeleteProbably there is an '&' in your SMTP username or SMTP password
Put this before the 'BEGIN':
SET DEFINE OFF;
Regards,
Jeroen
Hi dimitri
ReplyDeletethanks for your blog is very helpful, i have one question, this steps and configure of smtp server works for apex implemented over OCI dbsystem ?? is the same cofiguration for the user ??
thank in advance for any help
Fredy V
Hi Dimitri,
ReplyDeleteThis worked perfectly!
Thanks,
Marcelo
https://jeffkemponoracle.com/2016/04/email-made-easier/
ReplyDeleteHi Dimitri and the team,
ReplyDeleteI found this post very useful, but I guess a few things changed since 2019.
So, as of today, in addition to everything above ( Jan 2023):
1. You should create a Group ("Email_group" for example), include your user in the group and create a Policy to allow this group to send Emails, for example:
Allow group Email_group to manage email-family in tenancy
2. Your STMP host and port are visible in Email Delivery/Configuration
3. I found it super useful to test with CURL before configuring APEX. Gives you better understanding of the issues if you run into them.
For example, in bash you can test like this:
smtp_user="ocid1.user.oc1..******@ocid1.tenancy.oc1..********.ql.com"
smtp_password="******"
smtp_host=smtp.email.us-ashburn-1.oci.oraclecloud.com
smtp_port=587
sender="***********"
rcpt="*********"
mail_file=mail.txt
cd /tmp
cat <$mail_file
From: "User Name" <${sender}>
To: "Tester" <${rcpt}>
Subject: This is a test
Hi Tester,
I'm sending this mail with curl thru my OCI account
Bye!
EOF
curl -v "smtp://${smtp_host}:${smtp_port}" --ssl-reqd -u "${smtp_user}:${smtp_password}" --mail-from "${sender}" --mail-rcpt "${rcpt}" --upload-file $mail_file
Hi, this is very weird. Using curl does work, but with apex don't
ReplyDelete