DedeCMS自定義表單提交后發(fā)送到指定郵箱的功能需要二次開發(fā),但目前的許多方法都是寫死字段,而且站長(zhǎng)郵箱不能批量給多個(gè)郵箱發(fā)布,用起來(lái)不太人性化。下面提供能同時(shí)給多個(gè)QQ郵箱和163郵箱的方法。
相關(guān)準(zhǔn)備
1、郵箱設(shè)置
QQ郵箱和163郵箱都支持POP3,開啟方法參考文章《DedeCMS表單提交發(fā)送到指定郵箱與前臺(tái)設(shè)置》。
這里要注意的是
1)smtp服務(wù)器的用戶密碼是授權(quán)碼而不是郵箱密碼;
2)smtp服務(wù)器端口應(yīng)填465,貌似25端口會(huì)出問(wèn)題,沒(méi)測(cè)試過(guò)。
2、第三方郵件工具
下載PHPMailer,下載地址
https://pan.baidu.com/s/1pLGC18v 密碼: f8a4
把里面的四個(gè)文件放在/plus/文件夾下即可。
3、新增變量,收件人郵箱,可根據(jù)實(shí)際情況增加多個(gè),不同的變量名即可
變量名稱:cfg_shoujianren //其他的可命名為cfg_shoujianrena 變量值: 指定的收件人郵箱地址 //如:570521548@qq.com 變量類型:文本 參數(shù)說(shuō)明:收件人一 所屬組:站點(diǎn)設(shè)置
增加郵件發(fā)送
打開plus/diy.php,找到
$id = $dsql->GetLastID();
在它的前面一行加入
//郵件發(fā)送開始 $emailbody = ''; foreach($diy->getFieldList() as $field=>$fieldvalue) { $emailbody .= $fieldvalue[0].':'.${$field}.'<br />'; } global $cfg_smtp_server, $cfg_adminemail, $cfg_smtp_port, $cfg_smtp_usermail, $cfg_smtp_password, $cfg_webname, $cfg_basehost, $cfg_smtp_user; //引入PHPMailer的核心文件 使用require_once包含避免出現(xiàn)PHPMailer類重復(fù)定義的警告 require_once("class.phpmailer.php"); require_once("class.smtp.php"); //實(shí)例化PHPMailer核心類 $mail = new PHPMailer(); //是否啟用smtp的debug進(jìn)行調(diào)試 開發(fā)環(huán)境建議開啟 生產(chǎn)環(huán)境注釋掉即可 默認(rèn)關(guān)閉debug調(diào)試模式 $mail->SMTPDebug = 0; //使用smtp鑒權(quán)方式發(fā)送郵件 $mail->isSMTP(); //smtp需要鑒權(quán) 這個(gè)必須是true $mail->SMTPAuth=true; //鏈接qq域名郵箱的服務(wù)器地址 $mail->Host = $cfg_smtp_server; //設(shè)置使用ssl加密方式登錄鑒權(quán) $mail->SMTPSecure = 'ssl'; //設(shè)置ssl連接smtp服務(wù)器的遠(yuǎn)程服務(wù)器端口號(hào),以前的默認(rèn)是25,但是現(xiàn)在新的好像已經(jīng)不可用了 可選465或587 $mail->Port = $cfg_smtp_port; //設(shè)置smtp的helo消息頭 這個(gè)可有可無(wú) 內(nèi)容任意 // $mail->Helo = 'Hello smtp.qq.com Server'; //設(shè)置發(fā)件人的主機(jī)域 可有可無(wú) 默認(rèn)為localhost 內(nèi)容任意,建議使用你的域名 $mail->Hostname = $cfg_basehost; //設(shè)置發(fā)送的郵件的編碼 可選GB2312 我喜歡utf-8 據(jù)說(shuō)utf8在某些客戶端收信下會(huì)亂碼 $mail->CharSet = 'UTF-8'; //設(shè)置發(fā)件人姓名(昵稱) 任意內(nèi)容,顯示在收件人郵件的發(fā)件人郵箱地址前的發(fā)件人姓名 $mail->FromName = $cfg_smtp_user; //smtp登錄的賬號(hào) 這里填入字符串格式的qq號(hào)即可 $mail->Username = $cfg_smtp_usermail; //smtp登錄的密碼 使用生成的授權(quán)碼(就剛才叫你保存的最新的授權(quán)碼) $mail->Password = $cfg_smtp_password; //設(shè)置發(fā)件人郵箱地址 這里填入上述提到的“發(fā)件人郵箱” $mail->From = $cfg_smtp_usermail; //郵件正文是否為html編碼 注意此處是一個(gè)方法 不再是屬性 true或false $mail->isHTML(true); //設(shè)置收件人郵箱地址 該方法有兩個(gè)參數(shù) 第一個(gè)參數(shù)為收件人郵箱地址 第二參數(shù)為給該地址設(shè)置的昵稱 不同的郵箱系統(tǒng)會(huì)自動(dòng)進(jìn)行處理變動(dòng) 這里第二個(gè)參數(shù)的意義不大 $mail->addAddress($cfg_shoujianren,$cfg_smtp_user); //添加多個(gè)收件人 則多次調(diào)用方法即可,如下 // $mail->addAddress('$cfg_shoujianren2','$cfg_smtp_user'); //添加該郵件的主題 $mail->Subject = $diy->name; //添加郵件正文 上方將isHTML設(shè)置成了true,則可以是完整的html字符串 如:使用file_get_contents函數(shù)讀取本地的html文件 $mail->Body = $emailbody; //為該郵件添加附件 該方法也有兩個(gè)參數(shù) 第一個(gè)參數(shù)為附件存放的目錄(相對(duì)目錄、或絕對(duì)目錄均可) 第二參數(shù)為在郵件附件中該附件的名稱 // $mail->addAttachment('./d.jpg','mm.jpg'); //同樣該方法可以多次調(diào)用 上傳多個(gè)附件 // $mail->addAttachment('./Jlib-1.1.0.js','Jlib.js'); if(!$mail->send()) { echo "Fail to send. <p>"; echo "Cause of the error: " . $mail->ErrorInfo; exit; } //郵件發(fā)送結(jié)束
其他問(wèn)題
發(fā)現(xiàn)IIS有些沒(méi)有OpenSLL和Sockets,導(dǎo)致不能正常發(fā)送郵件,可以在根目錄新建一個(gè)文件名為test.php的文件,內(nèi)容如下
<?php phpinfo(); ?>
在瀏覽器輸入:http://域名/test.php ,如下圖所示
↑Sockets Support值為enabled
↑OpenSSL support值為enabled
如果不是這兩個(gè)值,就有兩種可能,沒(méi)有開通或者缺失。
1、 首先檢查php.ini中,下面字段是否存在
;extension=php_openssl.dll
如果存在的話去掉前面的注釋符";", 如果不存在這行,那么添加extension=php_openssl.dll。
2、如果沒(méi)有 php_openssl.dll ,點(diǎn)擊下載 php_openssl.dll
下載下來(lái)有很多個(gè)php_openssl,找到你相應(yīng)php版本下面的php_openssl。
3、 重啟Apache或者IIS
至此,OpenSSL功能就開啟了。