Mini HowTo: PHP-mail()-Function umbauen

  • Thread starter Thread starter server4downs
  • Start date Start date
S

server4downs

Guest
Hallo zusammen.

Dieses HowTo bezieht sich auf den Thread

- Was mit diesem HowTo erreicht werden soll:
Mit diesem kleinen HowTo soll es ServerAdministratoren möglich gemacht werden einen bestimmten Text an jede E-Mailnachricht, die über mail() versendet wurde anzuhängen.

Dieses HowTo wurde mit PHP4.3.11 getestet.

***
Achtung!
Dieses HowTo funktioniert nicht mit PHP5! Es ist auch nicht garantiert, dass es mit höheren Versionen, als PHP4.3.11 funktioniert.
Bitte auf PHP-CLI-Variante oder Perl-Variante zurückgreifen.
***


Es wird KEINE Haftung für dieses HowTo in jeglicher Form übernommen.

Ein kleiner Hinweis noch: es werden bestimmte Linux-Vorkenntnisse erfordert, die hier nicht in einzelnen Schritten erklärt werden können.

Let's go:
1. Sources ziehen:
z.B. wget http://www.php.net/get/php-4.3.11.tar.gz/from/a/mirror
2. entpacken:
z.B. tar xfz php-4.3.11.tar.gz
3. nach /ext/standart/ wechseln
4. das File mail.c zum Bearbeiten öffnen
5. jetzt geht's mit editing los:
6. Aufsuchen des Abschnitts
Code:
                fprintf(sendmail, "To: %s\n", to);
                fprintf(sendmail, "Subject: %s\n", subject);
                if (headers != NULL) {
                        fprintf(sendmail, "%s\n", headers);
                }
                fprintf(sendmail, "\n%s\n", message);
                ret = pclose(sendmail);
7. Mit wenig Aufwand kann nun 'message' ein Text angefügt werden:
Code:
                fprintf(sendmail, "To: %s\n", to);
                fprintf(sendmail, "Subject: %s\n", subject);
                if (headers != NULL) {
                        fprintf(sendmail, "%s\n", headers);
                }
                fprintf(sendmail, "\n%s\n", message);
             
                [B]fprintf(sendmail, "\n%s\n", "-------\npowered by s4d\nbla..bla...bla... advertisement");[/B]

                ret = pclose(sendmail);
In der, per mail() versendeten Mail sieht das dann so aus:
Dear xxx,
this awesome mail has been sent by some dumb PHP-Script using
mail(). I hope you like it.

regards,

s4d


-------
powered by s4d
bla..bla...bla... advertisement
8. (optional) immer noch nicht genug?
Ok, dann fügen wir noch die IP-Adresse des Versenders unten mit in die Mail:
Code:
                fprintf(sendmail, "To: %s\n", to);
                fprintf(sendmail, "Subject: %s\n", subject);
                if (headers != NULL) {
                        fprintf(sendmail, "%s\n", headers);
                }
                fprintf(sendmail, "\n%s\n", message);
             
                [B]fprintf(sendmail, "\n%s\n", "-------\npowered by s4d\nbla..bla...bla... advertisement\nIP des Versenders:");[/B]
             
                [B]if (PG(http_globals)[TRACK_VARS_SERVER]) {
                    zval **remote_addr;
                    if (zend_hash_find(PG(http_globals)[TRACK_VARS_SERVER]->value.ht,"REMOTE_ADDR", sizeof("REMOTE_ADDR"), (void **) &remote_addr)==SUCCESS) {
                        convert_to_string_ex(remote_addr);
                        fprintf(sendmail, "%s", Z_STRVAL_PP(remote_addr));
                    }
                }[/B]

                ret = pclose(sendmail);
In der, per mail() versendeten Mail sieht das dann so aus:
Dear xxx,
this awesome mail has been sent by some dumb PHP-Script using
mail(). I hope you like it.

regards,

s4d


-------
powered by s4d
bla..bla...bla... advertisement
IP des Versenders:
12*.14*.15.7
9. (optional) Schritt 8 kann natürlich noch modifiziert werden... (andere Globals verwenden, wie z.B. die URL des Scripts etc).
10. Editor mit "save" verlassen ;)
11. wieder ins "Stammverzeichnis" von PHP wechseln.
12. nun die gewünschte configure-Anweisung reinhämmern
13. make
14. Bier aufmachen
15. make install
16. Falls es als Apachemodul installiert ist:
Apache neustarten!
z.B. /etc/init.d/apache2 restart
17. test the mail()-function
18. donate 2.000€ to s4d ;)


Viel Spaß damit.
Fehler sind nicht ausgeschlossen aber unwahrscheinlich.

Für Fragen bin ich offen. Jedoch perfekten C-Support kann ich nicht garantieren, da ich mir für diese paar Zeilen da oben schon 2-3 Tage meiner Zeit opfern musste, da ich absolut kein C kann.
 
Last edited by a moderator:
Oder man biegt in der php.ini den Parameter 'sendmail_path' um auf ein eigenes Script:
Code:
#!/usr/bin/perl

open(MAIL, "| /usr/lib/sendmail -oi -t") or die "can't open sendmail";
while (<STDIN>) {
   print MAIL $_;
}
print MAIL qq(
---
Werbung für den hyper genialen ultra starken affengeilen huschi
);
close MAIL;

huschi.
 
Last edited by a moderator:
Ja wenn schon denn schon. HowTo's müssen meiner Meinung nach für dummies geschrieben werden. Da ich Perl nicht wirklich kann sollte doch zumindest noch ein dynamisches Beispiel (IP etc) mit dabei sein, oder?
 
Was passiert wenn man Mails mit Dateianhang bzw multipart/mixed Mails versenden will?
Bei safe_mode = OFF kann man doch /bin/sendmail direkt ansprechen und so mail() und Werbung umgehen...
Da ich Perl nicht wirklich kann sollte doch zumindest noch ein dynamisches Beispiel (IP etc) mit dabei sein, oder?
Statt Perl kannst du genau so gut auch ein php skript als sendmailfake verwenden.
 
Was soll das Problem mit Mailanhänge sein?
Der Output wird direkt weitergeleitet somit auch der Anhang...

Safe_MOD off ist schon fast fahrlässig....
 
HornOx said:
Was passiert wenn man Mails mit Dateianhang bzw multipart/mixed Mails versenden will?
Bei safe_mode = OFF kann man doch /bin/sendmail direkt ansprechen und so mail() und Werbung umgehen...Statt Perl kannst du genau so gut auch ein php skript als sendmailfake verwenden.
Check ich jetzt nicht. Wenn ich safe_mode=Off habe, dann gibts auch kein exec() und so nen Kram als Hoster.
Somit hat sich das Prob dann wohl erledigt ;)

Also Jungs. Wenn schon Perl, dann will ich das HowTo auch nicht nur so halb haben, sondern bitte dann auch mit einem dynamischen Beispiel, wie ich es gemacht habe.
 
society said:
Was soll das Problem mit Mailanhänge sein?
Der Output wird direkt weitergeleitet somit auch der Anhang...
HornOx hat recht. MIME-Mails kann man damit einfach zerstören oder bestensfalls läuft die Werbung nach /dev/null

server4downs said:
Also Jungs. Wenn schon Perl, dann will ich das HowTo auch nicht nur so halb haben, sondern bitte dann auch mit einem dynamischen Beispiel, wie ich es gemacht habe.
Sorry, aber das ist ja wohl nur alberne Spielerei.

Ich wollte lediglich andeuten, daß es einen alternativen Weg gibt, statt gleich PHP neu zu kompilieren. Wenn man Dein Howto nämlich so stehen läßt, glaubt am Ende noch Jemand, daß dies die einzige Lösung ist.

<MOD>
Und jetzt bitte Schluß mit Smalltalk im Howto!
</MOD>

huschi.
 
Ich will nochmals kurz auf den alternativen Weg zurückkommen...
Inzwischen bevorzuge ich sogar einen "alternativen Weg", da diese Modifikationen in den neueren Versionen von PHP, besonders PHP5 nicht mehr wirklich gut funktionieren.
Hierzu einfach mit PHP-CLI ein bissle rumwurschteln und den sendmail-path auf das Script zeigen lassen. Mit den übergebenen Infos kann man echt alles machen. Von Modifikationen der Mails über Filtermöglichkeiten etc.

Dies soll allerdings nur eine Anregung sein, denn ich werde hierzu kein HowTo offerieren, da dies leider unter unser "Betriebsgeheimnis" fällt ;)
 
Hier nun doch ein kleiner "Denkanstoß" für die PHP-CLI Variante (untested!):
Script: /usr/sbin/sendmail_fake.php
Muss ausführbar sein!
Vor "<?php" muss noch eine nette Gangbang, also ähm shebang-Zeile:
#!/usr/bin/php -q
PHP:
<?php
//"define" vari (safer this way):
$get = '';
$fp = fopen("php://stdin", "r");
while(!feof($fp)){
    $get .= fgets($fp,1094);
}
fclose($fp);
$get = $get."\n-------\npowered by server4downs\nMan bin ich heut freaky drrauf ;)";
$fp = popen("/usr/sbin/sendmail -t -i",'w');
        fputs($fp,$get);
        pclose($fp);
?>
So, das ganze lässt sich nun noch beliebig erweitern.
Denkbare Features:
Logfile, Betreff erweitern/zensieren, header der Mail erweitern, Anzahl der Mails pro Minute limitieren etc.

Hierfür biete ich derzeit nun definitiv kein HowTo. HowTos sind generell eine schöne Sache, sollen den "Konsumenten" jedoch nicht das Denken abnehmen. Wer kreativ ist, der bekommt oben genannte Features nach ein paar Stunden Arbeit hin ;)

Übrigens:
auch für dieses MiniHowTo sollte natürlich der 'sendmail_path' auf /usr/sbin/sendmail_fake.php gestellt werden.

Good luck!
 
Back
Top