问题描述
我们有一个基于Web的应用程序,允许用户发送电子邮件。每个电子邮件正文都包含代表签名块的图像。图像存储在私有容器中的Azure Blob存储中。为了从存储中提取图像并将其放置在电子邮件正文中,因为用户正在构造电子邮件,我们使用以下C#函数生成Uri:
public string GenerateBlobDownloadUri(string containerName,string blobName)
{
var policy = new SharedAccessBlobPolicy();
// Get a reference to a container if it exists.
var container = GetContainer(containerName,false);
if (container == null)
return string.Empty;
// Retrieve reference to the blob
CloudBlockBlob blockBlob = container.GetBlockBlobReference(blobName);
if (!blockBlob.Exists())
return string.Empty;
policy.SharedAccessExpiryTime = DateTime.Now.AddYears(10);
policy.Permissions = SharedAccessBlobPermissions.Read;
var token = blockBlob.GetSharedAccessSignature(policy);
return blockBlob.Uri + token;
}
使用此功能,我们可以在构建电子邮件并将其正确显示时将图像从Azure成功地拉入我们的电子邮件正文中。
但是,如果我要查看电子邮件的基础HTML代码,请复制生成的Uri并将其粘贴到浏览器中,该图像将不会显示或下载。我刚收到一条Json消息,说找不到该图像。
https://xxxxx.blob.core.windows.net/winterscontainer/55-Email Signature Block.png?sv=2018-03-28&sr=b&sig=8zkwcK7naE%2BPZRfo6GtBYVfHJLzlCBLR6IaYymTIOGo%3D&se=2030-10-17T12%3A30%3A56Z&sp=r
同样,此Uri在我们的应用程序中运行,并在创建电子邮件时正确提取图像并正确显示。但是,发送电子邮件时,收件人只会看到图片的占位符。
如果我将Uri粘贴到浏览器中,则会得到以下提示:
<Error>
<Code>ResourceNotFound</Code>
<Message>The specified resource does not exist. RequestId:4ca4e68b-b01e-0130-5781-a4a67e000000 Time:2020-10-17T12:33:33.0601864Z</Message>
</Error>
解决方法
如果检查您的Uri,您会在查询部分发现一些“奇怪”的东西,“&”符号将被转换为HTML实体,而不是long big = (long) 1e300;
,您将收到&
。
直到消息到达您的客户端(您的api,邮件服务器,Web浏览器,邮件客户端...都有很多可能)之前,消息链中的某些内容都对其进行了编码(可能是您已经收到了编码,但我对此表示怀疑,我也使用Azure blob存储,但从未收到过对其进行编码的信息。
如果您手动解码那些转义的字符,您会注意到Uri正常工作,因此现在您必须找到要在链中进行编码的位置,这是完全不同的情况。