1. 程式人生 > >封裝PHP mail函式傳送HTML郵件並使用中文發件人且自定義發件人郵箱地址

封裝PHP mail函式傳送HTML郵件並使用中文發件人且自定義發件人郵箱地址

 在寫PHP程式碼時,傳送郵件著實是一件比較讓人鬱悶的事情,PHP預設提供的mail函式太弱了,很難琢磨清楚到底該怎麼用。雖然也有很一些做得比較好得第三方庫,可以提供相當強大的郵件功能,尤其是可以很簡單的配置其使用gmail的stmp服務來發送郵件。但是使用這些庫通過stmp來發送郵件就不能隨意指定發件地址了,也沒辦法使用到預設mail函式所提供的呼叫立即返回,後臺sendmail從等待列表中自動傳送郵件的功能了。再加上有時就是為了寫個小指令碼,比如每天監控一下伺服器狀態,然後傳送郵件報告的小功能,動用這種第三方庫就有點殺雞用牛刀了。通過不斷的搜尋+嘗試,終於搞定了使用PHP預設mail函式傳送郵件時讓人模不著頭腦的四大金剛:
  1. 怎樣傳送HTML格式郵件
  2. 主題給填上中文怎麼是亂碼啊!
  3. 收件人中除了填上收件人的郵件,還要填上名字,而且還是中文的
  4. 發件人要填上網站的名字,讓人收到郵件的時候不是光禿禿的顯示郵件地址,那太搓了,就像下面這張圖

閒話不再說了,直接上程式碼,相信都能看懂的。

// 對郵件地址進行中文的UTF-8編碼轉化
function format_mail_address($address){
  if(preg_match("|<([^<]+)>|", $address, $matches)){
    $name = mb_substr($address, 0, strpos($address, '<'));
    $name = trim($name);
    $mail = $matches[1];
    $address = "=?UTF-8?B?".base64_encode($name)."?= " . "<$mail>";
  }
  return $address;
}

// 傳送html格式的郵件
function html_mail($from, $to, $subject, $body){
  if(preg_match("|<([^<]+)>|", $from, $matches)){
    $from_name = mb_substr($from, 0, strpos($from, '<'));
    $from_mail = $matches[1];
    $from = "=?UTF-8?B?".base64_encode($from_name)."?= " . "<$from_mail>";
  }else{
    $from_mail = $from;
  }
  $headers[] = "From: $from";
  $headers[] = "X-Mailer: PHP";
  $headers[] = "MIME-Version: 1.0";
  $headers[] = "Content-type: text/html; charset=utf8";
  $headers[] = "Reply-To: $from_mail";
  $subject = "=?UTF-8?B?".base64_encode($subject)."?=";
  if(is_array($to)){
    foreach($to as $mail)
      $to_mails[] = format_mail_address($mail);
    $to = join(", ", $to_mails);
  }
  mail($to, $subject, $body, join("\r\n", $headers), "-f $from_mail");
}

函式使用可以參照下面的例子:

html_mail(
    "老谷自言自語 <[email protected]>",
    array(
        "使用者A <[email protected]>",
        "使用者B <[email protected]>"),
    "這是一封測試郵件",
    "<html><body><h1 style='color:red'>
      感謝黨,感謝政府,感謝大中華區域網,給我這個傳送郵件的機會。
    </h1></body></html>"
);

PHP mail函式呼叫sendmail傳送郵件,請儘量在linux系統中嘗試以上程式碼

注意:以上程式碼執行可能存在國內郵箱中收不到的情況,因為可能包含敏感詞彙。

如我的測試中,gmail收到郵件並置於垃圾郵箱中,而163沒有收到。





相關推薦

封裝PHP mail函式傳送HTML郵件使用中文定義郵箱地址

 在寫PHP程式碼時,傳送郵件著實是一件比較讓人鬱悶的事情,PHP預設提供的mail函式太弱了,很難琢磨清楚到底該怎麼用。雖然也有很一些做得比較好得第三方庫,可以提供相當強大的郵件功能,尤其是可以很簡單的配置其使用gm

[php]mail函式傳送郵件(正文+附件+中文)

<?php $from = "[email protected]"; $to = "[email protected], [email protected]"; $subject = "郵件主題"; $subject = "=?UTF-8

php mail函式傳送郵件header過長

今天用php的mail函式傳送一個郵件,其中header部分是用html拼出來的一個表格,但發出來之後會發現表格會有部分顯示不正常,比如"<tr><td>a</td><td>b</td><td>c<

PHP中呼叫mail()函式傳送郵件所需sendmail的基本配置和html格式的郵件資訊

首先從http://glob.com.au/sendmail上下載sendmail壓縮包;並將其解壓到D:盤中(一般最好不要解壓到C:盤,且目錄不要太長)。 設定一下PHP.ini檔案: [mail function] ; For Win32 only. ; http://

Centos7 開啟mail函式傳送郵件及sendmail啟動問題

自從換了阿里雲伺服器之後,我也就沒有理過部落格的回覆評論郵件通知功能。前2天有朋友跟我說,之前評論都有郵件通知,現在怎麼沒有了。我想應該是沒有開始支援mail()函式的語言,VPS的好處就是自己可以隨便折騰。於是研究下怎麼開啟mail()函式,本文做個記錄,方便以後可能用到。 我的阿里雲伺服

使用linux的mail命令傳送html格式的郵件

今天在shell中使用mail命令傳送郵件,希望傳送表格,就用了html的格式來發送。但是開始的時候發現Outlook收到的顯示為html的原始碼, 就查閱了下相關資料,問題解決了,記錄下,以備以後再用: linux使用mail函式傳送需要新增 header引數,

解決163/sohu/sina不能夠收到PHP MAIL函式發出郵件的問題

1      最近準備改改自己的個人主頁,加上發郵件到功能,發現居然不是那麼好用。gmail和msn可以收到郵件,但是163/sina/sohu的郵箱居然都收不到,非常鬱悶。其實程式碼也很簡單。 php manual 已經說得相當清楚了。       但是,如果我使用Lin

PHP-----Mail函式

Mail函式配置php.ini 和 sendmail.ini 1.有一些如果是整合環境已經有了sendmail不需要再進行配置 否則需要從https://www.glob.com.au/sendmail/下載sendmail 2.配置詳情:  2.1 php.ini

python傳送html郵件

轉至:https://www.cnblogs.com/gongxr/p/7355326.html # 傳送html內容的郵件 import smtplib, time, os from email.mime.text import MIMEText from email.header impor

SprongBoot傳送郵件(二)傳送HTML郵件

在“SprongBoot傳送郵件(一)傳送簡單文字郵件HelloWorld”的基礎上新增如下方法: /** * @param to 郵件收件人 * @param subject 郵件主題 * @param content 郵件

如何在Windows系統中安裝sendmail使用PHP mail()函式

php mail()函式在windows不能用,需要安裝sendmail。1.從http://glob.com.au/sendmail/下載sendmail.zip2.解壓到C:下,例如C:\PHP\sendmail,最好短路徑,長路徑名有可能產生問題。3.修改php.in

java使用javax.mail傳送電子郵件:設定賬號、密碼、主題、文字、附件

全棧工程師開發手冊 (作者:欒鵬) java使用javax.mail包傳送電子郵件。這個例項可傳送多附件。 這裡使用163郵箱進行測試。可以設定賬號、密碼、主題、文字內容、附件 測試程式碼 public static void mai

郵件例程-JavaMail-傳送HTML郵件

scrIPT> if (document.all!=null){ if (typeof(parent.parent.BoardTitle)!=´undefined´) if (typeof(parent.parent.BoardTitle.setCount)!="und

傳送html郵件是a標籤中的url不顯示問題

最近做到一個找回密碼功能,需要郵箱跳轉修改密碼頁面。但是碰到一個問題,傳送郵件之後a標籤中的href屬性不見了,url也不見了。但是我把url改成百度的連結就可以。困擾了我好幾個小時。結果只是因為在url中沒有加ht

使用PHP利用phpmailer傳送電子郵件

先來幾句廢話:     phpMailer是一個非常強大的php傳送郵件類,可以設定傳送郵件地址、回覆地址、郵件主題、html網頁,上傳附件,並且使用起來非常方便。      phpMailer的特點:     1、在郵件中包含多個 TO、CC、BCC 和 REPLY-TO

vue 封裝定義

lec com != 封裝 data als storage -m .com 先說說組件的結構 最好單獨放一個文件夾,有依賴的話裝依賴 Sjld.vue 內容 <template id="sjld"> <label >

odoo開發筆記-定義郵件模板

.cn 定義 圖片 image bsp img cnblogs clas 開發者模式 1. 首先激活開發者模式 2. 點擊設置 - Email - 模板 - “選擇你需要修改的模板” 我們這裏以報價單的為例:quote order 3

PHP之文引用與定義函數

urn global sta include 賦值 傳遞 語法 功能實現 頁面 PHP文件間的引用 include語言結構 格式:mixed include(string resource); 將一個資源文件resource載入到當前PHP程序中; resource資

php curl返回false填坑記-curl呼叫微信建立定義選單返回false

首先宣告一點,這個錯誤可能在你的開發生涯中不會遇到,除非你直接複製了微信公眾平臺的api地址。不過這應該算是php中curl擴充套件的一個bug,為什麼是bug呢?讓我們仔細來看。 下邊是示例程式碼,程式碼的功能是呼叫微信公眾平臺的建立自定義選單介面來建立自定義選單。 建

用js將HTML的Table匯出為Excel(可定義:表格樣式+Excel名稱)

<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <script type="text/javascript" la