php文字列処理(メール処理)

5581 ワード

今日文書メールの注意機能をすると、システムから送信されたメールがいつも表示されていないことに気づきました.メールの送信方法を呼び出す前に記録されたログは完全です.検索元はメール形式で、メール明細に長さ制限があります.
ps 1:メール文字制限
          2   。       (MUST)   998 ,  (SHOULD)   78 ,
  CRLF。

ps 2:メール本文改行文字規定
         US-ASCII         。  2   ,  :
  -CR,LF       CRLF,             。
  -          (MUST)   998 ,  (SHOULD)   78 ,  CRLF。

(原文リンク):http://hi.baidu.com/zhufangtian/item/ba54cb5f09780413abf6d74b
したがって、メールを送信するときは、メール文字列を改行する必要があります.
php substr()関数で文字列を長さ別に切り替えようと試み始めたが、メール本文にhtmlタグが多く、固定長文字のみを判断した場合、多くのタグの組み合わせを切り替えよう(がtとdの間で改行を切り替えようとした)ので、元のhtmlタグが取り外され、本来の意味が損なわれ、表示異常になった.
その後、codeigniterフレームワークメール送信プラグインをテストし、このような単行超長メールの送信をサポートしていることを発見し、ソースコードを表示します.そのメール本文の処理方法を分析し、
最終処理手順:
1.文字列をすべて小文字に変換
2.戻り改行を
に置き換えます.本プロジェクトのメールはhtml形式の
3.余分なスペースを取り除く
4.aタグの内容を置き換え、タグの内容が長すぎて切断されないようにする
5.wordwrapメソッド文字列の自動改行を処理します.()
実際の項目で改行文字がrでなければならないことを発見した(windowsの場合は実際にテストし、ネット上ではrと言うことが多く、個人的には間違っているような気がする)ので、wordwrapメソッドの置換パラメータを規定しなければならない.
切断後のラベル改行trとspanの間に改行文字があり、スペースがありません.
<tr
span='3'>

6.aタグの内容を置換する
ps 1:改造後のメール処理方法
//      
function __mailreplace($content, $type) {
	//       (             ,   wordwrap           )
	if (strtolower ( $type ) == "html") {
		$content = ltrim ( $content );
		$content = str_replace ( array ('
', '\r
' ), "<br/> ", $content ); $content = str_replace ( array (chr ( 13 ), chr ( 13 ) . chr ( 10 ) ), "<br/> ", $content ); // $content = str_replace ( " ", " ", $content ); // , $content = str_replace ( "</tr>", "</tr> ", $content ); } else { $content = str_replace ( array ("<br>", "<br/>" ), "\r
", $content ); $content = str_replace ( " ", " ", $content ); } // $content = preg_replace ( "| +|", " ", $content ); // a ( ) $unwrap = array (); if (preg_match_all ( '|(<a.*>.*</a>)|U', $content, $matches )) { for($i = 0; $i < count ( $matches ['0'] ); $i ++) { $unwrap [] = $matches ['1'] [$i]; $content = str_replace ( $matches ['1'] [$i], "{{a-link" . $i . "}}", $content ); } } // ( , html ) $content = wordwrap ( $content, 75, "\r
", FALSE ); // a if (count ( $unwrap ) > 0) { foreach ( $unwrap as $key => $val ) { $content = str_replace ( "{{a-link" . $key . "}}", $val, $content ); } } return $content; }

ps 3:codeigniterソース:
public function word_wrap($str, $charlim = '') {
  // Se the character limit
  if ($charlim == '') {
   $charlim = ($this->wrapchars == "") ? "76" : $this->wrapchars;
  }
  
  // Reduce multiple spaces        
  $str = preg_replace ( "| +|", " ", $str );
  
  // Standardize newlines          
  
  if (strpos ( $str, "\r" ) !== FALSE) {
   $str = str_replace ( array ("\r
", "\r" ), "
", $str ); } // If the current word is surrounded by {unwrap} tags we'll // strip the entire chunk and replace it with a marker. ( a ) $unwrap = array (); if (preg_match_all ( "|(\{unwrap\}.+?\{/unwrap\})|s", $str, $matches )) { for($i = 0; $i < count ( $matches ['0'] ); $i ++) { $unwrap [] = $matches ['1'] [$i]; $str = str_replace ( $matches ['1'] [$i], "{{unwrapped" . $i . "}}", $str ); } } // Use PHP's native public function to do the initial wordwrap. // We set the cut flag to FALSE so that any individual words that are // too long get left alone. In the next step we'll deal with them. // $str = wordwrap ( $str, $charlim, "
", FALSE ); // Split the string into individual lines of text and cycle through them $output = ""; foreach ( explode ( "
", $str ) as $line ) { // Is the line within the allowed character count? // If so we'll join it to the output and continue if (strlen ( $line ) <= $charlim) { $output .= $line . $this->newline; continue; } $temp = ''; while ( (strlen ( $line )) > $charlim ) { // If the over-length word is a URL we won't wrap it if (preg_match ( "!\[url.+\]|://|wwww.!", $line )) { break; } // Trim the word down $temp .= substr ( $line, 0, $charlim - 1 ); $line = substr ( $line, $charlim - 1 ); } // If $temp contains data it means we had to split up an over-length // word into smaller chunks so we'll add it back to our current line if ($temp != '') { $output .= $temp . $this->newline . $line; } else { $output .= $line; } $output .= $this->newline; } // Put our markers back // if (count ( $unwrap ) > 0) { foreach ( $unwrap as $key => $val ) { $output = str_replace ( "{{unwrapped" . $key . "}}", $val, $output ); } } return $output; }