如何将文件上载为电子邮件中的附件

本文关键字:电子邮件 文件 上载 | 更新日期: 2023-09-27 18:22:00

我有一个表单,但用户的数据没有存储在任何地方,只是通过电子邮件发送。有人知道允许用户附加文件的简单方法吗?

到目前为止,当用户单击提交时,jquery会收集数据并将其发送到"AjaxController.cs"。(没有使用表单元素)

HTML

<div class="form">
    <input type="text" name="Name">
    <input type="file" name="File">
    <button>Submit</button>
</div>

JS

$(document).ready(function(){
    $('button').click(function(){
        var data = {};
        $('input').each(function(){
            data[this.name] = this.value;
        }
        $.post('/Ajax/Email', data, function(){
            alert("Email Sent");
        });
    });
}

C#

public class AjaxController : Controller
{
    public ActionResult Email()
    {
        MailMessage message = new MailMessage("from@fake.com","marketing@fake.com");
        foreach (string form_inputs in Request.Form.Keys)
        {
            String  input_name  =   form_inputs.ToString();
            String  input_value =   Request.Form[form_inputs].Trim();
            if(input_name == "File")
            {
                System.Net.Mail.Attachment attachment;
                attachment = new System.Net.Mail.Attachment(input_value); //ERROR
                message.Attachments.Add(attachment);
            }
            if (input_name == "Name")
            {
                message.Body = "Name: " + input_value;
            }
        }
        SmtpClient client = new SmtpClient();
        client.Port = 25;
        client.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network;
        client.UseDefaultCredentials = false;
        client.Host = "SMTP.fake.com";
        client.Send(message);
    }
}

/Ajax/电子邮件只需返回"已发送邮件!"!"

我收到一个错误,基本上说上传的文件在本地不存在——当然——因为它还没有上传。此时文件存在于何处,如何访问它?

如何将文件上载为电子邮件中的附件

MVC中上传的文件在Request集合中是HttpPostedFileBase类型。您可以使用它在服务器的内存中获取文件的流实例,并将其直接附加到电子邮件中。使用FORM标签时,必须在表单中设置enctype="multipart/form-data"

在您的控制器中:

public class AjaxController : Controller
{
    public ActionResult Email()
    {
        MailMessage message = new MailMessage("from@fake.com","marketing@fake.com");
        foreach (string form_inputs in Request.Form.Keys)
        {
            String  input_name  =   form_inputs.ToString();
            String  input_value =   Request.Form[form_inputs].Trim();
            if(input_name == "File")
            {            
                HttpPostedFileBase file = Request.Files[input_name];
                System.Net.Mail.Attachment attachment;
                attachment = new System.Net.Mail.Attachment(file.InputStream, file.FileName); //ERROR
                message.Attachments.Add(attachment);
            }
            if (input_name == "Name")
            {
                message.Body = "Name: " + input_value;
            }
        }
        SmtpClient client = new SmtpClient();
        client.Port = 25;
        client.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network;
        client.UseDefaultCredentials = false;
        client.Host = "SMTP.fake.com";
        client.Send(message);
    }
}

我还不得不提到一个事实,这可能非常不安全(危险),这取决于你计划如何实施。请确保在发送文件之前对其进行一些验证(内存中的病毒扫描/内容类型限制等)。


因为您使用的是Ajax(POST方法在封面下使用),所以您将面临一些额外的挑战。直到最近,Ajax文件上传还必须使用iframe破解。对于支持XHR2的现代浏览器,它只能使用JavaScript中的FormData对象来完成。幸运的是,这些因素不会影响服务器端代码。有关此方面的详细信息,请参阅此问题:jQuery Ajax文件上传

有关使用FormData的更多信息,请参阅此处:使用jQuery.ajax 发送多部分/FormData

下面是一篇深入讨论ajax表单上传的文章:http://abandon.ie/notebook/simple-file-uploads-using-jquery-ajax