首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >phpMailer IMAP编解码

phpMailer IMAP编解码
EN

Stack Overflow用户
提问于 2018-08-05 12:39:51
回答 1查看 444关注 0票数 0

好吧,我已经和PHPmailer玩了一段时间了,我还有最后一个问题要解决,直到我完成我的项目。

我使用phpMailer接收电子邮件,它们都是编码出来的。我尝试过使用回波mb_detect_encoding($str,“auto”)来检测编码,而且它不会检测到任何编码。

我尝试过utf8_decode()邮件内容(从数据库中获取),它仍然使用UTF-8编码。由于存在混合base64,我还需要一种方法来检测是否存在base64,并对其进行解码。

代码语言:javascript
复制
$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

代码语言:javascript
复制
<?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读取的代码。

代码语言:javascript
复制
<?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中的。

带有普通邮件的Base64电子邮件

使用UTF-8编码的电子邮件+一些使用我们的应用程序的电子邮件,这些邮件似乎只是简单的HTML。

它如何存储在我们的数据库中

抱歉,这里有点乱。这是我第一次在堆栈溢出上发布,并且有一点学习曲线lol。

这方面的任何帮助都是很棒的:)

编辑:

好吧,所以

代码语言:javascript
复制
if ( base64_decode($emailContentsVar, true) == true){
			echo base64_decode($emailContentsVar);
   }

可以解码此Base64电子邮件,但不能解码此base64电子邮件。主要的问题似乎是在电子邮件中有多少种不同的编码,而且似乎不仅仅是编码。它们似乎是混合编码、纯文本和html。

编辑2:

好了,现在再靠近一点!

代码语言:javascript
复制
   quoted_printable_decode($emailContentsVar)

已经破译了1封邮件中的多一点。现在看起来是这样的:解码电子邮件,但它以一种非常奇怪的方式解码了它。它解码了我发送的部分,但没有接收到的部分的答复。我一直在尝试各种解码方法,但没有什么能删除编码的主要部分。我本来打算使用regex,但每封电子邮件都略有不同,这取决于电子邮件发送的设备。还不能解码大图像base64电子邮件。

EN

回答 1

Stack Overflow用户

发布于 2018-08-05 13:12:04

我和你以前有同样的问题!如果您想要在不使用HTML的情况下解码您的消息,我建议您使用函数html_entity_decode,这是我对HTML使用的函数。

你会看到结果的!(我是PHP的初学者,请原谅我说了些愚蠢的话,我只是想帮忙)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51694386

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档