今天需要使用php发送邮件,但是使用自带的mail()
函数提示发送成功,但始终无法接收到邮件,于是自己动手写了一个.
代码很少,我使用的163的免费企业邮箱,测试发送给QQ,163都没问题
/**
* @param string $to 邮件接收人
* @param string $nickname 接收人昵称
* @param string $subject 邮件主题
* @param string $body 邮件主题
* @param string $hostname 发送人昵称
* @param string $username 发送服务器用户名
* @param string $password 发送服务器密码
* @param string $smtpHost 发送服务器
* @param int $smtpPort smtp端口
* @return string
*/
function sendmail($to, $nickname, $subject, $body, $hostname, $username, $password, $smtpHost, $smtpPort = 25)
{
$lb = "\r\n";
$smtp = [
// EHLO是ESMTP,带有身份验证
'EHLO ' . $hostname,
// 准备登录
'AUTH LOGIN',
// 登录用户名,base64编码
base64_encode($username),
// 登录密码,base64编码
base64_encode($password),
// 邮件发送者
'MAIL FROM: <' . $username . '>',
// 邮件接收者
'RCPT TO: <' . $to . '>',
// 开始发送数据DATA
'DATA',
// 显示发信人友好名称
'From: ' . $hostname . ' <' . $username . '>',
// 显示接收人友好昵称
'To: ' . $nickname . ' <' . $to . '>',
// 邮件主题
'Subject: ' . $subject,
// 邮件类型
'Content-Type: text/html; charset=UTF-8',
// 邮件编码方式
'Content-Transfer-Encoding: base64',
// 发送空行表示header结束
'',
// 发送邮件内容,base64编码
base64_encode($body),
// 发送.表示结束邮件
'.',
// 退出
'QUIT'
];
try {
$fp = fsockopen($smtpHost, $smtpPort);
foreach ($smtp as $value) {
fputs($fp, $value . $lb);
}
fclose($fp);
} catch (\Exception $exception){
return '邮件发送失败: ' . $exception->getMessage();
}
return '邮件发送成功';
}