• Jeder User im Forum verpflichtet sich zur Akzeptanz und zur Einhaltung dieser Regeln:
    1. Umgangston
      Ein angemessener höflicher Umgangston, ohne Beleidigungen, Beschimpfungen und aggressive Postings ist für jedes Mitglied Pflicht.
    2. Beiträge
      Jedes Mitglied sollte sich bemühen nur sinnvolle Beiträge zum Thema zu posten. Dabei ist unbedingt vorher zu prüfen, ob das Thema vorher schon einmal diskutiert wurde und daher fortgesetzt werden kann
      • Suchfunktion benutzen!
      • offizielle Doku lesen!
    3. Haftung
      Jeder Beitragsersteller übernimmt die alleinige Verantwortung seiner Inhalte.
    4. Werbung
      Wir erlauben keine Beiträge, Signaturen, Private Nachrichten oder eMails an Benutzer, die Werbung enthalten. Ausgenommen
      sind Stellengesuche /-angebote, welche ausschließlich im Forum "Stellengesuche" veröffentlicht werden dürfen.
    5. Verstöße
      Regelwidrige Beiträge sollten dem Team gemeldet werden. Nach deren Überprüfung werden wir schnellstmöglich
      entsprechend handeln.
    6. Authorität
      Den Anweisungen der Team-Mitglieder (Administratoren und Moderatoren) sind in diesem Forum Folge zu leisten.
      Bei Fragen oder Beschwerden bitte an diese wenden.
    Wir möchten Euch darauf aufmerksam machen, dass es bei Verstößen gegen einen oder mehreren der oben genannten
    Punkte dem Team frei steht entsprechend zu handeln. Dies kann z.B. das Löschen eines Beitrags, das Ausschliessen bzw.
    Sperren von Mitgliedern oder aber lediglich eine Verwarnung sein.

    In diesem Zusammenhang sollte erwähnt werden, dass das Forum automatisch die IP-Adresse jedes Beitrag-Erstellers
    speichert. Bei schweren Vergehen, behalten wir es uns vor, die IP-Adresse zur Strafverfolgung weiterzugeben.
  • Willkommen im Zend Framework Forum

    ZF1 Zend Framework 1 + ZF2 Zend Framework 2

    Das Zend Framework Forum ist seit 2006 die erste Anlaufstelle für Zend Framework Entwickler in Deutschland. Mit über 70.000 Beiträgen und einer steigenden Nutzerzahl bietet das Forum hilfreiche Themen und ZF-Tutorials für professionelle Entwickler, fortgeschrittene Programmierer sowie Zend Framework Einsteiger.
    Wenn dies Dein erster Besuch in der Zend Framework Community ist, lies bitte zuerst die Hilfe - FAQ durch. Du musst Dich registrieren, bevor Du Beiträge verfassen kannst. Klicke oben auf 'Registrieren', um die Registrierung zu starten. Du kannst auch jetzt schon Beiträge lesen. Hier im Forum findest Du die Zend Framework Hilfe, die Du suchst!

    Grüße an alle Zend Framework Entwickler. Das Team vom Zend Framework Forum!

    Drupal Agentur

E-Mail signieren

hacki

New member
Hallo zusammen,

ich versuche gerade eine E-Mail zu signieren. Das signieren funktioniert soweit auch einwandfrei, allerdings bin ich gerade ziemlich ratlos wie ich die Daten via Zend_Mail versenden soll.

Ich bekomme vom Signieren ein Array mit folgenden Daten aus einem print_r() zurück:

Code:
Array (     
[0] => From: noreply@example.com X-GUPMailer: Mein Mailer MIME-Version: 1.0 Content-Type: multipart/signed;  protocol="application/x-pkcs7-signature"; micalg=sha1;  boundary="----...FCEDA628"     

[1] => This is an S/MIME signed message  ------...FCEDA628 Dies ist einfach mal so eine Testmail. ------BBCF2E86DF9D970E358799A7FCEDA628 Content-Type: application/x-pkcs7-signature; name="smime.p7s" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="smime.p7s"  MIIHFwYJKoZIhvcNAQcCoIIHCDCCBwQCAQ...dp7nCMtr7K0tCRVA==  ------...FCEDA628--   )
Wenn ich die E-Mail per normaler PHP-mail Funktion versende, funktioniert das wie folgt:

PHP:
mail('empfaenger@example.com', 'Ein Betreff', $parts[1], $parts[0]);
Das funktioniert soweit auch. Jetzt die Frage: Wie verpacke ich die Daten am besten in Zend_Mail. Setzen von to, from, usw. ist klar.

Ich habe bereits versucht einen zusätzlichen Header zu setzen, aber leider auch das hilft nicht.

PHP:
$mailer->addHeader('Content-Type', 'multipart/signed; protocol="application/x-pkcs7-signature"; micalg=sha1');
Auch dies bewirkt leider nichts. Wäre echt super wenn mir einer sagen kann, wie ich das am besten gelöst bekomme. Auch für Anregungen oder ähnliches wie ich das Problem behoben bekomme wäre ich schon sehr dankbar.

Vielen Dank schon mal.

Viele Grüße

Hacki
 

Meisii

New member
Mir ist nicht ganz klar, was jetzt nicht funktioniert. Zeige mal bitte den gesamten Code wo du die Mail erstellst, wo du sie versuchst abzuschicken und wo das Problem auftritt.
 

hacki

New member
ok dann erkläre ich mal was ich genau mache:

Ich habe eine eigene Mailklasse erstellt, die von Zend_Mail ableitet:
PHP:
<?php

/**
 * Diese Klasse stellt die Mailfunktion zur Verfügung und bietet 
 * außerdem noch die Möglichkeit zur Verschlüsselung.
 */
class Myexample_Mail extends Zend_Mail {

    /**
     * Speichert den Pfad zum Zertifikat.
     * 
     * @var string
     */
    private $_certificateFilePath;

    /**
     * Speichert den Pfad zum Key.
     * 
     * @var string
     */
    private $_keyFilePath;

    /**
     * Der Schlüssel für das Zertifikat.
     * 
     * @var string
     */
    private $_passphrase;

    /**
     * Die Bcc Empfänger-E-Mailadresse.
     * 
     * @var string
     */
    private $_bcc;

    /**
     * Die Cc Empfänger-E-Mailadresse.
     * 
     * @var string
     */
    private $_cc;

    /**
     * Der XGUPMailer.
     * 
     * @var string
     */
    private $_xGupMailer;

    /**
     * Die Transportconfiguration.
     * 
     * @var Zend_Config_Xml
     */
    private $_transportConfig;

    /**
     * Diese Funktion setzt Pfadangaben zum Zertifikat und Schlüssel
     * die Benötigt werden um eine E-Mail zu signieren. Werden die 
     * Pfadangaben gesetzt, wird bei dem Aufruf der send() Funktion
     * versucht die E-Mail zu signieren. 
     *  
     * @param string $pathToCertificate Der Pfad zum Zertifikat
     * @param string $pathToKey         Der Pfad zum Key
     * @param string $passphrase        Das Passwort für das Zertifikat
     * 
     * @return void
     */
    public function setMailCertifyData ($pathToCertificate, $pathToKey, $passphrase) {
        $this->_certificateFilePath = $pathToCertificate;
        $this->_keyFilePath = $pathToKey;
        $this->_passphrase = $passphrase;
    }

    /**
     * Diese Funktion sendet die E-Mail. Wurde zuvor die Funktion setMailMarking 
     * aufgerufen wird in dieser Funktion die E-Mail signiert. 
     * 
     * @param  Zend_Mail_Transport_Abstract $transport Das Transport-Objekt
     * 
     * @return Zend_Mail
     */
    public function send ($transport = null) {
        // Wenn kein E-Mailabsender gestezt ist
        if (empty($this->_from)) {
            // LIVE bzw DEV Umgebungsabsender setzen
            if (APPLICATION_ENV != 'LIVE') {
                parent::setFrom('dev_noreply@example.com', 'Test');
            } else {
                parent::setFrom('noreply@example.com', 'test');
            }
        }
        
        // Wenn ein Zertifilatspfad, Keypfad und Passphrase gesetzt ist dann signierter Mailversand
        if (isset($this->_certificateFilePath) || ! isset($this->_keyFilePath)) {
            $signedMailContent = $this->_certifyEmail();
            
            // WIE MUSS DIE SIGNIERTE EMAIL HIER VERPACKT WERDEN???
            $this->setBodyText($signedMailContent[1], 'UTF-8')
            return parent::send($transport);
        }
        
        // E-Mail normal versenden
        return parent::send($transport);
    }

    /**
     * Diese Funktion setzt den XGUPMailer.
     * 
     * @param string $xGupMailer Der XGUPMailer
     */
    public function setXGupMailer ($xGupMailer) {
        $this->_xGupMailer = $xGupMailer;
    }

    /**
     * Diese Funktion signiert die E-Mail bzw. deren Body.
     * 
     * @return void
     */
    private function _certifyEmail () {
        $messageFile = '/tmp/msg.txt';
        $signedMessageFile = '/tmp/signed.txt';
        
        // E-Mailbody in Datei schreiben
        $fp = fopen($messageFile, "w+");
        if ($this->_bodyHtml) {
            $body = $this->_bodyHtml->getContent();
        } else {
            $body = $this->_bodyText->getContent();
        }
        fwrite($fp, $body);
        fclose($fp);
        
        // prüfen ob benötigte Headerparameter gesetzt wurden 
        if (! isset($this->_from) || empty($this->_from)) {
            throw new Exception('Die Absender E-Mailadresse für den Header wurde nicht gesetzt.');
        }
        if (! isset($this->_xGupMailer) || empty($this->_xGupMailer)) {
            throw new Exception('Der xGUPMailer für den Header wurde nicht gesetzt.');
        }
        
        // erforderliche Mailheader setzen
        $mailSenderHeader = array(
            'From' => $this->_from, 
            'X-GUPMailer' => $this->_xGupMailer);
        
        // zusätzliche Mailheader zum Signieren setzten wenn vorhanden
        if (isset($this->_cc) && ! empty($this->_cc)) {
            $mailSenderHeader['Cc'] = $this->_cc;
        }
        if (isset($this->_bcc) && ! empty($this->_bcc)) {
            $mailSenderHeader['Bcc'] = $this->_bcc;
        }
        if (isset($this->_returnPath) && ! empty($this->_returnPath)) {
            $mailSenderHeader['Return-Path'] = $this->_returnPath;
        }
        
        // wenn Privatekey ok
        if (openssl_pkey_get_private(array(
            'file://' . $this->_keyFilePath, 
            $this->_passphrase))) {
            
            // wenn Zertifikat ok und messageFile erfolgreich signiert
            if (openssl_pkcs7_sign($messageFile, $signedMessageFile, 'file://' . $this->_certificateFilePath, array(
                'file://' . $this->_keyFilePath, 
                $this->_passphrase), $mailSenderHeader)) {
                
                // signierten Messageinhalt holen
                $signedData = file_get_contents($signedMessageFile);
                $parts = explode("\n\n", $signedData, 2);
                
                // WENN MIT NACHFOLGENDER mail()-FUNKTION VERSENDET WIRD IST DIE EMAIL RICHTIG SIGNIERT 
                // mail($mail_header['To'], $mail_header['Subject'], $parts[1], $parts[0]);

                // temporäre Dateien wieder löschen 
                unlink($messageFile);
                unlink($signedMessageFile);
                
                // signierte Daten zurück geben
                return $parts;
            } else {
                throw new Exception('Das Zertifizieren des E-Mailcontents ist mit folgender Meldung fehlgeschlagen: ' . openssl_error_string());
            }
        } else {
            throw new Exception('Beim dem Versuch das Keyfile einzulesen ist ein Fehler mit fogender Meldung aufgetreten: ' . openssl_error_string());
        }
    }

}
In einem Controller rufe ich folgendes auf:

PHP:
        $mailer = new Myexample_Mail();
        $mailer->addTo($request->getParam('mailadresse'));
        $mailer->setSubject('Dies ist das Subject');
        $mailer->setBodyText('Dies ist einfach mal so eine Testmail.', 'UTF-8');
        $mailer->setMailCertifyData('kontakt_cert.pem', 'kontakt_key.pem', 'meinpasswort');
        $mailer->setXGupMailer('Mein Mailsender');
        $mailer->send();
Jetzt siehst du in der Klasse die Funktion send(). Die Frage ist jetzt, wie ich die E-Mail in der Mailklasse verpacke um den signierten Inhalt zu senden. Ich habe versucht den Signierten E-Mailcontent mit setBodyText zu setzten. Dann steht in der Mail genau das hier:

Code:
[1] => This is an S/MIME signed message  ------...FCEDA628 Dies ist einfach mal so eine Testmail. ------BBCF2E86DF9D970E358799A7FCEDA628 Content-Type: application/x-pkcs7-signature; name="smime.p7s" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="smime.p7s"  MIIHFwYJKoZIhvcNAQcCoIIHCDCCBwQCAQ...dp7nCMtr7K0tCRVA==  ------...FCEDA628--
Ich habe auch noch versucht einen zusätzlichen Header zu setzten

PHP:
$ailer->addHeader('Content-Type', 'multipart/signed; protocol="application/x-pkcs7-signature"; micalg=sha1');
da dies ja auch in der mail() - Funktion gesetzt wird. Aber ich bekomme die E-Mail im Outlook nicht als signiert angezeigt so wie ich es angezeigt bekomme, wenn ich die Mail direkt mit mail() versende. Der Mailfunktionsaufruf ist in der Klasse in der Funktion _certifyEmail() zu sehen. Kannst du mir sagen wie ich nun Body und Header in Zend_Mail richtig setzte, damit die Mail richtig signiert wird bzw. als signiert angezeigt wird?

Danke dir.

 

ice-breaker

New member
du solltest mal den Quelltext der Nachrichten, die signiert kommen und wie sie mit deiner Mail-Klasse signiert kommen vergleichen, wahrscheinlich stimmt mit den Headern etwas nicht.
 

hacki

New member
Danke. Ich werde mir die nun mal anschauen und dann mal schauen wie ich weiter komme. Melde mich heute Abend noch mal. Bis dahin schon mal danke.

Grüße
 

hacki

New member
So ich habe mir nun mal die Header angeschaut:

Hier die Header der erfolgreich signierten E-Mail (mit mail()) versand:

Code:
Received: from localhost (localhost [127.0.0.1])
    by mail.example.com (Postfix) with ESMTP id E5E43A18452
    for <test@example.com>; Sun, 14 Mar 2010 15:16:34 +0100 (CET)
Received: from mail.example.com ([127.0.0.1])
    by localhost (mail.example.com [127.0.0.1]) (amavisd-new, port 10024)
    with ESMTP id dzwS5GHxXbYg for <test@example.com>;
    Sun, 14 Mar 2010 15:16:23 +0100 (CET)
Received: from meinrechner.local (unknown [1.2.3.4])
    by mail.example.com (Postfix) with ESMTP id 7B723A18356
    for <test@example.com>; Sun, 14 Mar 2010 15:16:23 +0100 (CET)
Received: by meinrechner.local (Postfix, from userid 1)
    id 53147FD8326; Sun, 14 Mar 2010 15:16:22 +0100 (CET)
From: "dev@example.com" <dev@example.com>
To: "test@example.com" <test@example.com>
Content-Class: urn:content-classes:message
Date: Sun, 14 Mar 2010 15:16:22 +0100
Subject: Dies ist das Subject >>><<<
Thread-Topic: Dies ist das Subject >>><<<
Message-ID: <20100314141622.53147FD8326@meinrechner.local>
Accept-Language: de-DE
Content-Language: de-DE
X-MS-Has-Attach: yes
X-MS-TNEF-Correlator:
delivered-to: test@example.com
x-virus-scanned: Debian amavisd-new at mail.example.com
x-original-to: test@example.com
Content-Type: multipart/signed; protocol="application/x-pkcs7-signature";
    micalg=sha1; boundary="----C92E1FB..."
MIME-Version: 1.0
und hier der Header wie er von Zend_Mail erzeugt wird:

Code:
Return-Path: <daemon@meinrechner.local>
X-Original-To: test@example.com
Delivered-To: test@example.com
Received: from localhost (localhost [127.0.0.1])
    by mail.example.com (Postfix) with ESMTP id 2E1A5A18452
    for <test@example.com>; Sun, 14 Mar 2010 12:58:57 +0100 (CET)
X-Virus-Scanned: Debian amavisd-new at mail.example.com
Received: from mail.example.com ([127.0.0.1])
    by localhost (mail.example.com [127.0.0.1]) (amavisd-new, port  10024)
    with ESMTP id Mflu5ODaBb+e for <test@example.com>;
    Sun, 14 Mar 2010 12:58:43 +0100 (CET)
Received: from meinrechner.local (unknown [1.2.3.4])
    by mail.example.com (Postfix) with ESMTP id 06105A18356
    for <test@example.com>; Sun, 14 Mar 2010 12:58:43 +0100 (CET)
Received: by meinrechner.local (Postfix, from userid 1)
    id 7FF23FD5305; Sun, 14 Mar 2010 12:58:42 +0100 (CET)
To: test@example.com
Subject: Dies ist das Subject >>><<<
From: dev example.com <dev@example.com>
Content-Type: text/plain; charset=UTF-8
Date: Sun, 14 Mar 2010 12:58:40 +0100
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
MIME-Version: 1.0
Message-Id: <20100314115842.7FF23FD5305@meinrechner.local>
Kann mir einer evtl. Sagen wie ich die Header von Zend_Mail angepasst bekomme? Danke euch.
 

hacki

New member
Also ich habe es jetzt mal auf diese Art versucht:
PHP:
$boundary = substr($signedMailContent[0], strpos($signedMailContent[0], 'boundary'));

            $this->addHeader('MIME-Version', '1.0');
            $this->addHeader('Content-Type', 'multipart/signed; protocol="application/x-pkcs7-signature"; micalg=sha1; ' . $boundary);
Leider bewirkt das nichts. Die Mail kommt an, aber im Header kann ich nichts von meinem gesetzten sehen. Wäre für jeden Tipp echt sehr sehr dankbar.

Grüße
 

hacki

New member
Jetzt ja. Aber leider hilft auch das nicht weiter.

PHP:
$this->addHeader('MIME-Version', '1.0');
$this->setMimeBoundary($boundary);
In $boundary steht dabei folgendes:

Code:
="----E93B68AAE6B1A1F78F...1"
Es ist irgendwie zum Mäusemelken. Man findet auch nichts bei Google zu dem Thema. Außer diesen Beitrag hier. :-D

Noch einer ne Idee für mich? Danke.
 

Meisii

New member
Wie erstellst du $boundary? Nicht immer so knausrig mit Code sein.
//Edit: ok ich nehme an so wie oben

Wie sieht denn der Header nun aus?
 

hacki

New member
Ganz genau so. ;-)

Also in dem Array was ich bekomme steh an Stelle 0 folgendes:

Code:
From: dev@example.com X-GUPMailer: example.com Mailsender from  http://www.example.com MIME-Version: 1.0 Content-Type: multipart/signed;  protocol="application/x-pkcs7-signature"; micalg=sha1;  boundary="----5414E5D...."
Das bringe ich wie folgt auseinander:

PHP:
$boundary = substr($signedMailContent[0], strpos($signedMailContent[0], 'boundary') + 8);
$this->addHeader('MIME-Version', '1.0');
$this->setMimeBoundary($boundary);
Dabei steht in $boundary das gleiche wie in meinem letzte Beitrag beschrieben. Hast du noch eine Idee?
 

G.Schuster

New member
In $boundary steht dabei folgendes:

Code:
="----E93B68AAE6B1A1F78F...1"
Wenn genau das drin steht scheint das falsch zu sein.
Wenn ich mir deinen zweiten Beitrag ansehe finde ich dort ein wesentlich längeres Boundary: ------BBCF2E86DF9D970E358799A7FCEDA628
Und ich vermute, auch bei allen weiteren Versuchen müsste es deutlich länger ausfallen - und vor allem ohne Punkte am Ende sein.

Was du vielleicht auch einfach mal prüfen solltest ist dein Array mit der Mail - das müssten Multiline-Strings sein.
Splitte die mal und behandle sie einzeln anstatt alles als einen String auszuwerten.

Ebenfalls empfehlenswert wäre, das ganze erstmal mit Zend_Mail ans laufen zu bringen, ohne da gleich eine ganze Klasse mit zig Headern udn Zeug drumrumzubauen.
Beschränke dich auf das Minimum, das notwendig ist, um genau diese eine Problemstellung - das Signieren - zu lösen.
 

hacki

New member
Mh also ich habe weiterhin Probleme. Die Mails werden zwar signiert und kommen auch signiert an, aber der Body wird mir nicht angezeigt obwohls im Quelltext angezeigt wird.

Hier mal einen Ausschnitt aus dem Mailquelltext:

Code:
Content-Type: multipart/signed; protocol="application/x-pkcs7-signature"; micalg=sha1; boundary="----8F507AEC2D22"
Message-Id: <E1Nvwc8-0-Dt@s1532>
Date: Sun, 28 Mar 2010 19:49:32 +0200

This is an S/MIME signed message

------8F507AEC2D226FA14
Dies ist einfach mal so eine Testmail.
------AE66711BA725C
Content-Type: application/x-pkcs7-signature; name="smime.p7s"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="smime.p7s"

MIIHFwYJKoZIhvcNAQcCo...oTE1RDIFRydXN0Q2VudGVyIEdtYkgxJTAjBgNV
BAsTHFRDIFRydXN0Q2VudGVTqS0LjeseGgo5uz2aPf0m9sdIJRCrki0adQ==

------8F507AEC2D226FA1...--
Ich verstehe einfach nicht wieso mir der der Body nicht angezeigt wird obwohl die Mail offensichtlich richtig signiert wird.

@ G.Schuster

Also die Boundarys stimmen alle und passen auch überall zueinander. Ich will einfach

1. Nicht alle Daten hier frei veröffentlichen.
2. Es übersichtlich halten.

Es ist nur eine eigenständige Mailklasse geworden, weil diese Mailklasse einfach Vorkonfigurationen vornimmt und das versenden von E-Mails an reale Benutzer in einer DEV-Entwicklungsumgebung vermeidet. Zudem gibts die Funktion des Signierens. Wenn ich es aber nicht ohne weiteres Versendet bekomme, weil ich nicht weis wie ich es mit Zend_Mail richtig signiere, muss ich mir Details aus den Headern anschauen. ;-)

Also Mailsignieren ist echt nicht schön. :)

Vielleicht hast du oder auch sonst einer noch einen Tip für mich. Danke
 

m.maedche

New member
Hallo,

ich stehe gerade vor dem selben Problem. Mit der normaler PHP-mail Funktion geht es ohne Probleme,
aber im ZF bekomme ich die Header einfach nicht so gesetzt, das die Mail als signiert erkannt wird.
Vielleicht gibt es ja inzwischen ja eine Lösung dafür!

Beste Grüße und vielen Dank
 
Oben