好吧,我已经和PHPmailer玩了一段时间了,我还有最后一个问题要解决,直到我完成我的项目。
我使用phpMailer接收电子邮件,它们都是编码出来的。我尝试过使用回波mb_detect_encoding($str,“auto”)来检测编码,而且它不会检测到任何编码。
我尝试过utf8_decode()邮件内容(从数据库中获取),它仍然使用UTF-8编码。由于存在混合base64,我还需要一种方法来检测是否存在base64,并对其进行解码。
$emailContentsVar = $row['email_message'];
if ( base64_decode($emailContentsVar, true) == true){
echo base64_decode($emailContentsVar);
} else {
echo "<div id='Emails' style='background-color: #F26D21; color: white;'>" . utf8_decode($emailContentsVar) . "</div><br>";
我也尝试过使用UTF-8头球,这并没有什么不同。我尝试过立即破译这些电子邮件,但它会导致非编码的电子邮件出现在不可读的信件中。
这是我用来存储数据的代码(我的代码很混乱,很抱歉。我的思维非常混乱,我的代码反映了这一点)。https://pastebin.com/Mq9AUBzp
<?php header('Content-Type: text/html; charset=utf-8'); ?>
<html>
<head>
<meta name="google" content="notranslate">
<meta charset="UTF-8">
<!--[if !mso]><!-- -->
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<!--<![endif]-->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<?php
//echo ' <meta http-equiv="refresh" content="0;url=../mail.php?emailUpdate=' . $emailsCount . '" />';
include("../assets/sqlconfig.php");
$emailsCount = 0;?>
</head>
<body>
<?php
error_reporting(0);
echo '<a href="../mail.php">Back</a>';
// Multiple email account
$emails = array(
array(
'no' => '1', #####',
'host' => '######',
'username' => '#######',
'password' => '#######'
)
// bla bla bla ...
);
foreach ($emails as $email) {
$read = imap_open($email['host'], $email['username'], $email['password']) or die('<div class="alert alert-danger alert-dismissable">Cannot connect to ###### mailbox: ' . imap_last_error() . '</div>');
$array = imap_search($read, 'ALL');
if ($array) {
$html = '';
rsort($array);
$html .= '<div class="panel panel-default">
<div class="panel-heading">
' . $email['label'] . '
</div>
<div class="panel-body">
<div class="panel-group" id="accordion">';
foreach ($array as $result) {
$overview = imap_fetch_overview($read, $result, 0);
// $conn = new mysqli($servername, $username, $password, $dbname);
$conn = new mysqli($servername, $username, $password, $dbname);
$message = imap_body($read, $result, 0);
$reply = imap_headerinfo($read, $result, 0);
$input_number = mysqli_real_escape_string($conn, $email['no'] . $result);
$input_subject = mysqli_real_escape_string($conn, substr(strip_tags($overview[0]->subject), 0, 50));
$input_from = mysqli_real_escape_string($conn, $overview[0]->from);
$input_from_email = mysqli_real_escape_string($conn, $reply->from[0]->mailbox . '@' . $reply->from[0]->host);
$input_email = mysqli_real_escape_string($conn, $message);
$input_date = mysqli_real_escape_string($conn, $overview[0]->date);
// Check email exsistance
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$sql = "SELECT * FROM `mail` WHERE `email_number` = '$input_number'";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
//echo "Email There<br>" . $input_number . "<br>";
} else {
$emailsCount++;
//ADDING EMAILS TO DB
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$sql = "INSERT INTO `mail` (`id`, `email_number`, `email_subject`, `email_message`, `email_from`, `email_from_email`, `email_date`, `email_read_status`) VALUES (NULL, '$input_number', '$input_subject', '$input_email', '$input_from', '$input_from_email', '$input_date', 'Unread');";
echo $input_subject . "<br>";
if ($conn->query($sql) === TRUE) {
// echo "New record created successfully<br>";
} else {
//echo "Error: " . $sql . "<br>" . $conn->error;
}
$conn->close();
//ADDING EMAILS TO DB END
}
$conn->close();
// Check email exsistance END
/* $html.= ' <div class="panel panel-default">
<div style="color: red;" class="panel-heading">
<h4 class="panel-title">
<a class="collapsed" data-toggle="collapse" data-parent="#accordion" href="#'.$email['no'].$result.'">
<span class="subject">'.substr(strip_tags($overview[0]->subject),0,50).'.. </span>
<span class="from">'.$overview[0]->from.'</span>
<span class="date">on '.$overview[0]->date.'</span>
</a>
</h4>
</div>
<div id="'.$email['no'].$result.'" class="panel-collapse collapse">
<div class="panel-body">
<pre>'.$message.'<hr>From: '.$reply->from[0]->mailbox.'@'.$reply->from[0]->host.'</pre>
</div>
</div>
</div>'; */
}
$html .= '</div>
</div>
</div>';
echo $html;
}
imap_close($read);
echo '<script>window.location.href="../mail.php?emailUpdate=' . $emailsCount . '";</script>';
//echo "<center>" . $emailsCount . " New emails</center>";
//echo $emailsCount;
}
?>
<!-- Javascript -->
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js">
</script>
</body>
</html>
这是我用来从SQL https://pastebin.com/1HsEtu8s读取的代码。
<?php header('Content-Type: text/html; charset=utf-8'); ?>
<html>
<head>
<meta name="google" content="notranslate">
<meta charset="UTF-8">
<!--[if !mso]><!-- -->
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<!--<![endif]-->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js">
</script>
<!-- Custom style -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.1/css/bootstrap.min.css">
<link rel="stylesheet" type="text/css" href="css/custom.css">
<style>
pre {
white-space: pre;
white-space: pre-wrap;
word-wrap: break-word;
}
</style>
<?php include("assets/nav.php");
include("assets/sqlconfig.php");?>
</head>
<body>
<div class="alert alert-info alert-dismissable">
<div style="background-color: #A3B86C; color: white; font-size: 20px;">
<center>
<a href="functions/mailLoad.php">Click here to load Mail
</a>
</center>
</div>
<div>
<?php
include("../assets/sqlconfig.php");
if(isset($_GET['emailUpdate'])){
echo "<center>" . $_GET['emailUpdate'] . " New emails</center>";
}
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$sql = "SELECT * FROM `mail` ORDER BY `email_number` DESC";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
$emailContentsVar = $row['email_message'];
if ( base64_decode($emailContentsVar, true) == true){
echo base64_decode($emailContentsVar);
} else {
echo "<div id='Emails' style='background-color: #F26D21; color: white;'>" . $emailContentsVar . "</div><br>";
}
}
} else {
echo "0 results";
}
$conn->close();
exit;
?>
<script>
$(document).ready(function(){
var ajaxurl = 'functions/mailLoad.php',
data = {
'action': 'load'};
$.post(ajaxurl, data, function (response) {
alert(response);
}
);
}
);
<!-- Javascript -->
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.1/js/bootstrap.min.js"></script>
<script>
// $(".panel-heading").click(function(){
// Holds the product ID of the clicked element
// });
</script>
</body>
</html>
最后,这就是电子邮件发出的样子以及它们是如何存储在mySQL中的。
使用UTF-8编码的电子邮件+一些使用我们的应用程序的电子邮件,这些邮件似乎只是简单的HTML。
抱歉,这里有点乱。这是我第一次在堆栈溢出上发布,并且有一点学习曲线lol。
这方面的任何帮助都是很棒的:)
编辑:
好吧,所以
if ( base64_decode($emailContentsVar, true) == true){
echo base64_decode($emailContentsVar);
}
可以解码此Base64电子邮件,但不能解码此base64电子邮件。主要的问题似乎是在电子邮件中有多少种不同的编码,而且似乎不仅仅是编码。它们似乎是混合编码、纯文本和html。
编辑2:
好了,现在再靠近一点!
quoted_printable_decode($emailContentsVar)已经破译了1封邮件中的多一点。现在看起来是这样的:解码电子邮件,但它以一种非常奇怪的方式解码了它。它解码了我发送的部分,但没有接收到的部分的答复。我一直在尝试各种解码方法,但没有什么能删除编码的主要部分。我本来打算使用regex,但每封电子邮件都略有不同,这取决于电子邮件发送的设备。还不能解码大图像base64电子邮件。
发布于 2018-08-05 13:12:04
我和你以前有同样的问题!如果您想要在不使用HTML的情况下解码您的消息,我建议您使用函数html_entity_decode,这是我对HTML使用的函数。
你会看到结果的!(我是PHP的初学者,请原谅我说了些愚蠢的话,我只是想帮忙)
https://stackoverflow.com/questions/51694386
复制相似问题