Por lo que veo hay dos problemas con tu código.
1. El ID de correo (mail_id) que es asignado como 0.
2. El problema de asignar el item al correo.
Vamos a tratar de resolver estos problemas uno a uno.
**Primero**, el ID del correo (mail_id). En el caso de que estés utilizando MySQL, cuando creas una tabla, hay una opción para que el ID se auto-incremente cada vez que una nueva fila es insertada. Esto es muy útil para prevenir errores de duplicación.
Deberías revisar tu estructura de la tabla "mail" en la base de datos y asegurarte de que la columna "id" está configurada para auto-incrementarse. Debería verse algo como esto:
```
id INT(11) AUTO_INCREMENT PRIMARY KEY,
...
```
Si no lo está, puedes cambiar la estructura de la tabla para incluir la opción AUTO_INCREMENT.
**Segundo**, el problema de asignar el item al correo. Parece que estás intentando insertar un nuevo registro en la tabla `mail_items` después de insertar un nuevo registro en la tabla `mail`. El problema parece ser que estás insertando la plantilla de ítem (`item_template`) en lugar del identificador de ítem (`item_id`).
Para solucionar esto, primero necesitarías obtener el `item_id` del ítem que estás intentando enviar por correo. Una vez que tengas el `item_id`, puedes usarlo para insertar el nuevo registro en la tabla `mail_items`. Tu código quedaría de la siguiente manera:
```
$sql_mail_item = "INSERT INTO $char_db.mail_items (mail_id, item_id, item_count) VALUES (?, ?, 1)";
$stmt_mail_item = $conn->prepare($sql_mail_item);
$stmt_mail_item->bind_param("ii", $mail_id, $item_id);
$stmt_mail_item->execute();
```
Por favor, asegúrate de cambiar la estructura de tu tablas y de utilizar el identificador correcto (`item_id`) cuando estés insertando nuevos registros. Espero que esto te ayude a resolver tus problemas.