如何将文件上载为电子邮件中的附件
本文关键字:电子邮件 文件 上载 | 更新日期: 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