nerdMail v1.0.2 - mailklasse m/vedlegg (PHP)

Trenger du tilbakemeldinger på et prosjekt eller en nettside? Post linken og spørsmålet ditt her.

NB: Dette er ikke et sted du kan reklamere for dine egne nettsider. Er du i tvil, ta kontakt med en moderator/administrator.

nerdMail v1.0.2 - mailklasse m/vedlegg (PHP)

Innlegg ZtigO » 04.06.2009 11:52

nerdMail - mailclass w/attachments
Sist oppdatert: 23.07.2009 - 13.09

Ettersom jeg ved gjentatte ganger har måtte sende epost med mine PHP-skripts, så bestemte jeg meg til slutt for å skrive en klasse for å gjøre hverdagen enklere. Jeg skrev den i hovedsak for å selv spare tid, men jeg tenkte også på andre da jeg skrev klassen; at den er brukervennlig. Klassen er ikke kun for å sende vanlige tekstepost, du kan også sende eposten som html, eller sende både en tekst- og htmlversjon. Den har også støtte for alle typer vedlegg, flere mottakere (også cc og bcc), en kraftig emailverifisering, anti-injectionfunksjon og det er enkelt å legge til/modifisere headere i eposten.

Jeg ønsker at alle bugs/feil blir rapportert inn og om du ønsker, kom gjerne med konstruktiv kritikk!
Koden i pastebin: http://norskwebforum.no/pastebin/11053
Nedlastbar: http://nerdvar.com/nyttig/nerdmail_class.zip

Dere har lov til å bruke den til hva dere vil uten å gi meg creds, men dere har ikke lov til å oppgi koden som egen

DOKUMENTASJON

Hent inn klassen og sett standard variabler:
Kode: Merk alt
require_once("mail_class.php");
$mail = new nerdMail;

$mail->subject = "The New PHP Mail";  // Meldingens emne, ikke obligatorisk
$mail->sender = "Nerdvar <no-reply@nerdvar.com>"; // Avsender, kan også kun være en epostadresse
$mail->returnPath = "bounce@nerdvar.com"; // Ikke obligatorisk, lurt for å ikke bli kategorisert som spam
 


Legg til mottakere
Kode: Merk alt
$mail->addMail("to", "enfyr@domene.com"); // Vanlig mottaker
$mail->addMail("to", "enannenfyr@domene.com", true); // Enda en mottaker med epostverifisering, returnerer false om ugyldig
$mail->addMail("cc", "kopi@domene.com"); // Legg til en kopimottaker
$mail->addMail("bcc", "blindkopi@domene.com", true); // Verifiser epost og legg til en blindkopimottaker, returnerer false om ugyldig         


Definer epost body (meldingen), html eller text må defineres (kan også være begge).
Kode: Merk alt

$mail
->text = "Hei\n\nAt du ser dette betyr at din epostklient ikke støtter eller har deaktivert html. Det var synd!\n\nJaja, du får ihvertfall eposten i klartekst og kanskje en link til online-versjon\n\nHils!";

$mail->html = "<html><body><h1>Din klient støtter HTML!</h1>\n\n<p>Så herlig, da kan vi jo legge til linker og bilder og lage en kul epost som du mottar</p>

<img src=\"http://norskwebforum.no/styles/prosilver/imageset/logo_nwf.gif\" alt=\"NWF\" />

<p>Kos deg!</p></body></html>"
; 


Legg ved noen vedlegg (attachments) og endre noen headere:
Kode: Merk alt
$mail->attach("mockup.jpg", "image/jpeg");
$mail->attach("http://no.php.net/images/php.gif", "image/gif");
$mail->attach("myapp/readme.txt"); // Om du ikke definerer metatype (filtype) blir den satt til application/octet-stream
$mail->attach("myapp/readmetoo.txt", "text/plain", BIT7); // Om du ønsker BIT7-enkoding på attachment istede for base64, unormalt
/* Har valgt å bruke url istede for noe annet, da fungerer den på både å legge til nyopplasta filer og eksisterene filer */

//Modifiser noen headere
$mail->addHeader("Message-Id", "kodenr@mittdomene.com");
$mail->addHeader("List-Unsubscribe: <http://dittdomene.com/unsubscribe.php>");
/* Denne funskjonen vil også overskrive de standard headerne som blir satt av klassen om du definerer de med addHeader
Standard definerte headere er: mime-version, content-type, from, reply-to, cc, bcc, to (De fem siste blir satt av tidligere nevnte funskjoner) */
 


Send eposten:
Kode: Merk alt
$mail->send(); // Returnerer true / false         


Tillegsfunksjoner:
Kode: Merk alt
$mail->parseMail($email);
/* Kan også brukes slik nerdMail::parseMail($email) (om du ikke har satt $mail)
Den tar både "dittnavn@domene.no" og "Ditt Navn <dittnavn@domene.no>"
Den sjekker eposten med regExp og sjekker om mailserveren "domene.no" eksisterer
Fin til å bruke feks i et kontaksskjema hvor avsender skriver inn sin epostadresse */

$mail->antiInjection($field);
/* De som har erfaring med å sende mail fra PHP vet at det er en fare ved iputfelter som
inkluderes i mailen. Om man ikke sjekker dette kan andre bruke ditt simple epostskjema til
å spamme andre. Denne funskjonen sjekker om noen prøver dette. Burde settes på
input subject, input eposter og evt. input headerinformasjon. Kan også brukes
slik: nerdMail::antiInjection($email) (om du ikke har satt $mail)

Gir true hvis injectionforsøk blir oppdaget */
 
Sist endret av ZtigO den 23.07.2009 12:03, endret 8 ganger.
Nerdvar - Stigma was here
Brukerens avatar
ZtigO
Seniormedlem
 
Innlegg: 1154
Registrert: 06.03.2005 16:01
Bosted: Nydalen, Oslo

Re: Tilbakemelding på mailklasse m/vedlegg (PHP)

Innlegg Hellkeepa » 04.06.2009 14:36

HELLo!

Meget godt initiativ, det settes stor pris på at du har valgt å dele det her også. :-)
Noen raske tilbakemeldinger, over ting som kan/burde bli forbedret.

  • Hvorfor PHP4-syntaks på klassen? Burde bli gjort om til PHP5, pga features og for å unngå notices/warnings for bruken av "var".
  • Litt for mye bruk av one-liners, spesielt i while-løkkene, gjør koden mer uoversiktelig enn nødvendig.
  • JavaDoc-kommentarer for hver enkelt metode, samt selve klassen, burde ha blitt lagt til.
  • Bruk "preg_* ()" funksjonene i stedet for "ereg* ()", førstnevnte er både raskere og har langt større funksjonalitet.
  • Benytt deg av "\z" i stedet for "$" i RegExp, for å signalisere end of string. Står mer om dette i PHP-manualen.
  • Valideringen av e-postadressene burde bli gjort helt om. Unødvendig tungvindt, komplekst og potensielt feilaktig. Gjerne ta i bruk "Val_email ()" hvis du ønsker.
  • Blacklisting på "antiInjection ()", bruk "whitelisting" i stedet.
  • Manglende validering på alt annet innhold. Alt burde valideres i det det legges til, for å forsikre at det ikke blir lagt til noen headers (eller innhold) som ikke skal være med.
  • Du mangler en hel rekke konstanter: "OCTET", "BASE64", "TEXT", "BIT7"
  • Skal bare være én "mail multi part boundary", hvor hver del blir skilt av "--$boundary" og mailen avsluttes med "--$boundary--".
  • Shell-injection muligheter i linje 13!
  • Så litt flisespikkeri: "$sendAction" er unødvendig, erstatt denne med "return" direkte.
Skal se litt nærmere på denne klassen etterhvert, men har desverre ikke tid nå. Lykke til.

Happy codin'!
Takker til FagSoft for hosting av Postal tabellene
Anbefalt lesning for alle: How to ask questions the smart way
Brukerens avatar
Hellkeepa
Moderator
 
Innlegg: 7616
Registrert: 08.10.2005 19:48
Bosted: Norge (somewhere)

Re: Tilbakemelding på mailklasse m/vedlegg (PHP)

Innlegg DavidS » 04.06.2009 19:48

Bare meg, eller er det andre som også savner dokumentasjon? :)
Liste over funksjoner med argumenter, eller JavaDoc-syntaks på kommentarer hadde vært koselig, slik det blir lettere å sette seg inn i koden, uten å måtte bearbeide linje for linje.

Tips: Gjør koden din kompatibel med >= PHP 5; ingen som liker PHP4-brukere uansett.
Utvikling: http://davidsteinsland.net | Blogg: http://blog.davidsteinsland.net | Din link her? 100 000 kr/året.
Brukerens avatar
DavidS
Seniormedlem
 
Innlegg: 3294
Registrert: 17.05.2006 17:08
Bosted: Bømlo

Re: Tilbakemelding på mailklasse m/vedlegg (PHP)

Innlegg ZtigO » 05.06.2009 8:48

Beklager at jeg ikke har svart tidligere, vært opptatt.
Jeg takker for kjempebra tilbakemelding og jeg vil rette koden min så fort jeg får tid, for å så spørre om nye tilbakemelding.

Er det noe annet enn "var" i koden som er PHP 4? (henger litt etter på siste nytt her)

På forhånd takk
Nerdvar - Stigma was here
Brukerens avatar
ZtigO
Seniormedlem
 
Innlegg: 1154
Registrert: 06.03.2005 16:01
Bosted: Nydalen, Oslo

Re: Tilbakemelding på mailklasse m/vedlegg (PHP)

Innlegg DavidS » 05.06.2009 11:56

Utvikling: http://davidsteinsland.net | Blogg: http://blog.davidsteinsland.net | Din link her? 100 000 kr/året.
Brukerens avatar
DavidS
Seniormedlem
 
Innlegg: 3294
Registrert: 17.05.2006 17:08
Bosted: Bømlo

Re: Tilbakemelding på mailklasse m/vedlegg (PHP) [2. utkast]

Innlegg ZtigO » 08.06.2009 15:51

Takk for alle svar så langt, nå har jeg retta på koden og er klar for en reevaluering.
Liste over endringer
  • Koden er gjort om til PHP5 syntax. Fjernet var og satt på members
  • Fjernet one-liners
  • Lagt til JavaDocs-kommentarer for hver enkelte metode og selve klassen
  • Byttet ut "ereg*" med "preg_match"
  • Byttet ut "\z" med "$" i RegExp, for å signalisere end of string
  • Har gort om epostvalideringen, bruker nå Helkeepas Val_email() hvor jeg har lagt til serversjekk
  • Gjort antiInjection() til "whitelisting", var "blacklisting"
  • Lagt til flere tvunge valideringer, samt en "protected headers" liste med headerverdier som ikke kan overskrives
  • Rettet på bugs som jeg ikke viste om som har dukket opp under produksjon av den nye versjonen
  • Lagt til de manglende konstantene: "OCTET", "TEXT", "BIT7" (BASE64 var allerede der)
  • Fjernet $sendAction, returnerer nå det direkte resultatet av mail()
  • Flyttet Windows server fixen til bunnen av koden (Ser bedre ut)
  • Fjernet shell-injection-muligheter på linje 360 (tidligere linje 13) ved å validere input

Hellkeepa skrev:Skal bare være én "mail multi part boundary", hvor hver del blir skilt av "--$boundary" og mailen avsluttes med "--$boundary--".

Jeg har bare en $boundary1 og kun en $boundary2, det er vel ikke noe galt med dette? Det er jo slik epostene man sender fra Thunderbird blir satt opp.
Kode: Merk alt
--boundary1<encodingdata>
  --boundary2<data>
    <textversjon>
    <htmlversjon>
  --boundary2--
  <attachments>
--boundary1--


DavidS skrev:Bare meg, eller er det andre som også savner dokumentasjon?
Holder det ikke med de JavaDoc-kommentarene jeg har sått nå? Jeg ønsker ikke å gjøre koden mye større ved å ha dokumentasjonen inni selve koden. Bruk heller dokumentasjonen jeg skrev i første post i denne tråden. Vil også publisere en online-dokumentasjon så fort jeg er fornøyd med klassen.

Har testet klassen mye selv, men alltid fint med hjelp. Det jeg ønsker nå er evt. mer tilbakemelding (flere endringer) og gjerne at noen tar å tester klassen.

På forhånd, takk
Nerdvar - Stigma was here
Brukerens avatar
ZtigO
Seniormedlem
 
Innlegg: 1154
Registrert: 06.03.2005 16:01
Bosted: Nydalen, Oslo

Re: Tilbakemelding på mailklasse m/vedlegg (PHP) [2. utkast]

Innlegg DavidS » 09.06.2009 1:46

Ser ganske bra ut nå!

Men "dokumentasjon" mente jeg egentlig "kommentering av kode", og det har du jo dekket, så da er jeg fornøyd. :)
Ikke noe særlig viktig, men så for meg kommentarer i retningen:
Kode: Merk alt
/**
 * Function information and stuff like that
 *
 * @param string $Argument
 * @param intval|boolean $Integer[false]
 * @return mixed
 */
function information ($Argument, $Integer = false) {
    return (!$Integer) ? $Argument : $Integer;
}
 
(mhm, jeg spiller litt pirke-Knut) :P

Lykke til!
Utvikling: http://davidsteinsland.net | Blogg: http://blog.davidsteinsland.net | Din link her? 100 000 kr/året.
Brukerens avatar
DavidS
Seniormedlem
 
Innlegg: 3294
Registrert: 17.05.2006 17:08
Bosted: Bømlo

Re: Tilbakemelding på mailklasse m/vedlegg (PHP) [2. utkast]

Innlegg ZtigO » 09.06.2009 13:13

Herlig!
Slenger det på når jeg får tid og laster det opp her.
Noen som har prøvd det og funnet bugs? Noe annet som burde endres?

- Takk

EDIT:

Nå har jeg lagt til JavaDocs dokumentasjon til hver enkelte funksjon, slik som DavidS ønsket.
Nå venter jeg 1-2 dager og om jeg ikke har fått noen flere rettelser da, så tar jeg å lanserer den som stabil og versjon 1.

Takk til alle som har bidratt! (spesielt til Hellkeepa og DavidS)
Nerdvar - Stigma was here
Brukerens avatar
ZtigO
Seniormedlem
 
Innlegg: 1154
Registrert: 06.03.2005 16:01
Bosted: Nydalen, Oslo

Re: Tilbakemelding på mailklasse m/vedlegg (PHP) [3. utkast]

Innlegg zeriz » 10.06.2009 0:40

Blir dette OpenSource? Slik at jeg kan endre alt jeg vil i kildekoden? Skal teste dette! Så interessant ut, og kanskje jeg lærer noe mer :)
Studio Wang - Grafisk designer på frilansfot!
Brukerens avatar
zeriz
Medlem
 
Innlegg: 511
Registrert: 20.02.2008 2:40

Re: Tilbakemelding på mailklasse m/vedlegg (PHP) [3. utkast]

Innlegg ZtigO » 10.06.2009 9:19

Som jeg sa i første post: Dere har lov til å bruke den til hva dere vil uten å gi meg creds, men dere har ikke lov til å oppgi koden som egen

Det betyr at den er OpenSource, at dere kan bruke den i alle slags prosjekter og hva en nå dere måtte ønske å benytte den til. Unntaket er at dere ikke har lov til å si at dere skrev den originale klassen (blir litt drøyt å kalle det kjernen) og dere har ikke lov til å selge koden individuelt. Altså dere kan selge systemer som benytter klassen, men å selge selve klassen som et produkt vil jeg forby.

Må også slenge på at ved å bruke koden tar jeg ikke noe ansvar for og gir ingen garanti for andres bruk av koden. Jeg tar ikke på meg noe ansvar og skal ikke bli beskyldt om koden på et mystisk vis skal skape noen form for skade, feilmeldinger eller om den simpelthen ikke virker. Dette sier jeg ikke fordi koden er farlig, men kun for å fraskrive meg alt ansvar.

EDIT:

Siden jeg ikke har mottat noen flere tilbakemeldinger og siden jeg har gjort en god del testing på systemet har jeg nå lansert den som versjon 1.0 og stabil. Vennligst si ifra om bugs o.l. blir oppdaget.

EDIT:

Gjort variablene definert som "private" om til "protected". Dette gjør så man kan extende klassen -> v.1.0.1

EDIT:

Fant en feil i parseMail()-funksjonen, brukte en udefinert variabel og checkdnsrr()-funksjonen feil. Nå rettet opp og fungerer som det skal! -> v.1.0.2
Nerdvar - Stigma was here
Brukerens avatar
ZtigO
Seniormedlem
 
Innlegg: 1154
Registrert: 06.03.2005 16:01
Bosted: Nydalen, Oslo


Gå til Respons

Hvem er i forumet

Brukere som leser i dette forumet: Ingen registrerte brukere og 0 gjester