0

I am trying to send emails with attachments attached to the email. I have a InputFile with a progress bar that I am able to upload files. I have attempted to use the memory stream to make attachments to the MailMessage class. The issue is that when the email is received, I am able to see the attachments but I can't read or view the contents of the attachments. I've posted my code below so you can replicate the issue that I am having (Make sure to install the Meziantou.Framework.ByteSize nuget package)


@using System.Net.Mail
@using System.Globalization
@using Meziantou.Framework


<InputFile OnChange="e => LoadFiles(e)" multiple></InputFile>

@foreach (var file in uploadedFiles)
{
    <div>
        @file.FileName
        <progress value="@file.UploadedBytes" max="@file.Size"></progress>
        @file.UploadedPercentage.ToString("F1")%
        (@FormatBytes(file.UploadedBytes) / @FormatBytes(file.Size))
    </div>

}

<button type="button" @onclick="@HandleNotifSubmit" class="btn btn-primary submit">Send Email</button>

@code {


    private MemoryStream fileContents { get; set; }
    List<FileUploadProgress> uploadedFiles = new();
    MailMessage message = new MailMessage();
    StreamWriter writer { get; set; }

    private async ValueTask LoadFiles(InputFileChangeEventArgs e)
    {

        var files = e.GetMultipleFiles(maximumFileCount: 100);

        var startIndex = uploadedFiles.Count;

        // Add all files to the UI
        foreach (var file in files)
        {
            var progress = new FileUploadProgress(file.Name, file.Size);
            uploadedFiles.Add(progress);
        }

        // We don't want to refresh the UI too frequently,
        // So, we use a timer to update the UI every few hundred milliseconds
        await using var timer = new Timer(_ => InvokeAsync(() => StateHasChanged()));
        timer.Change(TimeSpan.FromMilliseconds(500), TimeSpan.FromMilliseconds(500));

        // Upload files
        byte[] buffer = System.Buffers.ArrayPool<byte>.Shared.Rent(4096);
        try
        {
            foreach (var file in files)
            {

                using var stream = file.OpenReadStream(maxAllowedSize: 10 * 1024 * 1024);
                while (await stream.ReadAsync(buffer) is int read && read > 0)
                {
                    uploadedFiles[startIndex].UploadedBytes += read;

                    var readData = buffer.AsMemory().Slice(0, read);
                }

                fileContents = new MemoryStream(buffer);
                writer = new StreamWriter(fileContents);
                fileContents.Position = 0;

                message.Attachments.Add(new Attachment(fileContents, file.Name));

                startIndex++;
            }
        }
        finally
        {
            System.Buffers.ArrayPool<byte>.Shared.Return(buffer);
            StateHasChanged();
        }
    }

    string FormatBytes(long value)
     => ByteSize.FromBytes(value).ToString("fi2", CultureInfo.CurrentCulture);

    record FileUploadProgress(string FileName, long Size)
    {
        public long UploadedBytes { get; set; }
        public double UploadedPercentage => (double)UploadedBytes / (double)Size * 100d;
    }

    private async void HandleNotifSubmit()
    {
        try
        {
            var sClient = new SmtpClient("FAKECOMPANYCLIENT");
            sClient.Port = 25;
            sClient.UseDefaultCredentials = false;

            message.Subject = "Hello World";
            message.From = new MailAddress("test@gmail.com");
            message.IsBodyHtml = true;
            message.To.Add(new MailAddress("Fake@gmail.com"));
            message.Body = "Please view attachments below.";

            sClient.Send(message);

            message.Dispose();
        }
    catch

    {
            Console.WriteLine("error");
        }
    }

}

I have also tried to use a stream writer with no success. I have also tried various ways to do a file.CopyToAsync(memoryStreamname). I am not sure what else I am missing or doing wrong here.

Thank you in advance.

Trent
  • 1
  • 1

0 Answers0