开发者

Gmail removing the links tags , how to avoid this

I'm trying to send with function mail(); rich text containing links ; I'm sending this kind of code...

 Please,  access <a href="http://www.site.md/contact/en/"> Contact </a> to send all these information

throw firebug i can see that link tags was removed , code becoming like this

 Please,  access <a>Contact</a> to send all these information

I need this script , after banning the person who violated rules , to send email to tell the reason why we banned him . On another email services email comes without problems , what is my mistake , sorry for my English , down i'll show a part from script for sending email , the important one..

     // Set and wordwrap message body
 $body = "From: $name\n\n";
 $body .= "Message: $message";
 $body = wordwrap($body, 70);

 // Build header

 $headers  = 'MIME-Version: 1.0' . "\r\n";
 $headers .= 'Content-type: text/html; charset=utf-8' . "\r\n";

 $headers .= 开发者_开发问答"From: $email\n";
 if ($cc == 1) {
  $headers .= "Cc: $email\n";
 }
 $headers .= "X-Mailer: PHP/Contact";


 // Send email
 if(!@mail($to, $subject, $body, $headers)) { 
  echo '<b> ERROR ! </b> Unfortunately, a server issue prevented delivery of your message<br />'; }


Unless you are doing something to $body in the code you have not posted here, my guess is that it is wordwrap() that causes the problem. In the php manual is a user-contributed function which might help: http://www.php.net/manual/en/function.wordwrap.php#89782


Part of the problem is the long lines, but wordwrap() is not sufficient to solve that.

An email could have arbitrarily long lines, but these are transmitted over a protocol which only allows short lines. So long lines have to be split. The protocol tags lines which have been split by adding = to then end of them so what starts out looking like this.

Characters       2         3         4         5         6         7
12346790123456789012345678901234567890132456789012345678901234567890123456789

This is a long line with text which goes beyond the 78 character limit imposed by the protocol

ends up looking like this

This is a long line with text which goes beyond the 78 character limit=
imposed by the protocol

Using = like that though means that = can't be used in your message, so it has to be escaped. So you need to replace = in your message with =3D (where 3D is the hex code for =).

It's also wise to replace any control characters (with ascii code < 32) with =xx and anything with ascii code over 126 too. I use these functions to do this, you then just need to do $message=encodeText($message) before you send and the problem should go away.

function encodeText($input) {
  // split input into lines, split by \r\n, \r or \n
  $lines=preg_split("/(?:\r\n|\r|\n)/", $input);
  $text="";

  // for each line, encode it into a 78 char max line.
  for ($i=0; $i<count($lines); $i++) {
     $text.=encodeLine($lines[$i]);
  }

  return $text;
}

/**
 * This splits a line into a number of pieces, each shorter than the 78 char
 * limit. It also add continuation marks (i.e. =) to then end of each piece
 * of the resulting line, and escapes any = characters, control characters
 * or characters with bit 8 set, and backspace.
 * @return a multiline string (with /r/n linebreaks)
 */
function encodeLine($line) {
  $split=Array();
  $result="";
  $piece='';
  $j=0;
  for ($i=0; $i<strlen($line); $i++) {
     // if you've just split a line, you'll need to add an = to the
     // end of the previous one
     if ($j>0 && $piece=="") $split[$j-1].="=";

     // replace = and not printable ascii characters with =XX
     if (ord($line{$i})==0x3D) {
        $piece.="=3D";
     } else if (ord($line{$i})<32) {
        $piece.="=".bin2hex($line{$i});
     } else if (ord($line{$i})>126) {
        $piece.="=".bin2hex($line{$i});
     } else {
        $piece.=$line{$i};
     }

     // if the resulting line is longer than 71 characters split the line
     if (strlen($piece)>=72) {
        $split[$j]=$piece;
        $piece="";
        $j++;
     }
  }

  // the last piece being assembled should be added to the array of pieces
  if (strlen($piece)>0) $split[]=$piece;

  // if a piece ends in whitespace then replace that whitespace with =20
  // for a space or =09 for a tab.
  for ($i=0; $i<count($split); $i++) {
     $last=substr($split[$i],-1);
     if ($last=="\t") $last="=09";
     if ($last==" ") $last="=20";
     $split[$i]=substr($split[$i],0,strlen($split[$i])-1).$last;
  }

  // assemble pieces into a single multiline string.
  for ($i=0; $i<count($split); $i++) {
     $result.=$split[$i]."\r\n";
  }

  return $result;
}


This might be to late but, oh well just figure it out. At least that's what I'm seeing here. Basically I'm generating the Newsletter dynamic based on some data and when I found inside a string a specific syntax I had to replace it with a anchor tag. Anyway, here it is:

Bad formatting:

"<a href='" + url + "'>" + name + "</a>";

Good formatting:

'<a href="' + url + '">' + name + '</a>';

Straight answer, use double-quotes for href attribute.


Try this out , Use stripslashes() with the email body and it should worked perfectly fine

$body= stripslashes($mail_message);
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜