使用浏览按钮将文件附加到Mandrill消息

4
我不确定这是否可行,但我正在尝试使用Mandrill API从文件上传按钮(input type="file")向外发邮件时附加文件。老实说,我不确定document.getElementById('idOfFileInput').value实际返回什么。我知道这不是提出初学者问题的地方,但我已经到处查找了,找不到(我知道你们中有人会很聪明,在五分钟内指引我去一些文章)。除此之外,我已经成功地将一个 .txt 文件与消息附件相连:C:\fakepath\test.txt,我知道这是浏览器为安全起见给出的文件路径。也许更好的问法是以代码形式呈现:

按钮:

Attachment(s):&nbsp;&nbsp;<input type="file" id="file">

JS:

"attachments": [
        {
            "type": "text/*",
            "name": "file_attachment",
            "content": document.getElementById('file').value
        }
    ],

如果这是一个简单的问题,请原谅我在语境中掩盖了它,但即使是这样,我认为这个问题可能是一个好的未来参考,因为我已经尝试了很多方法,寻找某种解决方案,但是我一直没有找到。有什么想法吗?

2个回答

4
如果您想上传文件,可以考虑使用 AJAX 文件上传。
Mandrill API 需要一个文件的 base64 编码字符串,因此如果您可以上传文件,您可以轻松地让服务器返回一个供您在 API 中使用的 base64 编码字符串。
有很多插件可以通过 ajax 上传文件,如果您使用像 jQuery 这样的 JavaScript 库,可以查看 jQuery 文件上传
例如,如果您使用 PHP
$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));

我已经为示例保留了简短的内容,但您应该检查文件类型等信息,而不仅仅是假设它是一个可以接受的文件。
以及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...');
        }
    }
});

0

我已经深入研究了这个问题,似乎使用文件上传输入与Mandrill API进行附件操作是不可能的。由于浏览器实施的安全限制,需要服务器才能对file type="input"进行任何操作。

我通过使用Ink File Picker API在电子邮件底部放置一个安全下载链接来解决这个问题,但这看起来有点可疑。显然,原生方式会更好,但正如我所说,这似乎是不可能的。

然而,这种妥协在某些方面比原生方式更好:Ink API允许用户从各种服务中上传,以及传统的文件上传,这提高了文件上传机制的可扩展性和易用性。

使用链接作为附件仍然看起来可疑,但我通过使用文件名(API提供了访问权限)来最小化此方法的垃圾邮件程度:

[文件名](超链接到直接下载链接)已附加到此电子邮件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接