Avatar billede doncarnage Nybegynder
13. september 2010 - 13:11 Der er 16 kommentarer og
1 løsning

Tilføje vedhæftede filer til mit nyhedsbrev

Goddag eksperter,

Jeg har et nyhedsbrevs-script, som fungerer som det skal. Jeg kunne dog godt tænke mig at tilføje muligheden for at vedhæfte filer til det. Men hvordan gør jeg det på min side uden at lave om på opbygningen og måden mailsne sendes ud?

Codebehind filen ser ud som her:

--------------------------------------------------------------------

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using Commentasks;

public partial class newsletter_directmail : System.Web.UI.Page
{
    int pause_1 = 0;
    int pause_2 = 100;
    int counter = 0;
    string QueryString;
    string Subject;
    string Content;
    Commentasks.Commentasks cmt = new Commentasks.Commentasks();
    DataTable dt;
    DataTableReader dtr;

    protected void Page_Load(object sender, EventArgs e)
    {
        dt = cmt.db_SELECT_DT("SELECT COUNT(*) AS recipients FROM DATABASEN");
        dtr = new DataTableReader(dt);
        dtr.Read();
        count.Text = dtr["recipients"].ToString() + " modtagere";
    }
    protected void btn1_Click(object sender, EventArgs e)
    {
        Subject = subject.Text;
        Content = content.Text;
        sendMail(Subject, Content);
    }
    protected void sendMail(string subject, string content)
    {
        QueryString = "SELECT * FROM DATABASEN";   
        dt = cmt.db_SELECT_DT(QueryString);
        dtr = new DataTableReader(dt);

        while (dtr.Read())
        {
            counter++;
            //afsender
            cmt.sendDIRECTHTMLMail(subject, content, "AFSENDER@EMAIL.DK", dtr["email"].ToString());
            Response.Write(counter + " " + dtr["email"].ToString() + "<br>");
            Response.Flush();
                     
        }

    }

}

--------------------------------------------------------------------
Avatar billede lasserasch Juniormester
13. september 2010 - 14:13 #1
Du skal have lavet et overload til din Commentasks.Commentasks sendDIRECTHTMLMail som kan modtage stien til filen som skal vedhæftes.

I det overload skal du så tilføje et attachment til dit MailMessage objekt, sådan her:

MailMessage msg = new MailMessage(...);
msg.Attachments.Add(new Attachment("stien til filen som skal vedhæftes");


Mvh.
Lasse
Avatar billede doncarnage Nybegynder
13. september 2010 - 15:32 #2
Hej Lasse,

Jeg har prøvet mig frem med denne metode, som er noget nær det samme som det du skriver så vidt jeg kan forstå på det hele (er .net rookie :D):

--------------------------------------------------------------------------------
        public bool sendDIRECTHTMLMail(string subject, string content, string from, string email, string attachments)
        {
            bool IsMailSend = false;

            try
            {
                MailAddress adress = new MailAddress(from);
                MailMessage mail = new MailMessage(from, email, subject, content, attachments);
                SmtpClient smtp = new SmtpClient("min_smtp_adresse");

                mail.SubjectEncoding = System.Text.Encoding.Default;
                mail.BodyEncoding = System.Text.Encoding.Default;

                Attachment attach;

                if (attachments.Items.Count != 0)
                {
                    for (int i = 0; i <= attachments.Items.Count - 1; i++)
                    {
                        attach = new Attachment("D:/SL-IMG/stofa.jpg");
                        mail.Attachments.Add(attach);
                    }
                }

                mail.IsBodyHtml = true;
                mail.Sender = adress;


                smtp.Send(mail);
            }
            catch (Exception error)
            {
                IsMailSend = false;
            }
            return IsMailSend;
        }
--------------------------------------------------------------------------------

Men her får jeg nedenstående fejl når jeg bare prøver at åbne siden - ved du hvad det skyldes?


Compiler Error Message: CS1501: No overload for method 'MailMessage' takes '5' arguments

Line 254:                MailMessage mail = new MailMessage(from, email, subject, content, attachments);
Avatar billede lasserasch Juniormester
13. september 2010 - 15:58 #3
Alle har været .Net rookies engang og på nogle områder er jeg det sgu endnu :-) Så det er godt man har eksperten.dk...

Du gør nogle ting forkert.

1. Du prøver at oprette en mailmessage objekt hvor du angiver attachment som parameter. Det kan man ikke, deraf din Compiler fejl.

2. Du forsøger så at loope igennem en streng 'attachments'. Det kan man heller ikke. Jeg kan heller ikke lige se logikken i dit attachment loop.

3. Hvis du har attachment som en streng parameter til din metode, så kan du kun vedhæfte en fil. Eller samme fil mange gange :-) Måske var det en ide at lave den parameter om til en collection af attachments eller et string array.

I hvert fald hvis du skal kunne vedhæfte flere filer.

Anyway...

Har rettet din metode til. Denne kan compile :-)


Mvh.
Lasse





public bool sendDIRECTHTMLMail(string subject, string content, string from, string email, string attachment)
        {
            bool IsMailSend = false;

            try
            {
                MailAddress adress = new MailAddress(from);
                MailMessage mail = new MailMessage(from, email, subject, content);
                SmtpClient smtp = new SmtpClient("min_smtp_adresse");

                mail.SubjectEncoding = System.Text.Encoding.Default;
                mail.BodyEncoding = System.Text.Encoding.Default;

                mail.Attachments.Add(new Attachment(attachment)); // Attachment er den fysiske sti til den fil der skal vedhæftes. F.eks. 'D:/SL-IMG/stofa.jpg'

                mail.IsBodyHtml = true;
                mail.Sender = adress;


                smtp.Send(mail);
            }
            catch
            {
                IsMailSend = false;
            }
            return IsMailSend;
        }
Avatar billede doncarnage Nybegynder
13. september 2010 - 16:52 #4
Så langt så godt ;)

Grunden til at jeg benyttede mig af en streng var bare for at jeg først ville teste med en enkelt attachment for så derefter at udbygge til flere når det først virkede :)

Det virker nu, hvis jeg på forhånd har angivet en manuel stil.. Men hvordan får jeg det så til at spille med attachment i frontend/backend foruden commenttasken?


Jeg har prøvet at oprette følgende:

<asp:FileUpload ID="txtAttachment" runat="server" />


Og dertil følgende i backend:

string Url = txtAttachment.PostedFile.FileName;
Attachment = URL


Her får jeg dog ikke den vedhæftede fil med og jeg tror selv det er pga. den ikke får hele stien med :/ Hvis jeg prøver at udskrive strengen URL får jeg nemlig kun navnet på den pågældende fil med endelsen :S
Avatar billede lasserasch Juniormester
13. september 2010 - 17:05 #5
Jamen hvis du har en Fileuploader, så skal du tjekke i din Sendmail metode (som jo kalder sendDIRECTHTMLMail) om der er en fil til rådighed heri. Altså om brugeren har valgt at vedhæfte en fil.

Hvis ja, så skal du kalde det overload som tager stien til filen som parameter også. Hvis ikke, så skal du kalde som du har gjort indtil nu.


Noget ala:


protected void sendMail(string subject, string content)
    {
        QueryString = "SELECT * FROM DATABASEN";   
        dt = cmt.db_SELECT_DT(QueryString);
        dtr = new DataTableReader(dt);

        while (dtr.Read())
        {
            counter++;
            //afsender

/// Tjek om brugeren har valgt at vedhæfte en fil.
if (txtAttachment.HasFile)
            {
            cmt.sendDIRECTHTMLMail(subject, content, "AFSENDER@EMAIL.DK", dtr["email"].ToString(), txtAttachment.FileName);

                }
else
{
            cmt.sendDIRECTHTMLMail(subject, content, "AFSENDER@EMAIL.DK", dtr["email"].ToString());

}


            Response.Write(counter + " " + dtr["email"].ToString() + "<br>");
            Response.Flush();
                     
       
}

}


Mvh
Lasse
Avatar billede lasserasch Juniormester
13. september 2010 - 17:10 #6
Men jo, du har ret i at den ikke indeholder hele stien til filen.


Derfor var det måske en ide at lave din attachment streng parameter i sendDIRECTHTMLMail metoden om til at være af typen Attachment.


Så ville du nemlig kunne gøre sådan her:

/// Tjek om brugeren har valgt at vedhæfte en fil.
if (txtAttachment.HasFile)
            {
System.Net.Mail.Attachment attactment = new System.Net.Mail.Attachment(uploader1.FileContent, null);

            cmt.sendDIRECTHTMLMail(subject, content, "AFSENDER@EMAIL.DK", dtr["email"].ToString(), attactment);

                }
else
{
            cmt.sendDIRECTHTMLMail(subject, content, "AFSENDER@EMAIL.DK", dtr["email"].ToString());
Avatar billede lasserasch Juniormester
13. september 2010 - 17:14 #7
uploader1 skulle have været txtAttachement.

Altså:

System.Net.Mail.Attachment attactment = new System.Net.Mail.Attachment(txtAttachment.FileContent, null);
Avatar billede doncarnage Nybegynder
13. september 2010 - 20:54 #8
Hej igen ;)

Når jeg prøver med denne løsning:

------------------------------------------------------------------------------

    protected void sendMailTest(string subject, string content)
    {
        if (txtAttachment.HasFile){
            System.Net.Mail.Attachment attactment = new System.Net.Mail.Attachment(txtAttachment.FileContent, null);
            cmt.sendDIRECTHTMLMail(subject, content, "afsender@mail.dk", dtr["email"].ToString(), attactment);
        }
        else{
            cmt.sendDIRECTHTMLMail(subject, content, "afsender@mail.dk", dtr["email"].ToString());
        }
    }

------------------------------------------------------------------------------


Får jeg følgende error:


Compiler Error Message: CS0121: The call is ambiguous between the following methods or properties: 'System.Net.Mail.Attachment.Attachment(System.IO.Stream, string)' and 'System.Net.Mail.Attachment.Attachment(System.IO.Stream, System.Net.Mime.ContentType)'

Line 104:            System.Net.Mail.Attachment attactment = new System.Net.Mail.Attachment(txtAttachment.FileContent, null);
Avatar billede doncarnage Nybegynder
13. september 2010 - 21:13 #9
...og det til trods for at jeg har prøvet at tilføje:

using System.Net.Mail;
Avatar billede lasserasch Juniormester
13. september 2010 - 21:15 #10
Nu havde jeg ikke lige forsøgt at compile det eksempel, så den havde jeg ikke fanget.

Brug i stedet:

System.Net.Mail.Attachment attactment = new System.Net.Mail.Attachment(txtAttachment.FileContent, string.Empty);


Mvh.
Lasse
Avatar billede lasserasch Juniormester
13. september 2010 - 21:17 #11
Exception opstår fordi jeg havde medsendt null.

Og da der er 2 overloads som modtager samme antal parametre og hvor disse parametre i begge tilfælde kan være null, så ved den ikke hvilket overload den skal tage.

Hvis du medsender string.Empty i stedet for null, så ved den hvilken den skal bruge.


Mvh.
Lasse
Avatar billede doncarnage Nybegynder
13. september 2010 - 22:28 #12
Oh okay, my bad ;) Den havde jeg ikke lige set komme..

Det er dog lidt som om den ikke helt får attachment med, når jeg prøver at få noget indhold med... Hvis jeg fx prøver med:
-------------------------------------------------
        if (txtAttachment.HasFile){
            System.Net.Mail.Attachment attachment = new System.Net.Mail.Attachment(txtAttachment.FileContent, string.Empty);
            //cmt.sendDIRECTHTMLMail(subject, content, "adresse@mail.dk", dtr["email"].ToString(), Attachment);
            Response.Write(Attachment);
        }
-------------------------------------------------

Så får jeg intet output..


Og hvis jeg så prøver med
-------------------------------------------------
        if (txtAttachment.HasFile){
            System.Net.Mail.Attachment Attachment = new System.Net.Mail.Attachment(txtAttachment.FileContent, string.Empty);
            //cmt.sendDIRECTHTMLMail(subject, content, "adresse@mail.dk", dtr["email"].ToString(), Attachment);
            Response.Write(Attachment);
        }
-------------------------------------------------

Så får jeg følgende output:

"System.Net.Mail.Attachment"
Avatar billede doncarnage Nybegynder
22. september 2010 - 09:59 #13
Gik du helt død ;)?
Avatar billede lasserasch Juniormester
22. september 2010 - 11:53 #14
Har du messenger? Kan du ikke tilføje mig. Det er lidt nemmere end via eksperten.dk

mit msn navn er : lasserasch


Mvh.
Lasse
Avatar billede doncarnage Nybegynder
20. oktober 2010 - 13:59 #15
Hey igen lasserasch,

Kan du ikke smide et svar så du kan få points ;)?

De/vi valgte at finde en anden løsning nemlig, men du skal selvfølgelig have point som tak for hjælpen
Avatar billede doncarnage Nybegynder
04. november 2010 - 02:33 #16
hallo?
Avatar billede doncarnage Nybegynder
04. november 2010 - 02:33 #17
lukker...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester