2016-08-29 4 views
0

電子メールの送信と追跡のアプリケーションで作業していますが、私は把握できない問題に遭遇しています。私は私の電子メールの追跡イメージが私に欲しいが、私はいくつかの奇妙な振る舞いをしている。現在、私はbase64でエンコードされた電子メールを送信しています。 HTMLメッセージの本文では、自分のサーバー上のPHPファイルへのリンクを持つHTMLイメージタグを使用しています。このファイルは、次のPHPコードを使用して画像を返します。PHPを使用してBase64でエンコードされた電子メールで画像を返す

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

これは奇妙なところです。 Outlook電子メールクライアントでメッセージを表示すると、イメージは表示されません(赤い "X"イメージアイコンが表示されます)。他の正常にリンクされた画像はうまく表示されます。 Gmailで同じメッセージを表示すると、すべての画像を見ることができます。画像が一部の電子メールクライアントでうまく機能するが、それらのすべてではないというのは本当に奇妙なことだ。

私はこの問題が、base64でメッセージのエンコードに変更したときに気付きました。メッセージのエンコードを開始する前に、どの電子メールクライアントでもすべての画像を表示できました。私は、これはコンテンツエンコーディングタイプと関係があると私に言っていますが、どうやって修正するのか分かりません。どんな助けもありがとう!

$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 = "[email protected]" 
$headers = "MIME-Version: 1.0\r\n"; 
$headers .= "From: [email protected]\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); 
+0

Outlookは画像のために終わる '.php'ファイルが好きではないかもしれません。確かに、私はOutlookを使用していません。 – tkausl

+0

私はOutlookがphpがイメージを返すことができることを知っているので、私はメッセージをエンコードする前にそれは働いた。 – Austin

答えて

0

誰もが、私はそれがすべての電子メールクライアントは、URLをエンコードする方法に沸く考え出しこのような何かにぶつかる念のために:ここ

は、私がメッセージを送信するために使用しているPHPコードです。元のコードでは、イメージsrc属性内に2つのパラメータを持つURLを使用しています。このように:その他の電子メールクライアントが&amp;

に変換せず &シンボルにそれがある道を残して十分にスマートです

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

:OutlookはこのURLを処理するとき

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

それは次のように変更を取得します

私のライブコードでは、$_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が自分のコードを変更することは決して考えられませんでした。 Microsoftは物事を簡単にするのが決して好きではありませんが.....決して古いものはありません... lol

関連する問題