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):&nbsp;&nbsp;<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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top