E-Mails via PHP auslesen und in Datenbank speichern

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • E-Mails via PHP auslesen und in Datenbank speichern

    Hallo,

    gerne würde ich meine E-Mails abrufen und in der Datenbank speichern.
    Soweit klappt dies auch. Anhänge, HTML Mails und Textmails funktionieren soweit.

    Hin und wieder kommt es aber vor das er den Text falsch wiedergibt bzw. falsch codiert. Dann sieht er so aus

    die zust=3DC3=3DA4ndigen Moderatoren sind sicherlich im Urlaub....Mit freundlichen Gr=3DC3=3DBC=3DC3=3D9Fen
    Die Rechnungen können Sie innerhalb Ihres Kundeninterface unter dem Pu==3Dnkt Rechnungsübersicht einsehen.=3D0A=3D0A

    F=3DC3=3DBCr meine Webseite damals hab ich einen Server von strato gemietet=. Ic=3Dh muss sagen, sie waren recht gut bez=3DC3=3DBCglich Schnelligkeit, Service=etc=3D


    Dies betrifft übrigens nicht nur Sonderzeichen. Leider schreibt er auch hin und wieder Teile des Headers in die Datenbank.

    --b2_90afbf4a3f4986efa19e4202d7aed1e7
    Content-Type: text/plain; charset=3Dutf-8
    Content-Transfer-Encoding: quoted-printable

    =3D0A=3D0A=3D0A =3D0A=3D0A
    ​Hallo Frau/Herr Christian xxxx,=3D0A=3D0Aleider haben wir


    Und hier mein Script

    PHP-Quellcode

    1. <?php
    2. define('ACP', true);
    3. define('ACP_PATH', './');
    4. define('PATH', '../');
    5. define('EXT', substr(strrchr(__FILE__, '.'), 1));
    6. // Einbinden der Initialisierungsdatei
    7. include (ACP_PATH . 'init/init.php');
    8. include (ACP_PATH . 'class/ticket_class.php');
    9. $Ticket = new Ticket;
    10. $mbox = imap_open( "{imap.domain.de:143/novalidate-cert}INBOX" , 'info@domain.de' , '!secret%' );
    11. $message = array();
    12. $message["attachment"]["type"][0] = "text";
    13. $message["attachment"]["type"][1] = "multipart";
    14. $message["attachment"]["type"][2] = "message";
    15. $message["attachment"]["type"][3] = "application";
    16. $message["attachment"]["type"][4] = "audio";
    17. $message["attachment"]["type"][5] = "image";
    18. $message["attachment"]["type"][6] = "video";
    19. $message["attachment"]["type"][7] = "other";
    20. function get_decode_value($message, $encoding) {
    21. switch($encoding) {
    22. case 0:
    23. case 1:
    24. $message = imap_8bit($message);
    25. break;
    26. case 2:
    27. $message = imap_binary($message);
    28. break;
    29. case 3:
    30. case 5:
    31. $message = imap_base64($message);
    32. break;
    33. case 4:
    34. $message = imap_qprint($message);
    35. break;
    36. }
    37. return $message;
    38. }
    39. function fix_text($str)
    40. {
    41. $subject = '';
    42. $subject_array = imap_mime_header_decode($str);
    43. foreach ($subject_array AS $obj) {
    44. $subject .= rtrim($obj->text, "\t");
    45. }
    46. return $subject;
    47. }
    48. $att = '';
    49. for ($jk = 1; $jk <= imap_num_msg($mbox); ++$jk) {
    50. print_r($structure = imap_fetchstructure($mbox, $jk));
    51. /* retrieve message timestamp */
    52. $header = imap_headerinfo($mbox, $jk);
    53. $timestamp = $header->udate;
    54. // Ticket in Datenbank eintragen
    55. $ticket_array = array();
    56. $ticket_array['name'] = $header->from[0]->personal;
    57. $ticket_array['email'] = $header->from[0]->mailbox.'@'.$header->from[0]->host;
    58. $ticket_array['status'] = 1;
    59. $ticket_array['date'] = $header->udate;
    60. $ticket_array['subject'] = fix_text($header->Subject);
    61. $ticket_array['priority'] = '3';
    62. // Prüfen ob Anhang
    63. if(isset($structure->parts)) {
    64. $parts = $structure->parts;
    65. $fpos=2;
    66. for($i = 1; $i < count($parts); $i++) {
    67. $message['pid'][$i] = ($i);
    68. $part = $parts[$i];
    69. if(isset($part->disposition) == "INLINE") {
    70. $message["type"][$i] = $message["attachment"]["type"][$part->type] . "/" . strtolower($part->subtype);
    71. $message["subtype"][$i] = strtolower($part->subtype);
    72. $ext = $part->subtype;
    73. $params = $part->dparameters;
    74. $filename = $part->dparameters[0]->value;
    75. $body="";$data="";
    76. $body = imap_fetchbody($mbox, $jk, $fpos);
    77. $inhalt1 = get_decode_value($body, $part->type);
    78. //Schreibe Anhänge in Datei
    79. $fp = fopen('file/'.$part->dparameters[0]->value, 'w+');
    80. fwrite ($fp, $inhalt1);
    81. fclose($fp);
    82. $att .= $part->dparameters[0]->value.';';
    83. $ticket_array['attachment'] = $att;
    84. $fpos++;
    85. }
    86. }
    87. }
    88. // prüfen ob Ticket ID im header ist
    89. if (preg_match('/[A-Z]{3,}-[0-9]{3,}-[0-9]{3,}/', $header->subject)) {
    90. // Rückgabe der Ticket-ID
    91. preg_match('/[A-Z]{3,}-[0-9]{3,}-[0-9]{3,}/', $header->subject, $match);
    92. $ticket_id = $match[0];
    93. $varse = "'".$ticket_id."'";
    94. // Status wieder auf Offen setzen
    95. $status_update = array();
    96. $status_update['status'] = 1;
    97. $sql = 'UPDATE ' . TICKETS . ' SET ' . $db->sql_build_array('UPDATE', $status_update) . ' WHERE ticket_id_parrent IS NULL AND ticket_id = ' . (string) $varse;
    98. $db->sql_query($sql);
    99. // Ticket zuordnung
    100. $sql = "SELECT * FROM " . TICKETS . " WHERE ticket_id = '" . $ticket_id ."' AND ticket_id_parrent IS NULL";
    101. $result = $db->sql_query($sql);
    102. $row = $db->sql_fetchrow($result);
    103. $ticket_array['ticket_id_parrent'] = $row['id'];
    104. $ticket_array['ticket_id'] = $ticket_id;
    105. } else {
    106. $ticket_array['ticket_id'] = $Ticket->randomTicket();
    107. }
    108. $messages = imap_fetchbody($mbox, $jk, "1");
    109. if($structure->encoding == 0) {
    110. $messages = imap_8bit($messages);
    111. } else if($structure->encoding == 1) {
    112. $messages =$messages;
    113. } else if($structure->encoding == 2) {
    114. $messages = imap_binary($messages);
    115. } else if($structure->encoding == 3) {
    116. $messages = imap_base64($messages);
    117. } else if($structure->encoding == 4) {
    118. $messages = imap_qprint($messages);
    119. } else if($structure->encoding == 5) {
    120. $messages = imap_base64($messages);
    121. } else {
    122. $messages = imap_qprint($messages);
    123. }
    124. $ticket_array['message'] = $messages;
    125. $sql = 'INSERT INTO ' . TICKETS. ' ' . $db->sql_build_array('INSERT', $ticket_array);
    126. $db->sql_query($sql);
    127. #imap_delete($mbox,$jk);
    128. }
    129. #imap_expunge($mbox);
    130. imap_close($mbox);
    131. ?>
    Alles anzeigen
  • Kein Problem, ich habe eh auf die code.google.com/p/php-imap/ gewechselt.
    Da kann ich allerdings irgendwie nicht den E-Mail Text in der Datenbank speichern

    $ticket_array['message'] = $mail;


    PHP-Quellcode

    1. $mails = array();
    2. $mails = $mailbox->searchMailbox('All') ;
    3. foreach ($mails as $key => $mailId) {
    4. $mail = $mailbox->getMail($mailId);
    5. // Ticket in Datenbank eintragen
    6. $ticket_array = array();
    7. $ticket_array['message'] = $mail;
    8. $ticket_array['name'] = $mail->fromName;
    9. $ticket_array['email'] = $mail->fromAddress;
    10. $ticket_array['status'] = 1;
    11. $ticket_array['date'] = $mail->date;
    12. $ticket_array['subject'] = $mail->subject;
    13. $ticket_array['priority'] = '3';
    14. $list = $mail->getAttachments();
    15. $filePath_CorpMail = "";
    16. foreach ($list as $key => $value) {
    17. if (preg_match("#.txt#",$value->name))
    18. $filePath_CorpMail = $value->filePath;
    19. $ticket_array['attachment'] = $value->filePath;
    20. }
    21. // prüfen ob Ticket ID im header ist
    22. if (preg_match('/[A-Z]{3,}-[0-9]{3,}-[0-9]{3,}/', $mail->subject)) {
    23. // Rückgabe der Ticket-ID
    24. preg_match('/[A-Z]{3,}-[0-9]{3,}-[0-9]{3,}/', $mail->subject, $match);
    25. $ticket_id = $match[0];
    26. $varse = "'".$ticket_id."'";
    27. // Status wieder auf Offen setzen
    28. $status_update = array();
    29. $status_update['status'] = 1;
    30. $sql = 'UPDATE ' . TICKETS . ' SET ' . $db->sql_build_array('UPDATE', $status_update) . ' WHERE ticket_id_parrent IS NULL AND ticket_id = ' . (string) $varse;
    31. $db->sql_query($sql);
    32. // Ticket zuordnung
    33. $sql = "SELECT * FROM " . TICKETS . " WHERE ticket_id = '" . $ticket_id ."' AND ticket_id_parrent IS NULL";
    34. $result = $db->sql_query($sql);
    35. $row = $db->sql_fetchrow($result);
    36. $ticket_array['ticket_id_parrent'] = $row['id'];
    37. $ticket_array['ticket_id'] = $ticket_id;
    38. } else {
    39. $ticket_array['ticket_id'] = $Ticket->randomTicket();
    40. }
    41. $sql = 'INSERT INTO ' . TICKETS. ' ' . $db->sql_build_array('INSERT', $ticket_array);
    42. $db->sql_query($sql);
    43. }
    Alles anzeigen
  • Hallo,

    ich kann den Beitrag nicht Editieren, daher nun mein Lösungsweg.

    Ich habe die eigentliche Klasse um wenige Zeilen erweitert.

    PHP-Quellcode

    1. public $text; <<
    2. elseif($partStructure->type == 0 && $data) {
    3. if(strtolower($partStructure->subtype) == 'plain') {
    4. $mail->textPlain .= nl2br(utf8_decode($data));
    5. $mail->text = $mail->textPlain;<<
    6. }
    7. else {
    8. $mail->textHtml .= $data;
    9. $mail->text = $mail->textHtml;<<
    10. }
    11. }
    12. elseif($partStructure->type == 2 && $data) {
    13. $mail->textPlain .= nl2br(trim($data));
    14. $mail->text = $mail->textPlain;<<
    15. }
    Alles anzeigen


    Und kann den Inhalt nun mit

    PHP-Quellcode

    1. $ticket_array['message'] = $mailbox->getMail($mailId)->text;


    in der Datenbank Speicher.

    Problem was jetzt allerdings ist, bei mehr als 2 Bilder oder 2 Anhänge in der E-Mail versagt das Script. Die E-Mails werden einfach nicht mehr abgearbeitet. Habe ich nur 1 Anhang oder 1 Bild in der E-Mail klappt dies ohne Probleme. Wo liegt der Fehler?

    PHP-Quellcode

    1. $mailbox = new ImapMailbox('{imap.domain.de:143/novalidate-cert}INBOX', GMAIL_EMAIL, GMAIL_PASSWORD, ATTACHMENTS_DIR, 'utf-8');
    2. $mails = array();
    3. $mails = $mailbox->searchMailbox('NEW') ;
    4. foreach ($mails as $key => $mailId) {
    5. $mail = $mailbox->getMail($mailId);
    6. // Ticket in Datenbank eintragen
    7. $ticket_array = array();
    8. $ticket_array['message'] = $mailbox->getMail($mailId)->text;
    9. $ticket_array['name'] = $mail->fromName;
    10. $ticket_array['email'] = $mail->fromAddress;
    11. $ticket_array['status'] = 1;
    12. $ticket_array['date'] = $mail->date;
    13. $ticket_array['subject'] = $mail->subject;
    14. $ticket_array['priority'] = '3';
    15. $list = $mail->getAttachments();
    16. $filePath_CorpMail = "";
    17. foreach ($list as $key => $value) {
    18. if (preg_match("#.txt#",$value->name))
    19. $filePath_CorpMail = $value->filePath;
    20. $ticket_array['attachment'] = $value->filePath;
    21. }
    22. // prüfen ob Ticket ID im header ist
    23. if (preg_match('/[A-Z]{3,}-[0-9]{3,}-[0-9]{3,}/', $mail->subject)) {
    24. // Rückgabe der Ticket-ID
    25. preg_match('/[A-Z]{3,}-[0-9]{3,}-[0-9]{3,}/', $mail->subject, $match);
    26. $ticket_id = $match[0];
    27. $varse = "'".$ticket_id."'";
    28. // Status wieder auf Offen setzen
    29. $status_update = array();
    30. $status_update['status'] = 1;
    31. $sql = 'UPDATE ' . TICKETS . ' SET ' . $db->sql_build_array('UPDATE', $status_update) . ' WHERE ticket_id_parrent IS NULL AND ticket_id = ' . (string) $varse;
    32. $db->sql_query($sql);
    33. // Ticket zuordnung
    34. $sql = "SELECT * FROM " . TICKETS . " WHERE ticket_id = '" . $ticket_id ."' AND ticket_id_parrent IS NULL";
    35. $result = $db->sql_query($sql);
    36. $row = $db->sql_fetchrow($result);
    37. $ticket_array['ticket_id_parrent'] = $row['id'];
    38. $ticket_array['ticket_id'] = $ticket_id;
    39. } else {
    40. $ticket_array['ticket_id'] = $Ticket->randomTicket();
    41. }
    42. $sql = 'INSERT INTO ' . TICKETS. ' ' . $db->sql_build_array('INSERT', $ticket_array);
    43. $db->sql_query($sql);
    44. }
    Alles anzeigen
  • Ich habe mal diesen alten Thread ausgegraben weil ich es schon seit längerer Zeit gelöst habe und ich dies nicht vorenthalten will.
    Evtl. kann dies ja einer brauchen.

    Es püft ob im Betreff eine Ticket ID alla GZH-478-457 vorhanden ist. Wenn ja wird dies als Antwort auf ein vorhandenen Ticket gespeichert. Wenn nicht als neues Ticket gehandelt.

    Gleichzeitig werden bei mehr als 1 Anhang alle in der Datenbank gespeichert, getrennt mit ;

    PHP-Quellcode

    1. // IMAP must be enabled in Google Mail Settings
    2. define('GMAIL_EMAIL', 'info@fffffff.de');
    3. define('GMAIL_PASSWORD', '!fffffff%');
    4. define('ATTACHMENTS_DIR', dirname(__FILE__) . '/file');
    5. $mailbox = new ImapMailbox('{imap.ffffffff.de:143/novalidate-cert}INBOX', GMAIL_EMAIL, GMAIL_PASSWORD, ATTACHMENTS_DIR, 'utf-8');
    6. $mails = array();
    7. $mails = $mailbox->searchMailbox('ALL') ;
    8. foreach ($mails as $key => $mailId) {
    9. $mail = $mailbox->getMail($mailId);
    10. // Ticket in Datenbank eintragen
    11. $ticket_array = array();
    12. $ticket_array['message'] = $mailbox->getMail($mailId)->text;
    13. $ticket_array['name'] = $mail->fromName;
    14. $ticket_array['email'] = $mail->fromAddress;
    15. $ticket_array['status'] = 1;
    16. $ticket_array['date'] = $mail->date;
    17. $ticket_array['subject'] = $mail->subject;
    18. $ticket_array['priority'] = '3';
    19. $att = '';
    20. foreach($mail->getAttachments() as $attachment) {
    21. echo $attachment->filePath;
    22. $att .= $attachment->filePath.';';
    23. }
    24. $ticket_array['attachment'] = $att;
    25. // prüfen ob Ticket ID im header ist
    26. if (preg_match('/[A-Z]{3,}-[0-9]{3,}-[0-9]{3,}/', $mail->subject)) {
    27. // Rückgabe der Ticket-ID
    28. preg_match('/[A-Z]{3,}-[0-9]{3,}-[0-9]{3,}/', $mail->subject, $match);
    29. $ticket_id = $match[0];
    30. $varse = "'".$ticket_id."'";
    31. // Status wieder auf Offen setzen
    32. $status_update = array();
    33. $status_update['status'] = 1;
    34. $sql = 'UPDATE ' . TICKETS . ' SET ' . $db->sql_build_array('UPDATE', $status_update) . ' WHERE ticket_id_parrent IS NULL AND ticket_id = ' . (string) $varse;
    35. $db->sql_query($sql);
    36. // Ticket zuordnung
    37. $sql = "SELECT * FROM " . TICKETS . " WHERE ticket_id = '" . $ticket_id ."' AND ticket_id_parrent IS NULL";
    38. $result = $db->sql_query($sql);
    39. $row = $db->sql_fetchrow($result);
    40. $ticket_array['ticket_id_parrent'] = $row['id'];
    41. $ticket_array['ticket_id'] = $ticket_id;
    42. } else {
    43. $ticket_array['ticket_id'] = $Ticket->randomTicket();
    44. }
    45. $sql = 'INSERT INTO ' . TICKETS. ' ' . $db->sql_build_array('INSERT', $ticket_array);
    46. $db->sql_query($sql);
    47. }
    Alles anzeigen