Modul erstellt: BCC von Shop-Mails an mich und AGB als PDF mitschicken

Hallo liebe OXID-Gemeinde,

ich habe mir eben ein Modul erstellt, dass folgendes macht:

  1. Alle Mails, die von dem System verschickt werden, gehen auch an mich in BCC.
  2. Die Datei AGB.pdf wird im Anhang mitgeschickt.

Habe dabei ein Problemchen, dass zwar die Funktion nicht beeinträchtigt, aber dennoch komisch ist und mehr Code zur Lösung benötigt. Dazu aber gleich, erstmal zeige ich kurz, wie ich es gemacht habe.

Folgende Datei erstellt: /modules/mail/myemail.php (und auch über Admin aktiviert).


<?php

class myEmail extends oxEmail
{
    protected $bccMailAddress = ">>>Mailadresse<<<";
    
    /* Every Mail BCC to ">>>Mailadresse<<<" */
    public function send()
    {
        // if no recipients found, skipping sending
        if ( count( $this->getRecipient() ) < 1 ) {
            return false;
        }
        
        // BOF BCC to me
        $this->setBcc( $bccMailAddress , 'Shop_BCC' );
        // EOF BCC to me

        $myConfig = $this->getConfig();
        $this->setCharSet();

        if ( $this->_getUseInlineImages() ) {
            $this->_includeImages( $myConfig->getImageDir(), $myConfig->getNoSSLImageDir( isAdmin() ), $myConfig->getDynImageDir(),
                                   $myConfig->getAbsImageDir(), $myConfig->getAbsDynImageDir());
        }

        $this->_makeOutputProcessing();

        // try to send mail via SMTP
        if ( $this->getMailer() == 'smtp' ) {
            $blRet = $this->_sendMail();

            // if sending failed, try to send via mail()
            if ( !$blRet ) {
                $this->setMailer( 'mail' );
                $blRet = $this->_sendMail();
            }
        } else {
            // sending mail via mail()
            $this->setMailer( 'mail' );
            $blRet = $this->_sendMail();
        }

        if ( !$blRet ) {
            // failed sending, giving up, trying to send notification to shop owner
            $this->_sendMailErrorMsg();
        }

        return $blRet;
    }
    
    /* My EDIT: AGB per PDF with the order mail*/
    public function sendOrderEmailToUser( $oOrder, $sSubject = null )
    {
        $myConfig = $this->getConfig();

        // add user defined stuff if there is any
        $oOrder = $this->_addUserInfoOrderEMail( $oOrder );

        //set mail params (from, fromName, smtp)
        $oShop = $this->_getShop();
        $this->_setMailParams( $oShop );

        // P
        // setting some deprecated variables
        $oOrder->oDelSet = $oOrder->getDelSet();

        $oUser = $oOrder->getOrderUser();
        // create messages
        $oSmarty = $this->_getSmarty();
        $oSmarty->assign( "charset", oxLang::getInstance()->translateString("charset"));
        $oSmarty->assign( "order", $oOrder);
        $oSmarty->assign( "shop", $oShop );
        $oSmarty->assign( "oViewConf", $oShop );
        $oSmarty->assign( "oView", $myConfig->getActiveView() );
        $oSmarty->assign( "user", $oUser );
        $oSmarty->assign( "currency", $myConfig->getActShopCurrencyObject() );
        $oSmarty->assign( "basket", $oOrder->getBasket() );
        $oSmarty->assign( "payment", $oOrder->getPayment() );
        if ( $oUser ) {
            $oSmarty->assign( "reviewuserhash", $oUser->getReviewUserHash( $oUser->getId() ) );
        }
        $oSmarty->assign( "paymentinfo", $myConfig->getActiveShop() );

        //deprecated vars
        $oSmarty->assign( "iswishlist", true );
        $oSmarty->assign( "isreview", true );

        if ( $aVoucherList = $oOrder->getVoucherList() ) {
            $oSmarty->assign( "vouchers", $aVoucherList );
        }

        $oOutputProcessor = oxNew( "oxoutput" );
        $aNewSmartyArray = $oOutputProcessor->processViewArray( $oSmarty->get_template_vars(), "oxemail" );

        foreach ( $aNewSmartyArray as $key => $val ) {
            $oSmarty->assign( $key, $val );
        }

        $this->setBody( $oSmarty->fetch( $this->_sOrderUserTemplate ) );
        $this->setAltBody( $oSmarty->fetch( $this->_sOrderUserPlainTemplate ) );

        // #586A
        if ( $sSubject === null ) {
            if ( $oSmarty->template_exists( $this->_sOrderUserSubjectTemplate) ) {
                $sSubject = $oSmarty->fetch( $this->_sOrderUserSubjectTemplate );
            } else {
                $sSubject = $oShop->oxshops__oxordersubject->getRawValue()." (#".$oOrder->oxorder__oxordernr->value.")";
            }
        }

        $this->setSubject( $sSubject );

        $sFullName = $oUser->oxuser__oxfname->getRawValue() . " " . $oUser->oxuser__oxlname->getRawValue();

        $this->setRecipient( $oUser->oxuser__oxusername->value, $sFullName );
        $this->setReplyTo( $oShop->oxshops__oxorderemail->value, $oShop->oxshops__oxname->getRawValue() );
        
        /* BOF My ADD: AGB per PDF */
        $attachment_path=$myConfig->getLanguageDir(false);
        parent::addAttachment( $attachment_path , 'AGB.pdf' );
        /* EOF My ADD */
                                      
        $blSuccess = $this->send();

        return $blSuccess;
    }
    
    public function setBcc( $sEmail = null, $sName = null )
    {
        if ( !oxUtils::getInstance()->isValidEmail( $sEmail ) ) {
            $sEmail = ">>>Mailadresse<<<";
        }

        try {
            parent::AddBCC( $sEmail, $sName );
        } catch( Exception $oEx ) {
        }
    }

}

Alles funzt soweit :smiley: (Für mich besondere Freude, da es das erste Modul ist, dass ich auf die Beine gekriegt habe…)

Was mich aber stutzig macht ist folgendes:
Die Adresse für den BCC-Versand möchte ich der Funktion “setBcc” mit der Variable $bccMailAddress übergeben. Diese ist auch am Anfang der Datei definiert und wird in der Funktion “send” wie folgt übergeben:

$this->setBcc( $bccMailAddress , 'Shop_BCC' );

Wenn ich aber in der Funktion “setBcc” folgende if-Abfrage nicht hätte, wo die Mailadresse explizit übergeben wird, also nicht über die Funktionsvariable $sEmail, bekomme ich in dem Fall, wo die Funktion auf gerufen wird die Standardseite “Shop offline”.


if ( !oxUtils::getInstance()->isValidEmail( $sEmail ) ) {
            $sEmail = ">>>Mailadresse<<<";
        }

Dh. ich schaffe es nicht, die Variable $bccMailAddress irgendwie zu übergeben. Es funktioniert nur, wenn ich in der Funktion “setBcc” die Variable $sEmail nochmal explizit überschreibe…:confused:

Kann einer von Euch einen Fehler erkennen? Würde mich über Tipps freuen… sonst, wenn jemand noch Fragen hat, einfach schreiben…

stark! ich hab aber leider keine programmierkenntnisse und kann dich dabei unterstützen. aber wäre schon klasse wenn das alles hinhaut und so in bestätigungsmails gleich agb und widerruf als pdf im anhang wären. würde das auch in ce 4.2 funktionieren? wo wird das script denn eingefügt?
…weiter so!..

volker

[QUOTE=domino;40695]würde das auch in ce 4.2 funktionieren? wo wird das script denn eingefügt?
…weiter so!..

volker[/QUOTE]

Hi, meinst Du 4.2 oder 4.4.2? Ich arbeite nämlich mit der Version 4.4.2 und es funzt :wink:
Alle Mails werden in BCC (also unsichtbar für den Kunden) auch an mich geschickt und an die Bestellbestätigung wird eine AGB.pdf Datei drangehängt, die in dem Ordner [B]…/out/TEMPLATENAME/de[/B] liegt.

Der Code, den ich im 1. Post eingefügt habe, wird in der Datei [B]…/modules/mail/myemail.php[/B] abgespeichert. Im Adminbereich muss das Modul dann noch aktiviert werden.

Falls Interesse besteht, kann ich die fertigen Dateien in eine ZIP-Datei packen und eine kurze Install-Anweisung erstellen… mache ich gerne, falls es anderen helfen würde :slight_smile:

Glückwunsch zum ersten Modul! Ein paar Anmerkungen dazu:

  • Wenn das Modul kompatibel mit anderen Modulen sein soll, sollte nicht die Klasse direkt erweitert werden, sondern stattdessen “_parent” an den eigenen Klassennamen angehängt werden. Oxid setzt das dann automatisch um in den richtigen Klassennamen, wenn das Modul im Admin registriert wird.

  • Wenn du in der Funktion send() deinen Code an den Anfang setzt, kannst du parent aufrufen anstatt den Code der Funktion zu kopieren. (Bei sendOrderEmailToUser geht das leider nicht, weil der Parent-Aufruf das Attachment rauslöschen würde)

  • $bccMailAddress muss $this->bccMailAddress heißen (daher der Fehler)

<?php

class myEmail extends myEmail_parent
{
    protected $bccMailAddress = ">>>Mailadresse<<<";
    
    /* Every Mail BCC to ">>>Mailadresse<<<" */
    public function send()
    {
        // BOF BCC to me
        $this->setBcc( $this->bccMailAddress , 'Shop_BCC' );
        // EOF BCC to me

        return parent::send();
    }
    
    public function setBcc( $sEmail = null, $sName = null )
    {
        try {
            parent::AddBCC( $sEmail, $sName );
        } catch( Exception $oEx ) {
        }
    }

}

[QUOTE=knackig;40716]Hi, meinst Du 4.2 oder 4.4.2? Ich arbeite nämlich mit der Version 4.4.2 und es funzt :wink:
Alle Mails werden in BCC (also unsichtbar für den Kunden) auch an mich geschickt und an die Bestellbestätigung wird eine AGB.pdf Datei drangehängt, die in dem Ordner [B]…/out/TEMPLATENAME/de[/B] liegt.

Der Code, den ich im 1. Post eingefügt habe, wird in der Datei [B]…/modules/mail/myemail.php[/B] abgespeichert. Im Adminbereich muss das Modul dann noch aktiviert werden.

Falls Interesse besteht, kann ich die fertigen Dateien in eine ZIP-Datei packen und eine kurze Install-Anweisung erstellen… mache ich gerne, falls es anderen helfen würde :)[/QUOTE]

hallo paul,

ich benutze tatsächlich die alte 4.2! aber funzt wenigstens. wenn du das tatsächlich noch als zip. bringst, werde nicht nur ich mich freuen, sondern etliche andere auch. du solltest das sogar in exchange reinbringen. wenn das ding klappt, kriegste von mir ne pressemeldung (hier: pressebox.de) für umme.

volker :smiley:

So… habe eben mal eine ZIP-Datei mit den nötigen Daten erstellt.
Wer es brauchen könnte, kann in der Datei install.html die Anleitung finden.

@leofonic: Ich danke Dir für Deine Tipps. Habe die umgesetzt, jetzt funktioniert das noch besser, bzw. ein Teil des Codes konnte ich mir ganz gut sparen :wink: Danke…

@domino: Danke für die guten Worte :wink: Ich überlege mir noch, das ganze ins Exchange zu bringen. In der Zukunft werden auf jeden Fall weitere Erweiterungen kommen, da mir ein paar Sachen in dem System noch fehlen.

Die Datei kann unter http://download.gaida-online.eu/oxemail-extension.zip heruntergeladen werden.

Alle Feedback’s gerne gesehen :smiley:

Hallo Paul,

Glückwunsch und vielen Dank! :slight_smile:

@domino: Danke für die guten Worte Ich überlege mir noch, das ganze ins Exchange zu bringen. In der Zukunft werden auf jeden Fall weitere Erweiterungen kommen, da mir ein paar Sachen in dem System noch fehlen.

Der eXchange ist eine schicke Sache, hat jedoch noch einen kleinen Haken: Vom Entwickler wird erwartet, dass er sich selbst um die Maintenance (Anpassung der Module, wenn irgendetwas in einer neuen Version geändert werden muss) kümmert.
Vielleicht ist es sinnvoll, wenn Du Erweiterungen zusätzlich in die projects.oxidforge.org einstellst? Dort kann z.B. gemeinsam in einem SVN entwickelt werden, es wird automatisch eine eigene Mailingliste usw. Leider kann ich noch nicht mit einem automatisierten Abgleich von projects zu eXchange aufwarten… :frowning:

Gruß

[QUOTE=Marco Steinhaeuser;40766]Hallo Paul,

Glückwunsch und vielen Dank! :slight_smile:

Der eXchange ist eine schicke Sache, hat jedoch noch einen kleinen Haken: Vom Entwickler wird erwartet, dass er sich selbst um die Maintenance (Anpassung der Module, wenn irgendetwas in einer neuen Version geändert werden muss) kümmert.
Vielleicht ist es sinnvoll, wenn Du Erweiterungen zusätzlich in die projects.oxidforge.org einstellst? Dort kann z.B. gemeinsam in einem SVN entwickelt werden, es wird automatisch eine eigene Mailingliste usw. Leider kann ich noch nicht mit einem automatisierten Abgleich von projects zu eXchange aufwarten… :frowning:

Gruß[/QUOTE]

Ich danke Dir für den Tipp :wink: Werde dann wohl auf “projects” ausweichen…

Gruß und schönen Sonntagnachmittag allen…

Nur mal so als Frage… Falls du einen Newsletter verschickst, erhälst du dann auch bspw. 100 Mails bei 100 Kunden?

[QUOTE=kobra;41679]Nur mal so als Frage… Falls du einen Newsletter verschickst, erhälst du dann auch bspw. 100 Mails bei 100 Kunden?[/QUOTE]

Hab es gerade mal mit meinen 2 Testaccounts getestet. Jep, so ist es… Die Mails kann man erstmal wieder löschen, darin sehe ich noch kein großes Problem.

Wenn ich aber Zeit finde, könnte ich es mal anpassen, dass es vllt. beim Newsletter nicht gemacht wird. Wird voraussichtlich aber nicht in den nächsten 2-3 Wochen passieren, da ich die Zeit meiner Abschlussarbeit widmen muss…

[QUOTE=knackig;41680]Hab es gerade mal mit meinen 2 Testaccounts getestet. Jep, so ist es… Die Mails kann man erstmal wieder löschen, darin sehe ich noch kein großes Problem.[/QUOTE]

Das mit den Newsletter-Mails könnte man z. B. so lösen:


<?php

class myEmail extends myEmail_parent
{
    protected $bccMailAddress = ">>>Mailadresse<<<";

    protected $_blMyNewsletter = false;

    public function sendNewsletterMail( $oNewsLetter, $oUser, $sSubject = null )
    {
          $this->_blMyNewsletter = true;
          $sRet = parent::sendNewsletterMail( $oNewsLetter, $oUser, $sSubject );

          return $sRet;
    }
    
    /* Every Mail BCC to ">>>Mailadresse<<<" */
    public function send()
    {
        // BOF BCC to me
        if($this->_blMyNewsletter) {
              $this->setBcc( $this->bccMailAddress , 'Shop_BCC' );
        }
        // EOF BCC to me

        return parent::send();
    }
    
    public function setBcc( $sEmail = null, $sName = null )
    {
        try {
            parent::AddBCC( $sEmail, $sName );
        } catch( Exception $oEx ) {
        }
    }

} 

(nicht getestet)

mfg
urban

[QUOTE=knackig;40764]So… habe eben mal eine ZIP-Datei mit den nötigen Daten erstellt.
Wer es brauchen könnte, kann in der Datei install.html die Anleitung finden.

@leofonic: Ich danke Dir für Deine Tipps. Habe die umgesetzt, jetzt funktioniert das noch besser, bzw. ein Teil des Codes konnte ich mir ganz gut sparen :wink: Danke…

@domino: Danke für die guten Worte :wink: Ich überlege mir noch, das ganze ins Exchange zu bringen. In der Zukunft werden auf jeden Fall weitere Erweiterungen kommen, da mir ein paar Sachen in dem System noch fehlen.

Die Datei kann unter http://download.gaida-online.eu/oxemail-extension.zip heruntergeladen werden.

Alle Feedback’s gerne gesehen :D[/QUOTE]

Hallo,
kann mir bitte jemand sagen ob das jetzt mit den Dateien in der Zip funktioniert,denn ich bring es leider nicht zum laufen, Version 4.3.0_26948
Danke vorab
Alois

[QUOTE=Mosbueffel;44974]Hallo,
kann mir bitte jemand sagen ob das jetzt mit den Dateien in der Zip funktioniert,denn ich bring es leider nicht zum laufen, Version 4.3.0_26948
Danke vorab
Alois[/QUOTE]

paul sitzt davor… nach abschlußprüfungsfeier. :wink:
funzt z.zt. bei 4.4.2

volker

Hallo zusammen,
habe da modul installiert, funzt auch soweit, aber jetzt habe ich auf einmal das problem, dass im ganzen shop keine preise mehr angegeben werden.auch nicht im Warenkorb und bei absenden der Bestellung
Hat jemand eine Lösung des Pronblems?

Hallo,

hat das schon jemand mit der Shop - Version 4.4.5 ausprobiert?

Bei mir kommt immer die Fehlermeldung nach Einspielung der Zip Datei:
eMail problem in shop!
Error : SMTP Error: Data not accepted.<p>SMTP server error: Relaying not allowed - sender domain not local

Hat sich erledigt. Das Problem habe ich dadurch gelöst, in dem ich für die bcc - Emails die gleiche Adresse genommen habe, wie für die Bestellemails. Jetzt kommen auch keine Fehlermeldungen mehr.

[QUOTE=matthias233;51243]Hallo,

hat das schon jemand mit der Shop - Version 4.4.5 ausprobiert?

Bei mir kommt immer die Fehlermeldung nach Einspielung der Zip Datei:
eMail problem in shop!
Error : SMTP Error: Data not accepted.<p>SMTP server error: Relaying not allowed - sender domain not local[/QUOTE]

Hat sich erledigt. Das Problem habe ich dadurch gelöst, in dem ich für die bcc - Emails die gleiche Adresse genommen habe, wie für die Bestellemails. Jetzt kommen auch keine Fehlermeldungen mehr.

Hallo ich möchte dieses Thema noch einmal aufgreifen. Ich benutze die Version 4.5.5 und habe das Modul eingebaut. Leider habe ich das Problem das nach dem Absenden die Mail auf dem Bildschirm erscheint und nicht zur Bestellbestättigung weitergeleitet wird. Hat jemand eine Idee da ich das Modul auf jedenfall super finde. Oder gibt es für die 4.5 einen anderen Ansatz???

Gruß Patrick

Hallo Patrick,
teste doch bitte mal urbans tip
http://www.oxid-esales.com/forum/showthread.php?t=6925#post41780
und mit Änderung von

 
        // BOF BCC to me
        if(!$this->_blMyNewsletter) {

sollte es in der 4.5.x so funktionieren, dass bei Bestellungen eine bc gesendet wird und beim Newsletterversand dann natürlich keine bc.

Hallo Seelauer ich habe es jetzt schon verschieden versucht anzupassen aber bekomme immer fehlermeldungen beim ende der Bestellung. php fehler line 29 oder 116 usw.

Hier mal mein geänderter code wo ich nicht genau weiss was ich anpassen sollte.

<?php

class myEmail extends myEmail_parent
{
    protected $bccMailAddress = ">>>[email protected]<<<";

    protected $_blMyNewsletter = false;

    public function sendNewsletterMail( $oNewsLetter, $oUser, $sSubject = null )
    {
          $this->_blMyNewsletter = true;
          $sRet = parent::sendNewsletterMail( $oNewsLetter, $oUser, $sSubject );

          return $sRet;
    }
    
    /* Every Mail BCC to ">>>Mailadresse<<<" */
    public function send()
    {
        // BOF BCC to me
        if($this->_blMyNewsletter) {
              $this->setBcc( $this->bccMailAddress , 'Shop_BCC' );
        }
        // EOF BCC to me

        return parent::send();
    }
    
    public function setBcc( $sEmail = null, $sName = null )
    {
        try {
            parent::AddBCC( $sEmail, $sName );
        } catch( Exception $oEx ) {
        }
    }

    
    /* My EDIT: AGB per PDF with the order mail*/
    public function sendOrderEmailToUser( $oOrder, $sSubject = null )
    {
        $myConfig = $this->getConfig();

        // add user defined stuff if there is any
        $oOrder = $this->_addUserInfoOrderEMail( $oOrder );

        //set mail params (from, fromName, smtp)
        $oShop = $this->_getShop();
        $this->_setMailParams( $oShop );

        // P
        // setting some deprecated variables
        $oOrder->oDelSet = $oOrder->getDelSet();

        $oUser = $oOrder->getOrderUser();
        // create messages
        $oSmarty = $this->_getSmarty();
        $oSmarty->assign( "charset", oxLang::getInstance()->translateString("charset"));
        $oSmarty->assign( "order", $oOrder);
        $oSmarty->assign( "shop", $oShop );
        $oSmarty->assign( "oViewConf", $oShop );
        $oSmarty->assign( "oView", $myConfig->getActiveView() );
        $oSmarty->assign( "user", $oUser );
        $oSmarty->assign( "currency", $myConfig->getActShopCurrencyObject() );
        $oSmarty->assign( "basket", $oOrder->getBasket() );
        $oSmarty->assign( "payment", $oOrder->getPayment() );
        if ( $oUser ) {
            $oSmarty->assign( "reviewuserhash", $oUser->getReviewUserHash( $oUser->getId() ) );
        }
        $oSmarty->assign( "paymentinfo", $myConfig->getActiveShop() );

        //deprecated vars
        $oSmarty->assign( "iswishlist", true );
        $oSmarty->assign( "isreview", true );

        if ( $aVoucherList = $oOrder->getVoucherList() ) {
            $oSmarty->assign( "vouchers", $aVoucherList );
        }

        $oOutputProcessor = oxNew( "oxoutput" );
        $aNewSmartyArray = $oOutputProcessor->processViewArray( $oSmarty->get_template_vars(), "oxemail" );

        foreach ( $aNewSmartyArray as $key => $val ) {
            $oSmarty->assign( $key, $val );
        }

        $this->setBody( $oSmarty->fetch( $this->_sOrderUserTemplate ) );
        $this->setAltBody( $oSmarty->fetch( $this->_sOrderUserPlainTemplate ) );

        // #586A
        if ( $sSubject === null ) {
            if ( $oSmarty->template_exists( $this->_sOrderUserSubjectTemplate) ) {
                $sSubject = $oSmarty->fetch( $this->_sOrderUserSubjectTemplate );
            } else {
                $sSubject = $oShop->oxshops__oxordersubject->getRawValue()." (#".$oOrder->oxorder__oxordernr->value.")";
            }
        }

        $this->setSubject( $sSubject );

        $sFullName = $oUser->oxuser__oxfname->getRawValue() . " " . $oUser->oxuser__oxlname->getRawValue();

        $this->setRecipient( $oUser->oxuser__oxusername->value, $sFullName );
        $this->setReplyTo( $oShop->oxshops__oxorderemail->value, $oShop->oxshops__oxname->getRawValue() );
        
        /* BOF My ADD: AGB per PDF */
        $attachment_path=$myConfig->getLanguageDir(false);
        parent::addAttachment( $attachment_path , 'AGB.pdf' );
        //parent::addAttachment( $attachment_path , 'FILENAME' );
        /* EOF My ADD */
                                      
        $blSuccess = $this->send();

        return $blSuccess;
    }
    
    public function setBcc( $sEmail = null, $sName = null )
    {
        try {
            parent::AddBCC( $sEmail, $sName );
        } catch( Exception $oEx ) {
        }
    }

}