Anexar arquivos à mensagem do Mandrill com o botão Navegar
-
21-12-2019 - |
Pergunta
Não tenho certeza se isso é possível, mas estou tentando anexar um arquivo a um e-mail enviado com o API Mandril no botão de upload de arquivo (input type="file"
).Para ser honesto, não tenho certeza do que document.getElementById('idOfFileInput').value
na verdade retorna.Eu sei que este não é o lugar para fazer perguntas como essa a um iniciante, mas procurei em todos os lugares e não consigo encontrar (sei que um de vocês será astuto e me indicará algum artigo em cinco minutos).Além disso, recebi um arquivo .txt para anexar à mensagem C:\fakepath\test.txt
, que sei ser o caminho do arquivo fornecido pelo navegador para segurança.Talvez seja melhor perguntar em código:
Botão:
Attachment(s): <input type="file" id="file">
JS:
"attachments": [
{
"type": "text/*",
"name": "file_attachment",
"content": document.getElementById('file').value
}
],
Sinto muito se esta é uma pergunta simples disfarçada pelo seu contexto, mas mesmo que seja, tenho a sensação de que esta pergunta poderia ser uma boa referência futura porque estou tentando coisas há uma semana e procurando algum tipo de solução, mas não consegui encontrar uma.Alguma ideia?
Solução
Se você quiser anexar um arquivo, você pode dar uma olhada em Upload de arquivo AJAX
A API Mandrill requer uma string codificada em base64 do arquivo, portanto, se você puder fazer upload do arquivo, poderá facilmente fazer com que o servidor retorne uma string codificada em base64 para usar na API.
Existem muitos plug-ins que fazem upload de arquivos por meio de ajax e se você estiver usando uma biblioteca JavaScript como jQuery, você pode dar uma olhada Carregamento de arquivo jQuery
Se você estiver usando PHP por exemplo:
$result = array();
$result['status'] = 'error';
if(isset($_FILES["mandrill_attachment"]))
{
$base64 = base64_encode(file_get_contents($_FILES["mandrill_attachment"]["tmp_name"]));
$result['base64'] = $base64;
$result['status'] = 'ok';
}
die(json_encode($result));
Eu mantive isso curto para o exemplo, mas você deve verificar os tipos de arquivo, etc., não apenas assumindo que é um arquivo OK
e a JS
var mandrill_attachment = false;
$(".attachment").uploadFile({
url: "upload.php",
dragDrop:false,
multiple:false,
autoSubmit:true,
fileName: "mandrill_attachment",
returnType:"json",
onSuccess:function(files,data,xhr)
{
if( data.status == 'ok' )
{
mandrill_attachment = data.base64;
} else {
alert('something went wrong...');
}
}
});
Outras dicas
Analisei isso extensivamente e parece que é impossível usar a entrada de upload de arquivo com a API Mandrill para anexos.Um servidor é necessário para fazer qualquer coisa com um file type="input"
devido às restrições de segurança que foram implementadas pelos navegadores.
Consegui contornar isso usando o API do seletor de arquivos Ink colocar um link de download seguro na parte inferior do e-mail para um arquivo, mas isso parece um pouco suspeito.Obviamente seria melhor fazê-lo nativamente, mas, como eu disse, isso parece impossível.
Este compromisso, no entanto, é, de certa forma, melhorar do que a maneira nativa:a API Ink permite que os usuários façam upload de uma variedade de serviços, junto com o upload de arquivo clássico, o que melhora a extensibilidade e a facilidade de uso do mecanismo de upload de arquivo.
Usar um link para anexos ainda parece suspeito, mas consegui minimizar o spam do método usando o nome do arquivo (ao qual a API dá acesso):
[nome do arquivo] (hiperlink para link de download direto) foi anexado a este Email.