摘要:配置在中,修改為,這樣的函數就可以發出正常的郵件了。沒找到哪兒改,所以我就直接用發送了。同時,郵件發送是一個耗時操作,不應該讓進程長時間等待。相對復雜一些,它會對郵件內容進行簽名,然后收件服務器通過獲取公鑰,核對簽名是否正確。
搭建Postfix
操作系統我個人比較喜歡CentOs,原生的系統都裝有,沒有的話 可以自己谷歌,這個很簡單 ,跳過。需要注意的是,Postfix默認只對本地IP的Client開放,因為我們是用PHP調用Postfix發送,所以沒有修改。
配置PHP在php.ini中,修改sendmail_path 為 /usr/sbin/sendmail -t -i , 這樣PHP的Mail函數就可以發出正常的郵件了。
用Mail函數直接發送會有些小麻煩,除了編碼,它會把from寫成 www-data@yourserverdomain.com 。沒找到哪兒改,所以我就直接用PHPMailer發送了。
$mail = $GLOBALS["LP_MAILER"]; $mail->CharSet = "UTF-8"; $mail->Encoding = "base64"; $mail->MessageID = $mid . "@".c("mail_domain"); $mail->SetFrom( c("mail_from") ); $mail->AddReplyTo( c("mail_from") ); $mail->Subject = $subject ; $mail->WordWrap = 50; $mail->MsgHTML($body); $mail->AddAddress( $to ); if(!$mail->Send()) { $GLOBALS["LP_MAILER_ERROR"] = $mail->ErrorInfo; return false; } else { $mail->ClearAddresses(); return true; }
在PHPMailer中發送的時候是可以隨意指定from的,不過別開心,from和實際發信用戶不同時,郵件在很多系統都會被標記成垃圾郵件的。同時,郵件發送是一個耗時操作,不應該讓web進程長時間等待。否則,稍微有點并發服務器就要掛了。怎么辦?那就做個實時隊列唄。
Redis隊列別用cron來做隊列,土。其實Redis從某版本開始,提供了阻塞讀的Pub/Sub服務。這個東西用來做實時隊列非常好用,但是如果這redis服務壓力很大的話,Pub/Sub是延遲很大的,所以在部署的時候一定要注意哦。要更好的使用這個隊列,強烈建議安裝phpredis的pecl擴展。
Pub/Sub 服務的邏輯很簡單。用命令行起一個PHP,訂閱到一個Channel,這個PHP就一直等著。Web程序只要用Redis把數據Pub到同一個Channel里邊,命令行的PHP就會獲得數據并觸發callback函數。
訂閱者:
ini_set("default_socket_timeout", -1); $redis = new Redis(); $redis->connect("127.0.0.1",6379); $channelname = c("mail_channel"); try { $redis->subscribe(array($channelname), "mailsend"); }catch(Exception $e) { echo $e->getMessage(); }
順便說下default_socket_timeout,如果你要用PHP長期連接socket,一定要設置這個值,不然會斷的。上邊的代碼會讓這個PHP一直保持運行狀態,不會結束,這就是為什么我推薦pecl擴展的原因,不用寫while,它自己會處理,有數據的時候,會回調 mailsend函數。
function mailsend($instance, $channelName, $message)
mailsend函數能獲取以上參數,其中$message最重要。一般把數組序列化后,通過publish傳遞過來。
發布者:
$redis = new Redis(); $redis->connect("127.0.0.1",6379); $info = array(); $info["to"] = $to; $info["subject"] = $subject; $info["content"] = $content; if($ret = $redis->publish( c("mail_channel") , serialize($info) )) { return send_result( "send to " . $to . " add to queue" ); } else return send_error( $ret );
很簡單,用起來也非常方便。上邊說過,因為調用mail函數的用戶是www-data,所以真實的發信箱是www-data@yourserverdomain.com ,而你想顯示為 easy@yourserverdomain.com 。要保證一致性其實很簡單,用easy的用戶啟動訂閱者PHP即可。
su easy nohup php sub.php &進一步適配反垃圾規則
為了防止別人冒用你的郵箱地址給公共郵箱發信,你可以啟用SPF和DKIM。
如果只是發信,SPF不用安裝什么的東西,直接在發信域名的DNS中加一條TXT記錄就可以了。格式大概是這樣:
v=spf1 ip4:106.3.32.60 ~all
這句話告訴了收件服務器,這個域名下的郵箱如果不是106.3.32.60 發過來的,直接標記為垃圾。
DKIM相對復雜一些,它會對郵件內容進行簽名,然后收件服務器通過DNS獲取公鑰,核對簽名是否正確。
具體的操作是給Postfix添加一個內容filter。詳細說明參考這里:https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-dkim-with-postfix-on-debian-wheezy
這些都做完以后,別人很難把自己發的垃圾郵件栽贓給你了。只要潔身自好,就可以順利的通過反垃圾規則。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/21211.html
摘要:所謂對稱加密,就是加密和解密使用同一秘鑰,這也是這種加密算法最顯著的缺點之一。非對稱加密算法由于對稱加密在通信加密領域的缺陷,年和提出了非對稱加密的概念。非對稱加密,其主要缺點之一就是慢,適合加密少量數據。 1. 加密的目的 加密不同于密碼,加密是一個動作或者過程,其目的就是將一段明文信息(人類或機器可以直接讀懂的信息)變為一段看上去沒有任何意義的字符,必須通過事先約定的解密規則才能將...
摘要:所謂對稱加密,就是加密和解密使用同一秘鑰,這也是這種加密算法最顯著的缺點之一。非對稱加密算法由于對稱加密在通信加密領域的缺陷,年和提出了非對稱加密的概念。非對稱加密,其主要缺點之一就是慢,適合加密少量數據。 1. 加密的目的 加密不同于密碼,加密是一個動作或者過程,其目的就是將一段明文信息(人類或機器可以直接讀懂的信息)變為一段看上去沒有任何意義的字符,必須通過事先約定的解密規則才能將...
摘要:解決方法如果使用頁面數據不超過一屏禁止滾動,那么即使變成了頁面也不會有什么變化。 作者:@micky思 @wupq @yewq 在H5的開發中,個人的制作頁面布局習性不同,多多少少會產生在真機上input的光標和鍵盤的彈出會出現的各種BUG,文中整理了部分遇到的問題,歡迎新增 ios移動端輸入框上浮導致輸入位置偏移 問題原因:遮罩層定位為fixed,當鍵盤彈起時,ios11以及以下...
摘要:解決方法如果使用頁面數據不超過一屏禁止滾動,那么即使變成了頁面也不會有什么變化。 作者:@micky思 @wupq @yewq 在H5的開發中,個人的制作頁面布局習性不同,多多少少會產生在真機上input的光標和鍵盤的彈出會出現的各種BUG,文中整理了部分遇到的問題,歡迎新增 ios移動端輸入框上浮導致輸入位置偏移 問題原因:遮罩層定位為fixed,當鍵盤彈起時,ios11以及以下...
摘要:解決方法如果使用頁面數據不超過一屏禁止滾動,那么即使變成了頁面也不會有什么變化。 作者:@micky思 @wupq @yewq 在H5的開發中,個人的制作頁面布局習性不同,多多少少會產生在真機上input的光標和鍵盤的彈出會出現的各種BUG,文中整理了部分遇到的問題,歡迎新增 ios移動端輸入框上浮導致輸入位置偏移 問題原因:遮罩層定位為fixed,當鍵盤彈起時,ios11以及以下...
閱讀 1949·2023-04-26 01:59
閱讀 3264·2021-10-11 11:07
閱讀 3295·2021-09-22 15:43
閱讀 3374·2021-09-02 15:21
閱讀 2549·2021-09-01 10:49
閱讀 901·2019-08-29 15:15
閱讀 3089·2019-08-29 13:59
閱讀 2829·2019-08-26 13:36