前言
在阿里云上買了一個輕量應用服務器,之所以選擇這個是因為該類型的服務器可以在購買時配置開發環境,而且價格比較便宜。將網站在本地搭好上傳到云上時,發現原本可以運行的郵件發送功能失效了。折騰了將近一天之后,才發現問題所在,這里記錄一下。
官方教程
阿里云在幫助中提供了SMTP發郵件的示例程序,各個語言的版本都有,很全面:
image.png
其中PHP的代碼如下:
<?php
require 'email.class.php';
$mailto='***';
$mailsubject="測試郵件";
$mailbody='這里是郵件內容';
$smtpserver = "smtpdm.aliyun.com";
$smtpserverport = 25;
$smtpusermail = "***";
$smtpuser = "***";
$smtppass = "***";
$mailsubject = "=?UTF-8?B?" . base64_encode($mailsubject) . "?=";
$mailtype = "HTML";
$smtp = new smtp($smtpserver, $smtpserverport, true, $smtpuser, $smtppass);
$smtp->debug = false;
$smtp->sendmail($mailto, $smtpusermail, $mailsubject, $mailbody, $mailtype);
在使用時我將官方給出的PHP的代碼復制進去,運行時還是出錯(訪問smtp服務器超時)。后來查了各種資料才發現阿里云出于安全的考慮,將25號端口關閉了(教程給的就是25號端口)。實際中使用SSL協議,對應SMTP端口就是465,將端口改掉,同時在smtp服務器地址前加ssl://
即可:
$smtpserver = "ssl://smtpdm.aliyun.com";
$smtpserverport = 465;
實例代碼
實際中網站使用PHPMail進行郵件的發送。代碼如下:
<?php
//該文件名為 sendemailPHPMail.php
/* use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
require 'php/Exception.php';
require 'php/PHPMailer.php';
require 'php/SMTP.php'; */
include_once "class.phpmailer.php";
include_once "class.smtp.php";
//include_once "Exception.php";
//獲取一個外部文件的內容
$mail=new PHPMailer();
///
$send_name=$_POST['name'];
$send_phone=$_POST['phone'];
$send_theme=$_POST['theme'];
$send_kind=$_POST['kind'];
$mailcontent = "姓名昵稱: ".$send_name."<br>電話郵箱: ".$send_phone."<br>用途: ".$send_theme."<br>風格: ".$send_kind."<br>內容: ".$_POST['content'];//郵件內容
///
//設置smtp參數
$mail->IsSMTP();
$mail->SMTPAuth=true;
$mail->SMTPKeepAlive=true;
$mail->Host="ssl://smtp.163.com";
$mail->Port=465;
//填寫你的email賬號和密碼
$mail->Username="****@163.com";
$mail->Password="****";#注意這里要填寫授權碼就是我在上面網易郵箱開啟SMTP中提到的,不能填郵箱登錄的密碼哦。
//設置發送方,最好不要偽造地址
$mail->From="***@163.com";
$mail->FromName="***";//發送者用戶名
$mail->Subject="****";//郵件標題
$mail->AltBody=$mailcontent; //郵件內容
$mail->WordWrap=50; // set word wrap
$mail->MsgHTML($mailcontent);
//設置回復地址
$mail->AddReplyTo("****@163.com","***");
//設置郵件接收方的郵箱和姓名
$mail->AddAddress("***@qq.com","**");//接收者郵箱和用戶名
//使用HTML格式發送郵件
$mail->IsHTML(true);
//通過Send方法發送郵件
//根據發送結果做相應處理
if(!$mail->Send()){
//echo "Mailer Error:".$mail->ErrorInfo;
echo "<meta charset=\"UTF-8\">";
echo "<script language=\"JavaScript\">\r\n";
echo " alert(\"對不起,郵件發送失敗!!請充實\");\r\n";
echo " history.back();\r\n";
echo "</script>";
exit;
exit();
}else{
echo "<meta charset=\"UTF-8\">";
echo "<script language=\"JavaScript\">\r\n";
echo " alert(\"發送成功!!\");\r\n";
echo " history.back();\r\n";
echo "</script>";
exit;
} ?>
點擊下載class.phpmailer.php
和class.smtp.php
文件。(提取密碼為:x6at)
前端代碼為:
<form id="frmEmail" name="frmEmail" action="./php/sendemailPHPMail.php" method="post">
<div class="col-md-6 text-box">
<input name="name" type="text" placeholder="姓名昵稱" />
<input name="phone" type="text" placeholder="電話or郵箱" />
<input name="theme" type="text" placeholder="用途" />
<input name="kind" type="text" placeholder="風格" />
</div>
<div class="col-md-6 textarea">
<textarea name="content">內容</textarea>
</div>
<div class="clearfix"> </div><br />
<input class="btn btn-primary btn-red-lg" type="submit" onClick="toOutLook()" value="提交" />
</form>
后記
被官方教程給坑了一下(╯︵╰),下次要注意。這里Mark一下( ̄▽ ̄)/。
附另一種smtp郵件發送方法:php利用smtp類輕松的發送電子郵件,該方法沒有在阿里云服務器測試,不過本地測試通過(PHP高于5.3使用時會有問題)。