You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Azure函数中获取HTML表单中的用户邮箱值?

如何在Azure Blob触发函数中获取用户邮箱值

针对你的场景,有三种可靠的方案可以让Blob触发函数获取到用户邮箱,以下是具体实现:

方案1:将邮箱存储为Blob自定义元数据

这是最直接的方式,上传文件时把邮箱添加到Blob的元数据中,触发函数通过绑定自动读取元数据。

.NET Core MVC上传代码

在表单提交的Action中,上传文件时添加邮箱元数据:

[HttpPost]
public async Task<IActionResult> Upload(IFormFile file, string userEmail)
{
    if (file == null || file.Length == 0)
        return BadRequest("请选择要上传的文件");

    var blobServiceClient = new BlobServiceClient("你的Azure Blob连接字符串");
    var containerClient = blobServiceClient.GetBlobContainerClient("目标容器名");
    await containerClient.CreateIfNotExistsAsync();

    // 生成唯一Blob名称
    var blobName = $"{Guid.NewGuid()}{Path.GetExtension(file.FileName)}";
    var blobClient = containerClient.GetBlobClient(blobName);

    // 添加邮箱到Blob元数据
    var metadata = new Dictionary<string, string>
    {
        { "UserEmail", userEmail }
    };
    await blobClient.SetMetadataAsync(metadata);

    // 上传文件
    using (var stream = file.OpenReadStream())
    {
        await blobClient.UploadAsync(stream, overwrite: true);
    }

    return RedirectToAction("UploadSuccess");
}

Blob触发函数代码

函数通过IDictionary<string, string> metadata绑定获取Blob元数据:

public static class BlobEmailNotificationFunction
{
    [FunctionName("BlobEmailNotificationFunction")]
    public static async Task Run(
        [BlobTrigger("目标容器名/{name}", Connection = "AzureWebJobsStorage")] Stream blobStream,
        string name,
        IDictionary<string, string> metadata,
        ILogger log)
    {
        log.LogInformation($"处理Blob: {name},大小: {blobStream.Length}字节");

        // 提取邮箱值
        if (metadata.TryGetValue("UserEmail", out string userEmail))
        {
            log.LogInformation("准备发送邮件到: " + userEmail);
            // 这里添加你的邮件发送逻辑,比如调用SendGrid或SMTP服务
            // await SendNotificationEmail(userEmail);
        }
        else
        {
            log.LogWarning("未找到用户邮箱元数据");
        }
    }
}

方案2:将邮箱与Blob名称关联存储到Azure Table Storage

如果不想修改Blob元数据,可以在上传时把Blob名称和邮箱的对应关系存入Table Storage,函数触发后根据Blob名称查询邮箱。

MVC上传时写入Table Storage

[HttpPost]
public async Task<IActionResult> Upload(IFormFile file, string userEmail)
{
    // 省略Blob上传逻辑...
    var blobName = $"{Guid.NewGuid()}{Path.GetExtension(file.FileName)}";
    var blobClient = containerClient.GetBlobClient(blobName);
    await blobClient.UploadAsync(stream, overwrite: true);

    // 写入Table Storage关联数据
    var tableServiceClient = new TableServiceClient("你的Table Storage连接字符串");
    var tableClient = tableServiceClient.GetTableClient("BlobEmailMappings");
    await tableClient.CreateIfNotExistsAsync();

    var mappingEntity = new BlobEmailMapping(blobName, userEmail);
    await tableClient.AddEntityAsync(mappingEntity);

    return RedirectToAction("UploadSuccess");
}

// 定义Table实体类
public class BlobEmailMapping : ITableEntity
{
    public BlobEmailMapping() { }
    public BlobEmailMapping(string blobName, string email)
    {
        PartitionKey = "BlobEmail";
        RowKey = blobName;
        UserEmail = email;
    }

    public string PartitionKey { get; set; }
    public string RowKey { get; set; }
    public string UserEmail { get; set; }
    public DateTimeOffset? Timestamp { get; set; }
    public ETag ETag { get; set; }
}

Blob触发函数查询Table Storage

public static class BlobEmailNotificationFunction
{
    [FunctionName("BlobEmailNotificationFunction")]
    public static async Task Run(
        [BlobTrigger("目标容器名/{name}", Connection = "AzureWebJobsStorage")] Stream blobStream,
        string name,
        ILogger log)
    {
        log.LogInformation($"处理Blob: {name}");

        // 查询Table获取邮箱
        var tableServiceClient = new TableServiceClient("你的Table Storage连接字符串");
        var tableClient = tableServiceClient.GetTableClient("BlobEmailMappings");
        var mappingEntity = await tableClient.GetEntityAsync<BlobEmailMapping>("BlobEmail", name);

        if (mappingEntity != null)
        {
            string userEmail = mappingEntity.Value.UserEmail;
            log.LogInformation("准备发送邮件到: " + userEmail);
            // 执行邮件发送逻辑
        }
    }
}

方案3:将邮箱编码到Blob文件名中

把邮箱进行URL编码后拼到Blob文件名里,函数触发后解析文件名提取邮箱。

MVC上传时生成带邮箱的文件名

[HttpPost]
public async Task<IActionResult> Upload(IFormFile file, string userEmail)
{
    // 对邮箱编码,避免特殊字符干扰文件名
    string encodedEmail = Uri.EscapeDataString(userEmail);
    var blobName = $"{encodedEmail}_{Guid.NewGuid()}{Path.GetExtension(file.FileName)}";

    var blobServiceClient = new BlobServiceClient("你的Azure Blob连接字符串");
    var containerClient = blobServiceClient.GetBlobContainerClient("目标容器名");
    var blobClient = containerClient.GetBlobClient(blobName);

    using (var stream = file.OpenReadStream())
    {
        await blobClient.UploadAsync(stream, overwrite: true);
    }

    return RedirectToAction("UploadSuccess");
}

Blob触发函数解析文件名

public static class BlobEmailNotificationFunction
{
    [FunctionName("BlobEmailNotificationFunction")]
    public static void Run(
        [BlobTrigger("目标容器名/{name}", Connection = "AzureWebJobsStorage")] Stream blobStream,
        string name,
        ILogger log)
    {
        log.LogInformation($"处理Blob: {name}");

        // 解析文件名提取邮箱
        string[] nameParts = name.Split('_', 2);
        if (nameParts.Length >= 1)
        {
            string userEmail = Uri.UnescapeDataString(nameParts[0]);
            log.LogInformation("准备发送邮件到: " + userEmail);
            // 执行邮件发送逻辑
        }
    }
}

内容的提问来源于stack exchange,提问作者Vova

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 20:15:25