# Enviar um e-mail a partir de uma vista

> Configure o SMTP no ficheiro config, renderize uma vista como corpo da mensagem com MAIL() e envie HTML já pronto com HTMLMAIL().

Framework: total5
Product: Total.js 5 (total5@0.0.19)
Language: pt
Content-SHA256: d640168087d5bf6445f28fba263375e1e434272c4aff589f8789e26797aabcea
Snapshot: c0700e321579725c5cf4f5ace1ad7d2866d1b4f93c24a63c0b41b6b7998e976c
Sources: total5-installed@total5@0.0.19
Review: not-recorded

O Total.js envia correio por SMTP. O servidor e o remetente vão no ficheiro `config`: `mail_smtp` é o servidor, `mail_smtp_options` um objeto com o resto das definições de ligação (`port`, `user`, `password`, `secure`...) e `mail_from` / `mail_from_name` o remetente. `mail_reply`, `mail_cc` e `mail_bcc` acrescentam esses mesmos cabeçalhos a todas as mensagens.

`MAIL(email, subject, view, model, [language], [callback])` renderiza `views/<view>.html` com o modelo (as mesmas vistas das páginas, incluindo a localização com `@(...)`) e envia o resultado como corpo HTML. `email` pode ser um endereço ou vários separados por vírgulas. `HTMLMAIL(email, subject, html, [language], [callback])` envia uma string que construiu você. Ambas devolvem a mensagem; `callback(err)` corre quando o servidor a aceitou ou rejeitou, e `err` é `null` se correu bem.

As mensagens são postas em fila e enviadas logo depois do tick atual, por isso `MAIL()` nunca bloqueia o pedido. Espere pelo callback apenas quando o utilizador precisa de saber se funcionou.

```text config
name : Mail example
mail_smtp : 127.0.0.1
mail_smtp_options : { port: 2526 }
mail_from : hello@example.com
mail_from_name : Example
```

A vista é renderizada **com o layout**, como qualquer página, por isso `views/layout.html` tem de existir (caso contrário o pedido falha com um erro `ENOENT`). Um layout de e-mail pode ser tão pequeno como o de baixo, ou pode usar o layout das suas páginas.

```html views/layout.html
<!DOCTYPE html>
<html>
<head><meta charset="utf-8" /></head>
<body style="font-family:Arial">@{body}</body>
</html>
```

```html views/welcome.html
<h1>Welcome, @{model.name}!</h1>
<p>Your account is ready.</p>
```

```js controllers/mail.js
exports.install = function() {
	ROUTE('POST /welcome/ @json', welcome);
	ROUTE('POST /note/ @json', note);
};

function welcome($) {
	MAIL($.body.email, 'Welcome aboard', 'welcome', { name: $.body.name }, function(err) {
		$.json({ sent: !err, error: err ? err.toString() : null });
	});
}

function note($) {
	HTMLMAIL($.body.email, 'A short note', '<p>Plain <b>HTML</b> message</p>', function(err) {
		$.json({ sent: !err, error: err ? err.toString() : null });
	});
}
```
