Plenty of solutions here:

html - How to show email addresses on the website to avoid spams? - Stack Overflow
stackoverflow

php - Safe way to display email address and contact number - Stack Overflow
stackoverflow

Protecting your e-mail address: how to do it - IONOS
Protecting your email address: how to prevent spam
Solution I use
in <head>
:
<style type="text/css">
.e-mail:before {
content: attr(data-website) "\0040" attr(data-user);
unicode-bidi: bidi-override;
direction: rtl;
}
</style>
in <body>
:
<p>Email me at <span class="e-mail" data-user="cin" data-website="ue.selasbotb"></span></p>
Note that the script reverses the string so user and domain name need to be filled out in reverse.