作为一个个人开发者,在开发网页服务的时候,势必要用到ssl证书,尤其是小程序,域名必须要求https。作为个人,一年几百块的证书多少还是有点肉疼的,当然个人项目使用免费的证书也没啥大问题(在我看来唯一的问题就是只支持单域名,都免费了还要啥自行车是不)。
但是自从证书有效期从一年改为三个月,问题就来了。原本我一年只需要统一更换一次即可,现在每三个月就需要处理一次,而且像服务平台(如:阿里云)在过期前一个月就会每天给你发送一封邮件、短信等提醒你更新,当然对方也是为了避免你的业务收到影响。
阿里云是每一个证书发送一篇邮件,由于每个证书的过期时间不一致,有可能今天更解决这个,明天还需要再更新另一个。然后想着能不能把所有快过期的汇总到一篇邮件里面,如果也方便查阅,咱说干就干
以下代码语言为PHP,所用框架为ThinkPHP5.1
封装一个获取证书相关信息的方法
“`
function getSSL(string $domain_name) { try { $errno = 0; $err_str = ''; $timeout = 30; $ssl_info = stream_context_create(["ssl" => ["capture_peer_cert" => TRUE]]); $stream = stream_socket_client("ssl://" . $domain_name . ":443", $errno, $err_str, $timeout, STREAM_CLIENT_CONNECT, $ssl_info); if ( ! $stream) { throw new Exception($err_str, $errno); } $cert_resource = stream_context_get_params($stream); $certificate = $cert_resource['options']['ssl']['peer_certificate']; $cert_info = openssl_x509_parse($certificate); fclose($stream); return $cert_info; } catch (Exception $exception) { fail_return($exception->getCode(), $exception->getMessage()); } }
“`
调用上面的方法
“`
public function index() { try { $result = self::getSSL("16url.cn"); if ($result['validFrom_time_t'] > time() || $result['validTo_time_t'] < time()) { throw new Exception('证书已过期'); } $start = date_create(date(DATE_RFC2822, $result['validTo_time_t'])); $end = date_create(); $diff = date_diff($start, $end); print "证书将在 " . $diff->days . " 天后过期"; } catch (Exception $exception) { fail_return($exception->getCode(), $exception->getMessage()); } }
“`
既然证书的过期时间搞定了,那么接下来就是邮件发送了
安装一下三方库
composer require phpmailer/phpmailer
我安装的是6.9版本
以下为发送邮件的代码
“`
public function send($params) { $subject = ! empty($params['subject']) ? $params['subject'] : "";//邮件标题 $body = ! empty($params['body']) ? $params['body'] : "";//邮件内容 $alt_body = ! empty($params['alt_body']) ? $params['alt_body'] : "text/html";//格式 $receive_mail = ! empty($params['receive_mail']) ? $params['receive_mail'] : "";//收件人邮箱 $mail = new PHPMailer(TRUE); try { $mail->Charset = $mail::CHARSET_UTF8; $mail->SMTPDebug = 0; $mail->isSMTP(); //企业邮箱服务器 $mail->Host = Env::get('mail_host'); //端口 $mail->Port = Env::get('mail_port'); //授权 $mail->SMTPAuth = TRUE; //发信地址 $mail->Username = Env::get('mail_username'); //SMTP 密码 $mail->Password = Env::get('mail_password'); //启用加密 $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; //显示发信地址 $mail->setFrom(Env::get('mail_username'), Env::get('mail_name')); //收件人和昵称 $mail->addAddress($receive_mail); $mail->Subject = $subject; $mail->Body = $body; $mail->AltBody = $alt_body; $mail->Sender = Env::get('mail_username'); $mail->send(); return "邮件发送发送成功"; } catch (Exception $exception) { fail_return($exception->getCode(), $exception->getMessage()); } }
“`
这边用的是阿里邮箱
主机:ssl://smtp.mxhichina.com
端口:465
管理员账号可在企业邮箱-邮箱列表-邮箱管理-管理员账号查到
管理员密码也在上面位置找到,若忘记了,可以重置密码
具体可参考官方文档:https://help.aliyun.com/document_detail/437166.html?spm=a2c4g.57330.0.0.263812edyqeomD