簡體   English   中英

使用PHP返回以base64編碼的電子郵件中的圖像

[英]using PHP to return an image in a base64 encoded email

我正在開發電子郵件發送和跟蹤應用程序,但是遇到了一個我無法解決的問題。 我想在電子郵件中給我們一個跟蹤圖像,但是出現了一些奇怪的現象。 目前,我正在發送以base64編碼的電子郵件。 在HTML消息的主體中,我正在使用HTML圖像標簽,並帶有指向服務器上PHP文件的鏈接。 該文件使用以下PHP代碼發送回圖像:

header("Content-Type: image/png");
readfile("full-server-path-to-image.png");

這就是奇怪的地方。 如果我在Outlook電子郵件客戶端中查看該消息,則該圖像將不會顯示(僅顯示紅色的“ X”圖像圖標)。 不過,其他通常鏈接的圖像也可以正常顯示。 如果我在Gmail中查看同一封郵件,則可以看到所有圖像。 確實奇怪的是,該圖像在某些電子郵件客戶端(但不是所有客戶端)中都能正常顯示。

當我更改為在base64中編碼消息時,我注意到此問題開始。 在開始對消息進行編碼之前,我可以在任何電子郵件客戶端中查看所有圖像。 我的直覺告訴我,這與content-encoding-type有關,但我不知道如何解決。 任何幫助,將不勝感激!

這是我用來發送消息的PHP代碼:

$myHTMLmessage = chunk_split(base64_encode('
<html><head></head><body>
<img src="https://www.my-web-site.com/openTrack.php?t={trackerid}"></a>
</body></html>'));

$boundary = uniqid('np');               
$to = "somebody-else@another-web-site.com"
$headers = "MIME-Version: 1.0\r\n";
$headers .= "From: somebody@my-web-site.com\r\n";
$headers .= "Content-Type: multipart/alternative;boundary=" . $boundary . "\r\n";

$message = "This is a MIME encoded message.";
$message .= "\r\n\r\n--" . $boundary . "\r\n";
$message .= "Content-Type: text/plain;charset=UTF-8\r\n";
$message .= "Content-Transfer-Encoding: base64\r\n\r\n";
//Plain text body
$message .= "some plain text";
$message .= "\r\n\r\n--" . $boundary . "\r\n";
$message .= "Content-Type: text/html;charset=UTF-8\r\n";
$message .= "Content-Transfer-Encoding: base64\r\n\r\n";
//Html body
$message .= $myHTMLmessage;
$message .= "\r\n\r\n--" . $boundary . "--";

mail($to,$subject,$message,$headers);

以防萬一有人遇到這樣的問題,我發現這全都歸結為電子郵件客戶端如何編碼URL。 在我的原始代碼中,我在image src屬性中使用的URL帶有2個參數。 像這樣:

http://www.my-web-site.com/page.php?pram1=something&pram2=something

當Outlook處理此網址時,它將更改為:

http://www.my-web-site.com/page.php?pram1=something&amp;pram2=something

其他電子郵件客戶端足夠聰明,可以按原樣保留&符號,而無需將其轉換為&amp;

在我的實時代碼中,我需要$_GET兩個url參數並對其進行處理。 如果我的腳本無法同時處理這兩個參數,那么它甚至都不會到達發送圖像的行。 我能想到的最好的解決方法是在我的page.php文件中添加以下代碼:

$pram1 = $_GET['pram1'];
$pram2 = $_GET['pram2'];

if(!isset($pram2)){
    $pram2 = $_GET['amp;pram2'];
}

// now regardless of the email client both parameters contain a value to process

if((isset($pram1)) && (isset($pram2))){
    header("Content-Type: image/png");
    readfile("full-server-path-to-image.png");
}

我知道這聽起來很簡單,但是我為此一直撓頭太久了。 最初,我堅信這與消息發送之前的編碼方式有關。 從來沒有想過這將是Outlook更改我的代碼。 第二,盡管微軟從不喜歡讓事情變得簡單.....永遠不會變老...大聲笑

暫無
暫無

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

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