Puedes hacerlo tanto de una manera como otra. Es decir, puedes tener un formulario en HTML y enviar los datos a una página PHP. O tener una única página PHP que muestra el formulario y que luego recibe los datos enviados.
¿Qué se suele hacer? Creo que por practicidad y por ordenar tu código, es mejor tener un único archivo que haga las dos cosas, así te resultará más fácil de mantener.
En este caso simplemente tienes que preguntar en la página si estás o no recibiendo datos de POST.
<html>
<head>Enviar email</head>
<body>
<?php
if(! $_POST) {
// No se están enviado datos por post, entonces muestro el formulario
?>
<form method="post" action="<?= $_SERVER['PHP_SELF'] ?>">
Aquí tus campos de formulario
</form>
<?php
} else {
// Es que están recibiendo datos de formulario
// Entonces compongo el email
// Usarás los datos que te vienen en $_POST para componer el email
}
?>
</body>
</html>
Esto sería un código sencillo de cómo podrías hacerlo. Sin embargo, esta alternativa también tendría una complejidad, que básicamente consiste en que embeber código HTML y código PHP es una práctica no muy buena.
Generalmente lo aconsejado es que el código PHP no se mezcle con el código HTML, para mejorar la mantenibilidad, ya que cada capa de aplicación debería estar separada. La sugerencia aquí sería que usases un sistema de templates en PHP para que el código del formulario y el HTML estuviera separado. Una sugerencia de sistema de templates es Plates.