3

In my view, users can search for a document and once they get the result, they can click on its id and they can download the document from specific url based on id: http://test.com/a.ashx?format=pdf&id={0}

For example, if the id is 10, then url to download document will be: http://test.com/a.ashx?format=pdf&id=10, and when user click on it they are able to download the document.

This is how it looks like in my view:

 foreach (var item in Model)
        {

                <td>
                    <a href=@string.Format("http://test.com/a.ashx?format=pdf&id={0}",item.id)>
                        @Html.DisplayFor(modelItem => item.id)
                    </a>
                </td>
        }

And below is my controller action for SendEmail.

I am able to send email to the user. But i am having problem with sending attachments. My question is: how can i attach the document that comes with the url to the email?

 public static bool SendEmail(string SentTo, string Text, string cc)
    {

        MailMessage msg = new MailMessage();

        msg.From = new MailAddress("test@test.com");
        msg.To.Add(SentTo);
        msg.CC.Add(cc);
        msg.Subject = "test";
        msg.Body = Text;
        msg.IsBodyHtml = true;

        System.Net.Mail.Attachment attachment;
        attachment = new System.Net.Mail.Attachment(???);
        msg.Attachments.Add(attachment);

        SmtpClient client = new SmtpClient("mysmtp.test.com", 25);

        client.UseDefaultCredentials = false;
        client.EnableSsl = false;
        client.Credentials = new NetworkCredential("test", "test");
        client.DeliveryMethod = SmtpDeliveryMethod.Network;
        //client.EnableSsl = true;

        try
        {
            client.Send(msg);
        }
        catch (Exception)
        {
            return false;
        }
        return true;
    }
thatthing
  • 676
  • 3
  • 15
  • 39
  • 4
    What is _"attach the document that comes with the url"_? Do you want your code to download the URL contents and attach that file to the mail message? – CodeCaster Oct 14 '14 at 10:04
  • Yes, in this case my url content is a PDF. – thatthing Oct 14 '14 at 10:07
  • 2
    Do you have the PDF files on your server already, or are they generated? What part _specifically_ are you having trouble with? See for example [Get file to send as attachment from byte array](http://stackoverflow.com/questions/23212196/get-file-to-send-as-attachment-from-byte-array). – CodeCaster Oct 14 '14 at 10:10
  • I am not sure how to define my pdf location in here: attachment = new System.Net.Mail.Attachment(???);. PDF files are not in server, they are generated. – thatthing Oct 14 '14 at 10:11
  • 1
    in that case you need to download the whole pdf in temporary folder and then attach it to email send code... – Shazhad Ilyas Oct 14 '14 at 10:21

2 Answers2

6

If the PDF file is generated on an external site, you will need to download it in some way, for this you can use WebClient:

var client = new WebClient();

// Download the PDF file from external site (pdfUrl) 
// to your local file system (pdfLocalFileName)
client.DownloadFile(pdfUrl, pdfLocalFileName);  

Then you can use it on Attachment:

attachment = new Attachment(pdfLocalFileName, MediaTypeNames.Application.Pdf);
msg.Attachments.Add(attachment)
giacomelli
  • 7,287
  • 2
  • 27
  • 31
1

Consider using Postal It's open source libriary for ASP.Net MVC allowing you to send emails very easy. For example to attach file you can use such code:

dynamic email = new Email("Example");
email.Attach(new Attachment("c:\\attachment.txt"));
email.Send(); 

Also you may want to use HangFire to send email in background, please take a look at the Sending Mail in Background with ASP.NET MVC

Update: In order to get the PDF file path you can use Server.MapPath method to convert virtual path to the corresponding physical directory on the server.

Max Brodin
  • 3,903
  • 1
  • 14
  • 23