摘要:配置在中,修改為,這樣的函數(shù)就可以發(fā)出正常的郵件了。沒找到哪兒改,所以我就直接用發(fā)送了。同時(shí),郵件發(fā)送是一個(gè)耗時(shí)操作,不應(yīng)該讓進(jìn)程長時(shí)間等待。相對復(fù)雜一些,它會(huì)對郵件內(nèi)容進(jìn)行簽名,然后收件服務(wù)器通過獲取公鑰,核對簽名是否正確。
搭建Postfix
操作系統(tǒng)我個(gè)人比較喜歡CentOs,原生的系統(tǒng)都裝有,沒有的話 可以自己谷歌,這個(gè)很簡單 ,跳過。需要注意的是,Postfix默認(rèn)只對本地IP的Client開放,因?yàn)槲覀兪怯肞HP調(diào)用Postfix發(fā)送,所以沒有修改。
配置PHP在php.ini中,修改sendmail_path 為 /usr/sbin/sendmail -t -i , 這樣PHP的Mail函數(shù)就可以發(fā)出正常的郵件了。
用Mail函數(shù)直接發(fā)送會(huì)有些小麻煩,除了編碼,它會(huì)把from寫成 [email protected] 。沒找到哪兒改,所以我就直接用PHPMailer發(fā)送了。
$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中發(fā)送的時(shí)候是可以隨意指定from的,不過別開心,from和實(shí)際發(fā)信用戶不同時(shí),郵件在很多系統(tǒng)都會(huì)被標(biāo)記成垃圾郵件的。同時(shí),郵件發(fā)送是一個(gè)耗時(shí)操作,不應(yīng)該讓web進(jìn)程長時(shí)間等待。否則,稍微有點(diǎn)并發(fā)服務(wù)器就要掛了。怎么辦?那就做個(gè)實(shí)時(shí)隊(duì)列唄。
Redis隊(duì)列別用cron來做隊(duì)列,土。其實(shí)Redis從某版本開始,提供了阻塞讀的Pub/Sub服務(wù)。這個(gè)東西用來做實(shí)時(shí)隊(duì)列非常好用,但是如果這redis服務(wù)壓力很大的話,Pub/Sub是延遲很大的,所以在部署的時(shí)候一定要注意哦。要更好的使用這個(gè)隊(duì)列,強(qiáng)烈建議安裝phpredis的pecl擴(kuò)展。
Pub/Sub 服務(wù)的邏輯很簡單。用命令行起一個(gè)PHP,訂閱到一個(gè)Channel,這個(gè)PHP就一直等著。Web程序只要用Redis把數(shù)據(jù)Pub到同一個(gè)Channel里邊,命令行的PHP就會(huì)獲得數(shù)據(jù)并觸發(fā)callback函數(shù)。
訂閱者:
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,一定要設(shè)置這個(gè)值,不然會(huì)斷的。上邊的代碼會(huì)讓這個(gè)PHP一直保持運(yùn)行狀態(tài),不會(huì)結(jié)束,這就是為什么我推薦pecl擴(kuò)展的原因,不用寫while,它自己會(huì)處理,有數(shù)據(jù)的時(shí)候,會(huì)回調(diào) mailsend函數(shù)。
function mailsend($instance, $channelName, $message)
mailsend函數(shù)能獲取以上參數(shù),其中$message最重要。一般把數(shù)組序列化后,通過publish傳遞過來。
發(fā)布者:
$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 );
很簡單,用起來也非常方便。上邊說過,因?yàn)檎{(diào)用mail函數(shù)的用戶是www-data,所以真實(shí)的發(fā)信箱是[email protected] ,而你想顯示為 [email protected] 。要保證一致性其實(shí)很簡單,用easy的用戶啟動(dòng)訂閱者PHP即可。
su easy nohup php sub.php &進(jìn)一步適配反垃圾規(guī)則
為了防止別人冒用你的郵箱地址給公共郵箱發(fā)信,你可以啟用SPF和DKIM。
如果只是發(fā)信,SPF不用安裝什么的東西,直接在發(fā)信域名的DNS中加一條TXT記錄就可以了。格式大概是這樣:
v=spf1 ip4:106.3.32.60 ~all
這句話告訴了收件服務(wù)器,這個(gè)域名下的郵箱如果不是106.3.32.60 發(fā)過來的,直接標(biāo)記為垃圾。
DKIM相對復(fù)雜一些,它會(huì)對郵件內(nèi)容進(jìn)行簽名,然后收件服務(wù)器通過DNS獲取公鑰,核對簽名是否正確。
具體的操作是給Postfix添加一個(gè)內(nèi)容filter。詳細(xì)說明參考這里:https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-dkim-with-postfix-on-debian-wheezy
這些都做完以后,別人很難把自己發(fā)的垃圾郵件栽贓給你了。只要潔身自好,就可以順利的通過反垃圾規(guī)則。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/21211.html
摘要:所謂對稱加密,就是加密和解密使用同一秘鑰,這也是這種加密算法最顯著的缺點(diǎn)之一。非對稱加密算法由于對稱加密在通信加密領(lǐng)域的缺陷,年和提出了非對稱加密的概念。非對稱加密,其主要缺點(diǎn)之一就是慢,適合加密少量數(shù)據(jù)。 1. 加密的目的 加密不同于密碼,加密是一個(gè)動(dòng)作或者過程,其目的就是將一段明文信息(人類或機(jī)器可以直接讀懂的信息)變?yōu)橐欢慰瓷先]有任何意義的字符,必須通過事先約定的解密規(guī)則才能將...
摘要:所謂對稱加密,就是加密和解密使用同一秘鑰,這也是這種加密算法最顯著的缺點(diǎn)之一。非對稱加密算法由于對稱加密在通信加密領(lǐng)域的缺陷,年和提出了非對稱加密的概念。非對稱加密,其主要缺點(diǎn)之一就是慢,適合加密少量數(shù)據(jù)。 1. 加密的目的 加密不同于密碼,加密是一個(gè)動(dòng)作或者過程,其目的就是將一段明文信息(人類或機(jī)器可以直接讀懂的信息)變?yōu)橐欢慰瓷先]有任何意義的字符,必須通過事先約定的解密規(guī)則才能將...
摘要:解決方法如果使用頁面數(shù)據(jù)不超過一屏禁止?jié)L動(dòng),那么即使變成了頁面也不會(huì)有什么變化。 作者:@micky思 @wupq @yewq 在H5的開發(fā)中,個(gè)人的制作頁面布局習(xí)性不同,多多少少會(huì)產(chǎn)生在真機(jī)上input的光標(biāo)和鍵盤的彈出會(huì)出現(xiàn)的各種BUG,文中整理了部分遇到的問題,歡迎新增 ios移動(dòng)端輸入框上浮導(dǎo)致輸入位置偏移 問題原因:遮罩層定位為fixed,當(dāng)鍵盤彈起時(shí),ios11以及以下...
摘要:解決方法如果使用頁面數(shù)據(jù)不超過一屏禁止?jié)L動(dòng),那么即使變成了頁面也不會(huì)有什么變化。 作者:@micky思 @wupq @yewq 在H5的開發(fā)中,個(gè)人的制作頁面布局習(xí)性不同,多多少少會(huì)產(chǎn)生在真機(jī)上input的光標(biāo)和鍵盤的彈出會(huì)出現(xiàn)的各種BUG,文中整理了部分遇到的問題,歡迎新增 ios移動(dòng)端輸入框上浮導(dǎo)致輸入位置偏移 問題原因:遮罩層定位為fixed,當(dāng)鍵盤彈起時(shí),ios11以及以下...
摘要:解決方法如果使用頁面數(shù)據(jù)不超過一屏禁止?jié)L動(dòng),那么即使變成了頁面也不會(huì)有什么變化。 作者:@micky思 @wupq @yewq 在H5的開發(fā)中,個(gè)人的制作頁面布局習(xí)性不同,多多少少會(huì)產(chǎn)生在真機(jī)上input的光標(biāo)和鍵盤的彈出會(huì)出現(xiàn)的各種BUG,文中整理了部分遇到的問題,歡迎新增 ios移動(dòng)端輸入框上浮導(dǎo)致輸入位置偏移 問題原因:遮罩層定位為fixed,當(dāng)鍵盤彈起時(shí),ios11以及以下...
閱讀 1973·2023-04-26 01:59
閱讀 3276·2021-10-11 11:07
閱讀 3307·2021-09-22 15:43
閱讀 3388·2021-09-02 15:21
閱讀 2572·2021-09-01 10:49
閱讀 912·2019-08-29 15:15
閱讀 3100·2019-08-29 13:59
閱讀 2839·2019-08-26 13:36