自從將wordpress從香港主機切換回阿里雲,郵件一直都是不能使用的狀態,因爲是個人博客站點,所以也沒怎麼關注這一功能,昨晚上一朋友跟我反饋註冊賬號收不了郵件,於是決定來處理一下。
因爲wordpress默認使用的是mail()函數推送郵件,這個是阿里雲虛擬主機不支持的,所以,我們需要改爲smtp方式發送郵件:
- 準備個郵箱,並且開啓smtp,阿里雲郵件推送,騰訊,163等都可以,我用的是同站點下的阿里雲企業郵箱。
- 安裝wordpress插件,我用的Easy WP SMTP(這裏我使用WP Mail SMTP插件時,配置好以後總是提示我出錯,所以改用的Easy WP SMTP),其中的smtp配置根據對應郵箱給出的提示進行就可以了,注意阿里雲服務器默認是關閉25端口的,所以Type of Encryption選擇None時,需要用80端口,我選擇的ssl,則是465端口,SMTP Host我是阿里雲企業郵箱,所以是smtp.mxhichina.com
- 阿里雲虛擬主機默認fsockopen函數是禁用的,這可能導致郵件無法發送,所以需要進入主機後臺,php高級設置--函數數值中,將PHP函數fsockopen設置爲啓動
以上設置過後,wordpress就可以發送郵件了,可以使用Easy WP SMTP的Test功能進行驗證。
另外,我還改了註冊及密碼找回裏面的一些小體驗問題:
1. 註冊和密碼找回郵件鏈接點擊後進入的不是重新設置密碼頁面,提示“您的密碼重設鏈接無效”;這個是由於鏈接前後帶有<>導致的,我們可以通過修改代碼,去掉<>來解決該問題
-
解決找回密碼時提示“您的密碼重設鏈接無效”:
打開WP根目錄下的 wp-login.php,找到如下代碼(374行左右):
<pre>$message .= '<' . network_site_url("wp-login.php?action=rp&key=$key&login=" . rawurlencode($user_login), 'login') . ">\r\n";</pre>
修改爲:
<pre>$message .= network_site_url("wp-login.php?action=rp&key=$key&login=" . rawurlencode($user_login), 'login') . "\r\n";</pre>
即去掉兩個尖括號即可。
-
解決新用戶註冊時,點擊郵件中的重置密碼鏈接提示“您的密碼重設鏈接無效”:
打開WP安裝目錄下的/wp-includes/pluggable.php,找到如下代碼(1741行左右):
<pre>$message .= '<' . network_site_url("wp-login.php?action=rp&key=$key&login=" . rawurlencode($user->user_login), 'login') . ">\r\n\r\n";</pre>
修改爲:
<pre>$message .= network_site_url("wp-login.php?action=rp&key=$key&login=" . rawurlencode($user->user_login), 'login') . "\r\n\r\n";</pre>
因爲是修改wordpress核心代碼,所以每次wordpress升級都需要重新修改。
當然,我們也可以通過修改functions.php來達到目的,我們可以加入以下函數
<pre class="EnlighterJSRAW" data-enlighter-language="null">/**
* 修復WordPress找回密碼提示“抱歉,該key似乎無效”問題
*/
function reset_password_message( $message, $key ) {
if ( strpos($_POST['user_login'], '@') ) {
$user_data = get_user_by('email', trim($_POST['user_login']));
} else {
$login = trim($_POST['user_login']);
$user_data = get_user_by('login', $login);
}
$user_login = $user_data->user_login;
$msg = __('有人要求重設如下帳號的密碼:'). "\r\n\r\n";
$msg .= network_site_url() . "\r\n\r\n";
$msg .= sprintf(__('用戶名:%s'), $user_login) . "\r\n\r\n";
$msg .= __('若這不是您本人要求的,請忽略本郵件,一切如常。') . "\r\n\r\n";
$msg .= __('要重置您的密碼,請打開下面的鏈接:'). "\r\n\r\n";
$msg .= network_site_url("wp-login.php?action=rp&key=$key&login=" . rawurlencode($user_login), 'login') ;
return $msg;
}
add_filter('retrieve_password_message', reset_password_message, null, 2);</pre>
以上函數因爲是在主題中,所以每次修改主題都需要重新增加函數。
2. 另外,我發送我發送郵件後,顯示的名字是Wordpress,這就有點尷尬了...於是又折騰了一小會
在functions.php中加入以下代碼:
<pre class="EnlighterJSRAW" data-enlighter-language="null">// 修改郵件發件人,地址
add_filter('wp_mail_from', 'new_mail_from');
add_filter('wp_mail_from_name', 'new_mail_from_name');
function new_mail_from($old) {
return '[email protected]';
}
function new_mail_from_name($old) {
return 'IT老五';
}
// end 修改郵件發件人,地址</pre>
將顯示的發件人改爲IT老五,發件郵箱顯示爲[email protected],當然,同樣的問題是每次切換主題後需要重新修改。
-
個人博客: IT老五 簡書:ThinkinLiu
源創不易,允許轉載,來源誤刪,多謝合作