Seite 1 von 1

cMailer Problem

Verfasst: Mi 21. Aug 2013, 20:44
von homtata
Hallo Community,

vielleicht stell ich mich ja an wie der letzte Depp, aber ich krieg den cMailer nicht funktionsfähig, nachdem es ja scheinbar den PHPMailer nicht mehr gibt. Dabei sind es ja doch nur ein paar wenige Zeilen Programm. Ich versuchs grad wie folgt, basierend auf einem Codeschnipsel aus der class.password.request.php und den Infos aus der class.mailer.php selbst:

Code: Alles auswählen

cInclude('classes', 'class.mailer.php');

$oMail = new cMailer();
$from = array(
	"info@emailxy.de" => "Kundenname"
);

$to = "info@absender.com";
$subject = "betreff ist immer eine gute sache";
$body = "inhalt kann auch nie schaden, also los damit";
$oMail->sendMail($from, $to, $subject, $body);
Bei mir landen einfach keine Mails... In der Vorgängerversion der gleichen Webseite hat der Versand geklappt, auf Seiten des Hosters gibts also erstmal keine Änderungen oder Einschränkungen.
Was übersehe ich?

Re: cMailer Problem

Verfasst: Do 22. Aug 2013, 12:31
von xmurrix
Hallo homtata,

wenn du SMTP verwenden möchtest, kannst du folgende Systemeinstellungen einrichten:

Code: Alles auswählen

typ       name              wert
--------------------------------------------------------------------------------
system    mail_sender       optional, absender email adresse
system    mail_sender_name  optional, absender name
system    mail_host         smtp mailserver host name
system    mail_user         smtp mailserver benuntzer name
system    mail_pass         smtp mailserver benuntzer passwort
system    mail_encryption   optional. smtp mailserver verschlüsselung (tsl oder ssl),
                            default müsste ssl sein
system    mail_port         optional smtp mailserver port, default ist 25
Zum Versenden von E-Mails wird immer eine Transport-Klassen benötig, gibst du nichts an, wird Swift_SmtpTransport verwendet.

Du kannst auch Swift_SendmailTransport, Swift_MailTransport oder eine andere Transportklase verwenden. Dafür musst du eine Instanz der Transport-Klasse erstellen und diese dem cMailer-Konstruktor übergeben.

Beispiel für Sendmail:

Code: Alles auswählen

cInclude('classes', 'swiftmailer/lib/swift_init.php');

$oTransport = Swift_SendmailTransport::newInstance(); // optional sendmail kommando angeben, z. B. ''/usr/sbin/sendmail -bs''

$oMail = new cMailer($oTransport);
$from = array(
   "info@emailxy.de" => "Kundenname"
);

$to = "info@absender.com";
$subject = "betreff ist immer eine gute sache";
$body = "inhalt kann auch nie schaden, also los damit";
$oMail->sendMail($from, $to, $subject, $body);
Mehr Infos gibt es unter:
http://swiftmailer.org/docs/sending.html

Gruß
xmurrix

Re: cMailer Problem

Verfasst: Do 22. Aug 2013, 15:53
von homtata
ah ja, danke! Ich hätte mir den Aufruf jetzt etwas einfacher vorgestellt.. Da muss ich mich dann wohl mal reinarbeiten in die Klassen und Objekte, weil ich auch den Versand mit Anhängen benötige.

Um erstmal in den Bestandsinstallation nicht zuviel ändern zu müssen, und um bei Updates nichts irrtümlich zu löschen, habe ich die alte class.phpmailer.php nach cms/includes/ verschoben und rufe diese jetzt in den Modulen wie folgt auf:

Code: Alles auswählen

cInclude('frontend', 'includes/class.phpmailer.php');
Damit laufen die alten Dinge erstmal wie bisher, und ich muss nicht zuviel umstellen; das kann ich dann später noch in Ruhe machen mit deinen Infos ,-)

Re: cMailer Problem

Verfasst: Di 27. Aug 2013, 15:29
von homtata
Hallo xmurrix,
jetzt wollte ich ich mal dran probieren, aber es will ums Verrecken nicht, dabei habe ich das Skript jetzt wirklich simpel gehalten. Im Prinzip baue ich nur die Send-Routine des alten Formulars um. Derzeit sieht das so aus:

oben brav eingebunden:

Code: Alles auswählen

cInclude('classes', 'swiftmailer/lib/swift_init.php');
und weiter unten die alte Senderoutine ersetzt durch folgendes, wobei einige Variablen aus dem Inputbereich übernommen werden sollen (und auch gesetzt sind):

Code: Alles auswählen

		$mail_sendermail = "CMS_VALUE[0]";
		$mail_sendername = "CMS_VALUE[2]";
		$mail_recipientmail = "CMS_VALUE[1]";

		$oTransport = Swift_SendmailTransport::newInstance(); // optional sendmail kommando angeben, z. B. ''/usr/sbin/sendmail -bs''
		$oMail = new cMailer($oTransport);
		$from = array( $mail_sendermail => $mail_sendername ); // Mail => Echtname
		$to =  $mail_recipientmail  ;
		$subject = "soso";
		$oMail->sendMail($from, $to, $subject, $mail_body);
Die Anpassung der Instanzierung in

Code: Alles auswählen

$oTransport = Swift_SendmailTransport::newInstance("/usr/sbin/sendmail -bs");
bringt im übrigen auch nix. Hm.

Fülle ich das Formular nicht korrekt aus, gelange ich normal auf die Fehlerseite. Ist alles korrekt, wird das Formular abgeschickt, aber die Originalseite (die mit dem Formular) hängt und hängt und hängt. Die Seite zeigt oben im Tab, dass sie ewig lädt und nie fertig wird. Danach kann ich auf der Seite nichts mehr machen, selbst wenn ich die Seite abbreche. Es sind dann auch keine weiteren Klicks auf der Seite möglich. Ich muss dann erstmal den Frontend-Cookie löschen, bevor ich weitermachen kann!
Hast du noch eine Idee?

Re: cMailer Problem

Verfasst: Do 5. Sep 2013, 13:43
von homtata
Ergänzung:
Nachdem ich dann in "System" das Loggen der Mails eingeschaltet habe, spuckt mir das Errorlog folgende Meldung dazu aus:

-----------------------------------
[05-Sep-2013 14:39:04 Europe/Berlin] PHP Fatal error: Uncaught exception 'Swift_TransportException' with message 'Expected response code 220 but got code "", with message ""' in /is/htdocs/wp10475991_SVMASSCKMF/www/kunde/contenido/classes/swiftmailer/lib/classes/Swift/Transport/AbstractSmtpTransport.php:378
Stack trace:
#0 /is/htdocs/wp10475991_SVMASSCKMF/www/kunde/contenido/classes/swiftmailer/lib/classes/Swift/Transport/AbstractSmtpTransport.php(283): Swift_Transport_AbstractSmtpTransport->_assertResponseCode('', Array)
#1 /is/htdocs/wp10475991_SVMASSCKMF/www/kunde/contenido/classes/swiftmailer/lib/classes/Swift/Transport/AbstractSmtpTransport.php(113): Swift_Transport_AbstractSmtpTransport->_readGreeting()
#2 /is/htdocs/wp10475991_SVMASSCKMF/www/kunde/contenido/classes/swiftmailer/lib/classes/Swift/Transport/SendmailTransport.php(52): Swift_Transport_AbstractSmtpTransport->start()
#3 /is/htdocs/wp10475991_SVMASSCKMF/www/kunde/contenido/classes/swiftmailer/lib/classes/Swift/Mailer.php(76): Swift_Transport_SendmailTranspo in /is/htdocs/wp10475991_SVMASSCKMF/www/kunde/contenido/classes/swiftmailer/lib/classes/Swift/Transport/AbstractSmtpTransport.php on line 378
-------------------------------

Lässt sich daraus was ableiten?

Re: cMailer Problem

Verfasst: Mi 9. Okt 2013, 09:24
von CinKon
Hier das gleiche Problem... ein funktionierendes Beispiel zum cMailer wär mal ganz nett, da in der Klasse ja schon selbst steht

Code: Alles auswählen

 * This file contains the cMail class which should be used for all mail sending
 * purposes.
;)

EDIT:

Danke der SwiftMailer-Doku hab ichs nun doch recht einfach hinbekommen :)
HIer mal eine simple Methode zum senden einer HTML-Mail via mail():

Code: Alles auswählen

		cInclude('classes', 'swiftmailer/lib/swift_init.php');
		
		// Mail
		$transport = Swift_MailTransport::newInstance();
		
		// Create the Mailer using your created Transport
		$mailer = Swift_Mailer::newInstance($transport);
		
		// Create a message
		$message = Swift_Message::newInstance($form_name)
		  ->setFrom(array($mail_from => $mail_from_name))
		  ->setTo(array($mail_to => $mail_to_name))
		  ->setBody($mail_body)
		  ;
		  
		  $headers 	= $message->getHeaders();
		  $type 		= $message->getHeaders()->get('Content-Type');
		  
		  $type->setValue('text/html');
		  $type->setParameter('charset', 'utf-8');
		
		// Send the message
		$result = $mailer->send($message);

Re: cMailer Problem

Verfasst: Mi 9. Okt 2013, 13:42
von xmurrix
Hallo zusammen,

hier ein Beispiel, wie man mit seinem Gmail-Account E-Mails versenden kann.

Unter "Administration -> System -> Sytem-Konfiguration" folgende Einstellungen setzen:
Bild
HINWEIS:
Gmail braucht SSL-Verschlüsselung, den sollte man aber nicht hier mit der Auswahl von "Mailserver Verschlüsselung" setzen, dazu später mehr.


Unter "Administration -> System -> Experteneinstellungen" sehen die Einstellungen wie folgt aus:
Bild
Hier solltet ihr nachträglich folgenden Eintrag machen:

Code: Alles auswählen

Type     Name              Value
system   mail_encryption   ssl
HINWEIS:
Wenn ihr unter "Administration -> System -> Sytem-Konfiguration" die Checkbox "Mailserver Verschlüsselung" anwählt, wird der Wert in "system - mail_encryption" auf 1 gesetzt, was dann nicht funktioniert. Daher diese Einstellung manuell über "Administration -> System -> Experteneinstellungen" vornehmen!


Folgender Code, z. B. in einem Modul, sendet dann eine E-Mail:

Code: Alles auswählen

<?php

cInclude('classes', 'swiftmailer/lib/swift_init.php');

try {

    $oMail = new cMailer();

    $from = "";
    $to = "jane.doe@trash-mail.com";
    $subject = "betreff ist immer eine gute sache";
    $body = "inhalt kann auch nie schaden, also los damit";
    $result = $oMail->sendMail($from, $to, $subject, $body);

    echo '<pre>sendMail() $result: ' . print_r($result, true) . '</pre>';

} catch (Swift_TransportException $e) {

    echo '<pre>Swift_TransportException() $e: ' . print_r($e, true) . '</pre>';

}

?>
Was nicht geht, ist die automatische Erkennung der Methode (SMTP, Sendmail, oder Mail) zum Senden der E-Mail durch die Klasse cMailer. Die cMailer Klasse verwendet per default SMTP, wobei es die Systemeinstellungen von oben ausliest.

Wollt ihr eine andere Methode als SMTP verwenden, so müsst ihr cMailer mit einem entsprechenden Trasport-Objekt initialisieren und die Werte setzen, wie zuvor als Sendmail-Beispiel gezeigt.

Es sollte möglich sein, alle Optionen in die cMailer-Klasse zu verlagen, so dass man nur eine Instanz von cMailer erstellt und cMailer sich darum kümmert, herauszufinden, welche Methode versendet werden soll, z. B. mit einer zusätzlichen Einstellung:

Code: Alles auswählen

Type     Name                  Value
system   mail_transport_type   smtp
Als Wert kann man dann smtp, sendmail oder mail angeben.

Vielleicht kommt diese Erweiterung in die nächste Version von CONTENIDO...

Gruß
xmurrix

Re: cMailer Problem

Verfasst: Mi 9. Okt 2013, 16:58
von dominik.ziegler
Der cMailer sollte eigentlich bei einer nicht vorhandenen SMTP-Server-Konfiguration automatisch auf die PHP mail() - Funktion überspringen.
Wir werden demnächst mal eine Dokumentation für den cMailer in unser Developer Wiki aufnehmen.