Gmail удаляет теги ссылок, как этого избежать - PullRequest
7 голосов
/ 04 марта 2010

Я пытаюсь отправить с функцией mail (); форматированный текст, содержащий ссылки; Я посылаю такой код ...

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

бросить firebug Я вижу, что теги ссылок были удалены, код становится таким

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

Мне нужен этот сценарий после того, как забанить человека, который нарушил правила, чтобы отправить электронное письмо, чтобы сообщить причину, по которой мы его забанили. На других почтовых сервисах электронная почта приходит без проблем, в чем моя ошибка, извините за мой английский, но внизу я покажу часть из скрипта для отправки электронной почты, важную ...

     // 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 />'; }

Ответы [ 4 ]

2 голосов
/ 04 марта 2010

Если вы не делаете что-то для $ body в коде, который вы не разместили здесь, я думаю, что именно wordwrap () вызывает проблему. В руководстве по PHP есть пользовательская функция, которая может помочь: http://www.php.net/manual/en/function.wordwrap.php#89782

0 голосов
/ 26 ноября 2017

Попробуйте, используйте stripslashes() с телом электронной почты, и оно должно прекрасно работать

$body= stripslashes($mail_message);
0 голосов
/ 25 февраля 2014

Часть проблемы - длинные строки, но wordwrap() недостаточно для решения этой проблемы.

Письмо может иметь произвольно длинные строки, но они передаются по протоколу, который допускает только короткие строки. Таким образом, длинные линии должны быть разделены. Протокол помечает строки, которые были разделены путем добавления = к их концу, так что вначале это выглядит следующим образом.

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

выглядит так

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

Использование = как это означает, что = не может быть использовано в вашем сообщении, поэтому его нужно экранировать. Поэтому вам нужно заменить = в вашем сообщении на = 3D (где 3D - шестнадцатеричный код для =).

Также целесообразно заменить любые управляющие символы (с кодом ascii <32) на = xx и все, что имеет код ascii более 126. Я использую эти функции, чтобы сделать это, тогда вам просто нужно сделать <code>$message=encodeText($message) перед отправкой, и проблема должна исчезнуть.

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;
}
0 голосов
/ 27 июня 2013

Это может быть поздно, но, ну, хорошо, разберись. По крайней мере, это то, что я вижу здесь. По сути, я генерирую динамический информационный бюллетень на основе некоторых данных, и когда я нашел внутри строки определенный синтаксис, мне пришлось заменить его тегом привязки. Во всяком случае, вот оно:

Плохое форматирование:

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

Хорошее форматирование:

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

Прямой ответ, используйте двойные кавычки для атрибута href.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...