Email-Benachrichtigung bei neuem Node/Comment verschicken (selbstprogrammiert)
Eingetragen von talueng (48)
am 08.08.2010 - 14:13 Uhr in
am 08.08.2010 - 14:13 Uhr in
Ich möchte (ohne die Notification/Messaging Module zu nutzen) bei einem neuen Node bzw. einem neuen Kommentar automatisch eine Email-Benachrichtigung von Drupal verschicken lassen:
- Node: Wenn ein bestimmtes CCK-Feld "Feature" gesetzt ist, soll eine Benachrichtigung an alle registrierten Benutzer verschickt werden.
- Comment: Es soll eine Email-Benachrichtigung an den Autor des Node sowie an alle Benutzer, die bereits Kommentare hinterlassen haben, verschickt werden.
Fragen:
Welche hooks verwende ich (ich weiss, dass es hook_nodeapi und hook_comment gibt, aber ich komme mit den ganzen "op" nie zurecht)?
Wie verschicke ich die Email aus Drupal am besten?
Was passiert (Performance/Stabilität), wenn ich an ca. 400 registrierte Benutzer eine Benachrichtung verschicke?
- Anmelden oder Registrieren um Kommentare zu schreiben
Das könnte man eigentlich
am 08.08.2010 - 17:50 Uhr
Das könnte man eigentlich sehr bequem über Rules lösen, sowas funktioniert ziemlich gut und ist leicht umzusetzen.
Ansonsten:
Welche hooks verwende ich
Wie bereits erkannt: hook_nodeapi und hook_comment. Als $op muss man eben "insert" oder evtl. "submit" nehmen:
<?php
function mymodule_nodeapi(&$node, $op, $teaser = NULL, $page = NULL)
{
if ($op == 'insert')
{
//hier kommt dein Code für Nodes
}
}
function mymodule_comment(&$a1, $op)
{
if ($op == 'insert')
{
//hier kommt dein Code für Kommentare
}
}
?>
Wie verschicke ich die Email aus Drupal am besten?
Verwende drupal_mail. Allerdings könnte man auch selbst mail() aufrufen oder eine Mailer-Klasse, z.B. PHP-Mailer, einbinden.
Was passiert (Performance/Stabilität), wenn ich an ca. 400 registrierte Benutzer eine Benachrichtung verschicke?
Keine Ahnung, kommt auch drauf an, wie du die Mails verschickst. Wenn du z.B. den Versand selbst in die Hand nimmst (und nicht drupal_mail verwendest), ist die Frage, ob du alle Empfänger in die Empfängerliste packst und dann einmal die eMail mit dieser Empfängerliste sendest oder ob du eine Schleife baust, in der du jeweils einen Empfänger einträgst und dann die Mail nur an diesen einzelnen schickst.
Also einmal Mail an 400 Empfänger senden oder 400 mal die Mail an einen Empfänger senden (was natürlich aufwändiger ist, allerdings finde ich diese Variante besser).
Aber bei 400 Leuten denke ich mal, dass es da noch keine Probleme geben dürfte, weder bei der einen noch bei der anderen Variante.
Empfehlung:
am 08.08.2010 - 18:23 Uhr
Kauf dir dieses Buch (am besten auf Englisch)
Pro Drupal Development
Dann ist alles ganz einfach ...
Sepp
1. Warum denn am besten auf
am 08.08.2010 - 19:00 Uhr
1. Warum denn am besten auf Englisch?
2. Glaubst du nicht auch, dass es ein wenig... oversized ist, sich dieses Buch zu holen, weil man eine Frage bezüglich Mailversand aus Drupal hat?
Das Buch an sich finde ich sehr gut (hab's auf deutsch, wüsste nicht, warum ich das erst übersetzen soll, wenn ich es auch gleich auf deutsch haben kann) aber das Problem kann man sicher auch lösen, ohne knapp 50 Euro auszugeben.
Exterior schrieb 1. Warum
am 08.08.2010 - 20:54 Uhr
1. Warum denn am besten auf Englisch?
Weil man dann auf drupal.org die Kommentare besser versteht (Hat mir zumindest viel gebracht)
.. und (nicht ganz ernst gemeint aber doch) weil es billiger ist (30,95 Euro)
2. Glaubst du nicht auch, dass es ein wenig... oversized ist, sich dieses Buch zu holen, weil man eine Frage bezüglich Mailversand aus Drupal hat?
Weil man nach dem Durcharbeiten des Buches wirklich gut gerüstet ist um das Framework Drupal inklusive Modulentwicklung zu verstehen.
Ich denke, wenn man mal EIN Drupal-Modul schreibt, folgen bestimmt weitere.
Sepp
Mmmh, das mit dem Englisch
am 08.08.2010 - 21:36 Uhr
Mmmh, das mit dem Englisch kann ich nicht ganz nachvollziehen aber gut, jedem das seine ;-)
Klar ist das Buch sehr hilfreich und ich würde es eigentlich allgemein jedem uneingeschränkt empfehlen. Aber für konkret diesen einen Fall (für den ja schon zwei Lösungen geschrieben wurden) ist es meiner Meinung nach unnötig. Denn die Frage bezieht sich ja nur darauf, wie man den Mailversand regelt. In dem Buch stehen schließlich noch ein Haufen anderer Sachen, Theming, Blöcke, Menüsystem usw.
Im blödesten Fall liest er sich das Buch durch (was auch erstmal einen gewisse Zeit erfordert, ist schließlich kein kleines Taschenbuch) und weiß dann immer noch nicht, wie man die Mails am besten versendet, falls dieses im Buch nie so ordentlich vorkommt ;-)
Da ich das Buch nicht habe
am 09.08.2010 - 20:01 Uhr
Da ich das Buch nicht habe (und mir für diese Sache auch nicht zulegen wollte), wäre ich dankbar, wenn jemand das Email-System von D6 erläutern könnte. Ich weiss zwar mittlerweile, wie ich Emails mit drupal_mail_send() versende, allerdings umgeht das direkte Senden mittels dieser Funktion das eigentliche Email-System von D6, das wohl mit drupal_mail() u. a. arbeitet. Habe mir schon die API durchgelesen, aber bin noch nicht wirklich schlauer.
Ebenfalls wäre ich für eine schöne Lösung bzgl. von multi-language Emails dankbar, d. h. je nach eingestellter Benutzersprache soll die Email-Benachrichtigung in seiner Sprache versendet werden.
Am einfachsten gehts mit
am 10.08.2010 - 06:25 Uhr
Am einfachsten gehts mit Rules
C.A.W. Webdesign
Konnte es mittlerweile wie
am 17.08.2010 - 09:54 Uhr
Konnte es mittlerweile wie oben vorgeschlagen mit
drupal_mail_send()
lösen. Dazu habe ich aber folgende Frage:Der Großteil meiner User schreibt Thai und damit nicht-lateinische Buchstaben. In der Email werden die komplett falsch dargestellt. Was mache ich da beim encoding der Emails falsch und wie mache ich es richtig?
John Doe commented on your gallery 'A little photo gallery' on Our Fancy Intranet [TM]:
"àž�àž±à¹�àž�àžªàžŽ àž�àž¹àž�à¹�àž¡à¹�àžàžàž�à¹�àž¥àž¢??"
Setz die Datenbank auf
am 17.08.2010 - 10:11 Uhr
Setz die Datenbank Kodierung
und die Kodierung der Webseiten auf UTF-8
(HTTP Header)
LG
https://awri.ch
Ich habe eine Schweizer Tastatur und daher kein scharfes ß ;-)
Dank Dir für Deine Antwort.
am 18.08.2010 - 13:50 Uhr
Dank Dir für Deine Antwort.
Letztlich lag es doch an einem falschen Email-Encoding. Hier der funktionierende Code (zu beachten ist, dass ich direkt
drupal_mail_send()
benutze und damit quasi das Drupal-Mail-System umgehe, dass mithook_mail()
arbeitet):<?php
$message = array(
'to' => 'mail@example.com',
'subject' => 'Hello World',
'body' => 'Bla bla bla',
'headers' => array(
'From' => 'My Website <noreply@example.com>',
'MIME-Version' => '1.0',
'Content-Type' => 'text/plain; charset=UTF-8',
'Content-Transfer-Encoding' => '8Bit',
'X-Mailer' => 'Drupal'),
);
$success = drupal_mail_send($message);
if (!$success) {
watchdog(
...
);
} else {
...
}
?>
Bitte als "gelöst" markieren
am 18.08.2010 - 18:29 Uhr
Bitte als "gelöst" markieren (dachte eigentlich, dass ich das als Thread-Ersteller selbst könnte).
Kannst du doch auch. Einfach
am 18.08.2010 - 18:40 Uhr
Kannst du doch auch. Einfach ganz oben den ersten Beitrag bearbeiten und "[gelöst]" vor den Titel schreiben.
*lach* :-) Na gut, mir war
am 18.08.2010 - 23:41 Uhr
*lach* :-) Na gut, mir war nicht klar, dass das manuell gemacht wird. Ich dachte eigentlich, da existiert irgendein CCK-Dropdown oder ein Flag, um ein Thema mit dem entsprechendem Label zu versehen.
Anyways, ich lasse es doch noch erstmal so stehen, da sich noch eine Frage ergeben hat:
1) Wie kann ich am besten multi-language Emails versenden, d. h. je nach der Sprache, die ein Benutzer in seinem Profil ausgewählt hat, soll entweder "John Doe hat Deinen Blog kommentiert" bzw. "John Doe commented on your blog" verschickt werden?
2) Kann ich die
t()
-Funktion ineinander schachteln und dabei auch dynamische Strings, d. h. Variablen, in die Funktion packen? Laut API geht das nicht, aber wie kann ich dann folgendes übersetzen:$subject = $user . " commented on your " . $type;
? Dabei ist$type
der Content-Type der Node, also bspw. "blog" oder "gallery". Allerdings soll jetzt ein deutscher Benutzer nicht eine Email "John Doe hat Deine gallery kommentiert" kriegen, sondern eben "John Die hat Dein Photoalbum kommentiert". Insofern müsste ich etwas wie folgt machen, aber das ist laut API nicht erlaubt:<?php
$subject = t("!username commented on your !type", array(
'!username' => $user->name,
'!type' => t($type)
));
?>
Geht das nicht ?
am 19.08.2010 - 13:40 Uhr
<?php
$subject = t("!username commented on your ", array( '!username' => $user->name)) . t($type);
?>
Sepp
Probiers mal damit
am 19.08.2010 - 15:02 Uhr
<?php
$subject = $user->name .t(" commented on your "). t($type)." !";
?>
Gruss
https://awri.ch
Ich habe eine Schweizer Tastatur und daher kein scharfes ß ;-)