ASP.NET отправляет вложения с электронной почтой без сохранения в файловой системе - PullRequest
1 голос
/ 14 апреля 2010

Я пытаюсь создать форму, которая отправит электронное письмо с прикрепленным изображением, и у меня возникли некоторые проблемы. Форма, которую я создаю, довольно большая, поэтому для этого вопроса я создал небольшую тестовую форму. Электронное письмо будет отправлено, и в нем будет вложение, но изображение повреждено или что-то в этом роде.

Также ..

Я не хочу сохранять изображение в файловую систему. Вы можете подумать, что извлекать файл изображения из файла загрузки в поток непросто, но это связано с тем фактом, что реальная форма, над которой я работаю, позволит добавить несколько файлов через одну загрузку файла и будет сохранена в сессии таким образом, изображения не будут поступать из элемента управления загрузкой файлов непосредственно при отправке.

Файл: TestAttachSend.aspx

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="TestAttachSend.aspx.cs" Inherits="TestAttachSend" %>

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <h1>Send Email with Image Attachment</h1>

            Email Address TO:  <asp:TextBox ID="txtEmail" runat="server"></asp:TextBox><br />
            Attach JPEG Image: <asp:FileUpload ID="fuImage" runat="server" /><br />

            <br />

            <asp:Button ID="btnSend" runat="server" Text="Send" onclick="btnSend_Click" /><br />

            <br />

            <asp:label ID="lblSent" runat="server" text="Image Sent!" Visible="false" EnableViewState="false"></asp:label>
        </div>
        </form>
    </body>

    </html>

Файл: TestAttachSend.aspx.cs

using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Net.Mail;
using System.IO;

public partial class TestAttachSend : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }
    protected void btnSend_Click(object sender, EventArgs e)
    {
        if (fuImage.HasFile && fuImage.PostedFile.ContentType == System.Net.Mime.MediaTypeNames.Image.Jpeg)
        {
            SmtpClient emailClient = new SmtpClient();
            MailMessage EmailMsg = new MailMessage();

            EmailMsg.To.Add(txtEmail.Text.Trim());
            EmailMsg.From = new MailAddress(txtEmail.Text.Trim());
            EmailMsg.Subject = "Attached Image";
            EmailMsg.Body = "Image is attached!";

            MemoryStream imgStream = new MemoryStream();
            System.Drawing.Image img = System.Drawing.Image.FromStream(fuImage.PostedFile.InputStream);
            string filename = fuImage.PostedFile.FileName;

            img.Save(imgStream, System.Drawing.Imaging.ImageFormat.Jpeg);
            EmailMsg..Attachments.Add(new Attachment(imgStream, filename, System.Net.Mime.MediaTypeNames.Image.Jpeg));

            emailClient.Send(EmailMsg);

            lblSent.Visible = true;

        }
    }
}

1 Ответ

1 голос
/ 14 апреля 2010

От макушки головы вам не нужно создавать объект Image.

Изменение:

  MemoryStream imgStream = new MemoryStream(); 
  System.Drawing.Image img = System.Drawing.Image.FromStream(fuImage.PostedFile.InputStream); 
  string filename = fuImage.PostedFile.FileName; 

  img.Save(imgStream, System.Drawing.Imaging.ImageFormat.Jpeg); 
  EmailMsg..Attachments.Add(new Attachment(imgStream, filename, System.Net.Mime.MediaTypeNames.Image.Jpeg)); 

до

  //can't remember, but you may also need to set the position to 0 ?
  //fulImage.PostedFile.InputStream.Position = 0
  EmailMsg..Attachments.Add(new Attachment(fulImage.PostedFile.Inputstream, filename, System.Net.Mime.MediaTypeNames.Image.Jpeg)); 

Кроме того, предполагается, что загружаемые вами изображения являются файлами JPEG.

...