簡體   English   中英

有誰知道我如何讀取 PHP 中的電子郵件,然后將它們寫入數據庫?

[英]Does anyone know how I can read emails in PHP and then write them to a database?

我現在正在實習,我應該從上面實施問題。 在谷歌上我找不到合適的東西。 我需要幫助讀取電子郵件(在 Imap 的幫助下),然后寫入數據庫 (mysql)。 不幸的是,我不知道該怎么做,所以我求助於你。 提前致謝。

我不知道這是如何工作的,我不知道從哪里開始。 我很高興能得到幫助!

這是一次嘗試:

<?php 

// POP3-Server 
$host="xxx"; 
$port=" 993"; 
// User-Daten 
$user="xxx"; 
$passwort="xxx"; 

// Verbinden zur Mailbox 
$mailbox=imap_open("{".$host."/imap:    993}INBOX",$user,$passwort); 

// Überprüfen ob Verbindung erfolgreich
if ($mailbox) 
{ 
// Posteingang überprüfen 
$check=imap_check($mailbox); 
// Anzahl vorhandener Emails im Postfach 
$count_msg=$check->Nmsgs; 
// Anzahl neuer Emails im Postfach 
$count_new_msg=$check->Recent; 
// Emails auslesen 
for ($i=1; $i<=imap_num_msg($mailbox); 
$i++) 

{ 



// Header erfassen 
$mail_header=imap_header($mailbox, $i); 

// Datum erfassen 
$mail_date=$mail_header->Date; 

// Mail-ID erfassen 
$mail_id=$mail_header->message_id; 

// Empfänger erfassen 
$mail_to=$mail_header->toaddress; 

// Absendername erfassen 
$mail_from_name=$mail_header->from [0]->personal; 

// Absender-eMail-Adresse erfassen 
$mail_from_address=$mail_header->from [0]->mailbox."@".$mail_header->from [0]->host; 

// Kopieempfänger erfassen 
$mail_copy_to=$mail_header->cc[0] ->mailbox."@".$mail_header->cc[0] ->host; 

// Antwortempfänger erfassen 
$mail_answer_to=$mail_header->reply_to; 

// Betreff erfassen 
$mail_subject=$mail_header->subject; 

// Nachricht erfassen
$mail_body = imap_body($mailbox,$i); 


// Daten in db speichern
include ("config.inc.php");

  $eintrag = "INSERT INTO bsi_statistik (komponente, anzahlmeldungen, datumletztemeldung, mailsin30tagen) VALUES ('$komponente', '$mail_from_address', '$mail_subject', '$mail_date', '$mail_body')";
  $eintragen = mysql_query($eintrag);

echo "e-Mail Nr.".$i."<br>"; 
// Ausgabe in HTML 
echo '<b>Versendet am:</b> '; 
echo $mail_date."<br>"; 

echo '<b>Eindeutige eMail-ID: </b>'; 
echo $mail_id."<br>"; 

echo '<b>Empfänger: </b>'; 
echo $mail_to."<br>"; 

echo '<b>"Name des Absenders: </b>'; 
echo $komponente."<br>"; 

echo '<b>"eMail des Absenders: </b>'; 
echo $mail_from_address."<br>"; 
// echo $mail_from_address."<br>"; 

echo '<b>Betreff: </b>'; 
echo $mail_subject."<br><br>"; 

echo '<b>Nachricht: </b>'; 
echo $mail_body."<br><br>"; 


// E-Mail löschen löschen
 imap_delete($mailbox, $i); 


} 
imap_expunge($mailbox);
imap_close($mailbox); 
} 
?>

使用 OP 提供的附加信息中的示例進行了更新

實現此目的的最簡單方法是執行以下操作。 此示例使用以下數據庫架構:

create table incoming_emails
(
    id int auto_increment,
    date_sent datetime null,
    headers json null,
    `from` varchar(191) null,
    subject text null,
    content longtext null,
    constraint incoming_emails_pk
        primary key (id)
);

使用 Composer 導入新庫laminas/mail

composer install laminas/mail

這樣做之后,可以像這樣檢索和迭代郵件:

<?php

use Laminas\Mail\Storage\Imap;

require_once 'vendor/autoload.php';

// Connecting with Imap:
$mail = new Imap([
    'host'     => 'example.com',
    'user'     => 'test',
    'password' => 'test',
]);

echo $mail->countMessages() . " messages found\n";
foreach ($mail as $message) {
    printf("Mail from '%s': %s\n", $message->from, $message->subject);
}

然后,您可以使用 MySQLi class 持久化到數據庫:

<?php

use Laminas\Mail\Storage\Imap;

require_once 'vendor/autoload.php';

// Do all configuration here.
// Database:
$dbHost = 'localhost';
$dbUsername = 'root';
$dbPassword = 'RANDOM_PASSWORD';
$dbName = 'my_database';

// Email inbox to query:
$emailHost = 'localhost';
$emailPort = 995;
$emailUsername = 'email@example.com';
$emailPassword = 'SECRET_STRING_HERE';

// Do not edit below this line.

$mysqli = new MySQLi($dbHost, $dbUsername, $dbPassword, $dbName);

// If cannot connect to MySQL database, throw an error.
if ($mysqli->connect_error) {
    throw new \Exception('Could not connect to database!');
}

// Connecting with Imap:
$mail = new Imap([
    'host'     => $emailHost,
    'user'     => $emailUsername,
    'password' => $emailPassword,
    'port' => $emailPort,
]);

echo $mail->countMessages() . " messages found\n";

// Prepare a query.
$query = 'INSERT INTO `incoming_emails` (`date_sent`, `headers`, `from`, `subject`, `content`)';

// Prepare all emails for input to SQL database.
$mailParser = new MailMimeParser();

foreach ($mail as $message) {
    $queryData[] = [
        'from' => $mysqli->real_escape_string($message->getHeader('reply-to') ?? $message->getHeader('from')),
        'headers' => $mysqli->real_escape_string(json_encode($message->getHeaders())),
        'subject' => $mysqli->real_escape_string($message->getSubject()),
        'content' => $mysqli->real_escape_string($message->getContent()),
    ];
    
    // Left in for debug:
    printf("Mail from '%s': %s\n", $message->from, $message->subject);
}

$query .= 'VALUES (' . implode('), (', $queryData) . ')';

$mysqli->query($query);

echo 'Done';

請確保您還包括良好的數據庫輸入清理。

這是按原樣提供的,沒有進行任何測試,因此無法確認其是否可以正常工作。 您可能需要根據自己的需要對其進行更新,並且僅作為教育示例提供。

文檔:

  1. https://www.php.net/manual/en/mysqli.query.php
  2. https://docs.laminas.dev/laminas-mail/read/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM