PHP的一个完整SMTP类(解决当mail()遇上邮件服务器需要验证时的问题)

php通过socket编程,以SMTP将邮件发送到指定的QQ邮箱里面。 阅读详情


smtp.php

<?php



class smtp

{

/* Public Variables */

var $smtp_port;

var
$time_out;

var
$host_name;

var
$log_file;

var
$relay_host;

var
$debug;

var
$auth;

var
$user;

var
$pass;



/* Private Variables */
var $sock;



/* Constractor */

function smtp($relay_host = "", $smtp_port = 25,$auth = false,$user,$pass)

{

$this->debug = FALSE;

$this->smtp_port = $smtp_port;

$this->relay_host = $relay_host;

$this->time_out = 30; //is used in fsockopen()
#

$this->auth = $auth;//auth

$this->user = $user;

$this->pass = $pass;

#

$this->host_name = "localhost"; //is used in HELO command
$this->log_file = "";



$this->sock = FALSE;

}



/* Main Function */

function sendmail($to, $from, $subject = "", $body = "", $mailtype, $cc = "", $bcc = "", $additional_headers = "")

{

$mail_from = $this->get_address($this->strip_comment($from));

$body = ereg_replace("(^|(/r/n))(/.)", "/1./3", $body);

$header .= "MIME-Version:1.0/r/n";

if(
$mailtype=="HTML"){

$header .= "Content-Type:text/html/r/n";

}

$header .= "To: ".$to."/r/n";

if (
$cc != "") {

$header .= "Cc: ".$cc."/r/n";

}

$header .= "From: $from<".$from.">/r/n";

$header .= "Subject: ".$subject."/r/n";

$header .= $additional_headers;

$header .= "Date: ".date("r")."/r/n";

$header .= "X-Mailer:By Redhat (PHP/".phpversion().")/r/n";

list(
$msec, $sec) = explode(" ", microtime());

$header .= "Message-ID: <".date("YmdHis", $sec).".".($msec*1000000).".".$mail_from.">/r/n";

$TO = explode(",", $this->strip_comment($to));



if (
$cc != "") {

$TO = array_merge($TO, explode(",", $this->strip_comment($cc)));

}



if (
$bcc != "") {

$TO = array_merge($TO, explode(",", $this->strip_comment($bcc)));

}



$sent = TRUE;

foreach (
$TO as $rcpt_to) {

$rcpt_to = $this->get_address($rcpt_to);

if (!
$this->smtp_sockopen($rcpt_to)) {

$this->log_write("Error: Cannot send email to ".$rcpt_to."/n");

$sent = FALSE;

continue;

}

if (
$this->smtp_send($this->host_name, $mail_from, $rcpt_to, $header, $body)) {

$this->log_write("E-mail has been sent to <".$rcpt_to.">/n");

} else {

$this->log_write("Error: Cannot send email to <".$rcpt_to.">/n");

$sent = FALSE;

}

fclose($this->sock);

$this->log_write("Disconnected from remote host/n");

}

return
$sent;

}



/* Private Functions */



function smtp_send($helo, $from, $to, $header, $body = "")

{

if (!
$this->smtp_putcmd("HELO", $helo)) {

return
$this->smtp_error("sending HELO command");

}

#auth

if($this->auth){

if (!
$this->smtp_putcmd("AUTH LOGIN", base64_encode($this->user))) {

return
$this->smtp_error("sending HELO command");

}



if (!
$this->smtp_putcmd("", base64_encode($this->pass))) {

return
$this->smtp_error("sending HELO command");

}

}

#

if (!$this->smtp_putcmd("MAIL", "FROM:<".$from.">")) {

return
$this->smtp_error("sending MAIL FROM command");

}



if (!
$this->smtp_putcmd("RCPT", "TO:<".$to.">")) {

return
$this->smtp_error("sending RCPT TO command");

}



if (!
$this->smtp_putcmd("DATA")) {

return
$this->smtp_error("sending DATA command");

}



if (!
$this->smtp_message($header, $body)) {

return
$this->smtp_error("sending message");

}



if (!
$this->smtp_eom()) {

return
$this->smtp_error("sending <CR><LF>.<CR><LF> [EOM]");

}



if (!
$this->smtp_putcmd("QUIT")) {

return
$this->smtp_error("sending QUIT command");

}



return
TRUE;

}



function
smtp_sockopen($address)

{

if (
$this->relay_host == "") {

return
$this->smtp_sockopen_mx($address);

} else {

return
$this->smtp_sockopen_relay();

}

}



function
smtp_sockopen_relay()

{

$this->log_write("Trying to ".$this->relay_host.":".$this->smtp_port."/n");

$this->sock = @fsockopen($this->relay_host, $this->smtp_port, $errno, $errstr, $this->time_out);

if (!(
$this->sock && $this->smtp_ok())) {

$this->log_write("Error: Cannot connenct to relay host ".$this->relay_host."/n");

$this->log_write("Error: ".$errstr." (".$errno.")/n");

return
FALSE;

}

$this->log_write("Connected to relay host ".$this->relay_host."/n");

return
TRUE;;

}



function
smtp_sockopen_mx($address)

{

$domain = ereg_replace("^.+@([^@]+)$", "/1", $address);

if (!@
getmxrr($domain, $MXHOSTS)) {

$this->log_write("Error: Cannot resolve MX /"".$domain."/"/n");

return
FALSE;

}

foreach (
$MXHOSTS as $host) {

$this->log_write("Trying to ".$host.":".$this->smtp_port."/n");

$this->sock = @fsockopen($host, $this->smtp_port, $errno, $errstr, $this->time_out);

if (!(
$this->sock && $this->smtp_ok())) {

$this->log_write("Warning: Cannot connect to mx host ".$host."/n");

$this->log_write("Error: ".$errstr." (".$errno.")/n");

continue;

}

$this->log_write("Connected to mx host ".$host."/n");

return
TRUE;

}

$this->log_write("Error: Cannot connect to any mx hosts (".implode(", ", $MXHOSTS).")/n");

return
FALSE;

}



function
smtp_message($header, $body)

{

fputs($this->sock, $header."/r/n".$body);

$this->smtp_debug("> ".str_replace("/r/n", "/n"."> ", $header."/n> ".$body."/n> "));



return
TRUE;

}



function
smtp_eom()

{

fputs($this->sock, "/r/n./r/n");

$this->smtp_debug(". [EOM]/n");



return
$this->smtp_ok();

}



function
smtp_ok()

{

$response = str_replace("/r/n", "", fgets($this->sock, 512));

$this->smtp_debug($response."/n");



if (!
ereg("^[23]", $response)) {

fputs($this->sock, "QUIT/r/n");

fgets($this->sock, 512);

$this->log_write("Error: Remote host returned /"".$response."/"/n");

return
FALSE;

}

return
TRUE;

}



function
smtp_putcmd($cmd, $arg = "")

{

if (
$arg != "") {

if(
$cmd=="") $cmd = $arg;

else
$cmd = $cmd." ".$arg;

}



fputs($this->sock, $cmd."/r/n");

$this->smtp_debug("> ".$cmd."/n");



return
$this->smtp_ok();

}



function
smtp_error($string)

{

$this->log_write("Error: Error occurred while ".$string."./n");

return
FALSE;

}



function
log_write($message)

{

$this->smtp_debug($message);



if (
$this->log_file == "") {

return
TRUE;

}



$message = date("M d H:i:s ").get_current_user()."[".getmypid()."]: ".$message;

if (!@
file_exists($this->log_file) || !($fp = @fopen($this->log_file, "a"))) {

$this->smtp_debug("Warning: Cannot open log file /"".$this->log_file."/"/n");

return
FALSE;;

}

flock($fp, LOCK_EX);

fputs($fp, $message);

fclose($fp);



return
TRUE;

}



function
strip_comment($address)

{

$comment = "/([^()]*/)";

while (
ereg($comment, $address)) {

$address = ereg_replace($comment, "", $address);

}



return
$address;

}



function
get_address($address)

{

$address = ereg_replace("([ /t/r/n])+", "", $address);

$address = ereg_replace("^.*<(.+)>.*$", "/1", $address);



return
$address;

}



function
smtp_debug($message)

{

if (
$this->debug) {

echo
$message;

}

}

}

?>











test.php

<?php

/*

这是一个测试程序!!!

请按照说明设置好以下的参数,以下是以tom.com的用户为例设置好的.

*/

require("sm.php");

##########################################

$smtpserver = "smtp.tom.com";//SMTP服务器

$smtpserverport =25;//SMTP服务器端口

$smtpusermail = "someone@tom.com";//SMTP服务器的用户邮箱

$smtpemailto = "someone@hotmail.com";//发送给谁

$smtpuser = "someone";//SMTP服务器的用户帐号

$smtppass = "someonepass";//SMTP服务器的用户密码

$mailsubject = "Test Subject";//邮件主题

$mailbody = "<h1>This is a test mail</h1>";//邮件内容

$mailtype = "HTML";//邮件格式(HTML/TXT),TXT为文本邮件

##########################################

$smtp = new smtp($smtpserver,$smtpserverport,true,$smtpuser,$smtppass);//这里面的一个true是表示使用身份验证,否则不使用身份验证.

$smtp->debug = TRUE;//是否显示发送的调试信息

$smtp->sendmail($smtpemailto, $smtpusermail, $mailsubject, $mailbody, $mailtype);

?>


SMTP邮件发送问题和解决方案(使用PHP) 使用PHPMailer库可以简化SMTP邮件发送的过程,并提供了一些有用的功能和解决方案。在配置SMTP服务器信息后,您可以使用PHPMailer的API设置邮件内容并发送电子邮件。接下来,我们设置发件人和收件人的电子邮件地址和名称,设置邮件主题和正文内容。在发送SMTP邮件之前,首先需要配置SMTP服务器的相关信息,包括主机名、端口号、用户名和密码等。在使用SMTP发送邮件时,可能会遇到一些常见的问题。以上是一些常见的问题和解决方案,希望能帮助您顺利发送SMTP邮件。问题1:邮件发送失败,没有错误消息。 阅读详情

相关推荐

【文本分析学习】Anaconda+pytorch虚拟环境下的pycharm文本分析(含分词、词性标注、词形归一化、停用词、文本情感分析、词频、文本相似度,附数据代码) NLTK

文本分析学习之 Anadconda+pytorch虚拟环境下的pycharm文本分析(含分词、词性标注、词形归一化、停用词、文本情感分析、词频、文本相似度,附数据代码)

littlexmj的博客 2332

php smtp 抄送,PHP-SMTP发送邮件

/***邮件发送类*/classMail{//SMTP服务器名称private$SmtpHost;/*SMTP服务端口+标准服务端口,默认为25*/private$SmtpPort=25;//SMTP用户名private$SmtpUser='';//SMTP用户密码private$SmtpPassword='';/*超时时间+用于fsockopen()函数,超...

weixin_42498163的博客 906

数字加网(一)— —概念及分色合成

由于大多数图像复制设备是二值设备,因此在图像复制过程中,必须先把连续调的灰度图像或彩色图像处理成二值的半色调图像,用单位面积的网点覆盖率来表现图像的颜色深浅变化。这个过程被称之为加网(Screening) 数字加网就是根据人眼视觉的空间混色特性,用人眼无法分辨的细小黑白点的单位覆盖面积来模拟灰度图像或彩色图像的层次变化,使得到

Sin_Geek成长の迹 8592

php发送邮件

//先写一个类<? class smtp { /* Public Variables */ var $smtp_port; var $time_out; var $host_name; var $log_file; var $relay_host; var $debug; var $auth; var $user; var $pass; /* Private Variabl

liumengcheng的专栏 785

VCL for PHP,Konopka Signature VCL Controls (Raize Components 6.2.3) for Delphi 10.4

The Raize Components suite includes a variety of interface design tools for Delphi programming language and C ++ Builder, which includes over 125 VCL controls and over 100 different tools for creating...

weixin_42137539的博客 853

比特大陆校招笔试

我当时做的时候没有概念(上边倒计时我一直以为是一个模块的),所以第一个模块写的太长了导致最后才留15分钟快速选的(一共18道题),有一题最后没有选上,两题没有认真看题目瞎选的,求求求过过过!选择题:主要考高中物理题、数学题(念过高中的一定会,但是需要时间算,需要留25分钟左右的时间做)第一道就是写个人的内容,什么最近读过的书,最近的感受等等;分为两个模块,考试内容超级无敌简单,但是注意时间掌握。注意这里别花太长的时间,不然后边来不及。第二道逻辑分析题,需要你写解答。

Domainwa的博客 668

php smtp 发送邮件

smtp 发送邮件 PHP发送邮件

靳某某 1156

进程间通信的七种方法实战演示!值得收藏!

线程和进程间的通讯(Inter-Process Communication, IPC)是操作系统中的一个重要概念,用于实现不同进程或同一进程中的不同线程之间的数据交换和协调。以下是几个常见的进程间通信的方式:管道、消息队列、共享内存、信号、套接字、信号量、文件映射

十年饮冰,难凉热血,保持热爱,奔赴星海! 2816

php 怎么安装邮件服务器,烂泥:Postfix邮件服务器搭建之软件安装与配置

本文由ilanniweb提供友情赞助,首发于烂泥行天下想要获得更多的文章,可以关注我的微信ilanniwebPostfix邮件服务器的搭建需要使用到几个软件,分别是cyrus-sasl、postfix、dovecot、postfixadmin、roundcubemail,只有这几个软件相互配合才能搭建一套完整的邮件服务器。PS:本次实验在centos6.5 64bit上进行。一、软件功能介绍cyr...

weixin_30015371的博客 745

Python程序—定子故障三相永磁同步电动机振动与电流数据集

1.0 kW 电机匝间短路故障数据: 正常匝间短路振动数据: 匝间短路故障,严重度为2.26%: 匝间短路故障,严重度为2.70%: 匝间短路故障,严重度为3.35%: 匝间短路故障,严重度为4.41%: 匝间短路故障,严重度为6.48%: 匝间短路故障,严重度为12.17%: 匝间短路故障,严重度为21.69%1.5 kW 电机匝间短路故障数据: 正常匝间短路振动数据: 匝间短路故障,严重度为1.57%: 匝间短路故障,严重度为1.88%: 匝间短路故障,严重度为2.34%

m0_66465741的博客 1320

TripoSR: Fast 3D Object Reconstruction from a Single Image 论文阅读

模型的主要参数,如变换器的层数、三平面的维度、NeRF模型的具体细节和主要训练配置,在表1中详细说明。TripoSR的算法流程结合了先进的数据处理、模型设计和训练技术,使其能够在不到0.5秒的时间内从单张图像中快速生成详细的3D网格。总体而言,TripoSR是一个强大的3D重建工具,它在速度和质量上都表现出色,但也需要考虑到其对计算资源的需求和在处理极端复杂场景时可能遇到的挑战。:通过精心策划的训练数据集和多样化的数据渲染技术,TripoSR提高了模型的泛化能力和对真实世界图像的适应性。

Christo的博客 1946

PHP的一个完整SMTP类(解决当mail()遇上邮件服务器需要验证时的问题) [转]

class.smtp.php class smtp{/* Public Variables */var $smtp_port;var $time_out;var $host_name;var $log_file;var $relay_host;var $debug;var $auth;var $user;var $pass; /* P

海上生明月 1438

需要Perfetto分析的anr

anr类的问题,经常会有系统cpu,内存负载不高,iowait也不高,主线程状正常的,这类问题通过常规的日志无法分析,需要抓取Perfetto来分析应用的情况。event log中也没有异常。

专业开发者的博客,一个从事Android WiFi和蓝牙的工程师 63

php发送邮件二种方法 php使用smtp发送邮件

原文:http://www.jbxue.com/php/25502.html 本文介绍了php发送邮件的两种方法,分别是使用PHP内置的mail()函数发送邮件,使用封装SMTP协议的邮件类发送邮件,推荐使用smtp协议封装的邮件类实现邮件发送。 php如何发送邮件呢?方法有很多,但用的最多的还是使用smtp协议来发送邮件,一起来学习下吧。 专题推荐:php发邮件代码大全 一、

lorielei的博客 3606

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

php mail方法_php邮件发送的两种方式

这篇文章研究的主要内容就是使用PHP来发送电子邮件,总结为以下两种方法:一、使用PHP内置的mail()函数$to = "test@163.com"; //收件人$subject = "Test"; //主题$message = "This is a test mail!"; //正文mail($to,$subject,$message);结果就直接报错,如下:Warning: mail() [f...

weixin_30863333的博客 1484

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

XAMPP 下配置SMTP mail服务,使PHP的mail() 函数可以发送邮件

为什么80%的码农都做不了架构师?>>> ...

weixin_34199335的博客 569

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

php email,两种PHP邮件发送的方式

有不少程序员在用PHP发送邮件的时候会遇到几个问题,那么遇到问题就要有解决问题的思路,本文就是根据php实现邮件发送的思路,整理下来的一篇文章,在遇到不同问题时给出的不同解决方法,感兴趣的小伙伴们可以参考一下。一、使用PHP内置的mail()函数...

weixin_33435461的博客 1219

XAMPP下配置SMTP mail服务,使PHP…

PHP的mail() 邮件函数很简单,但也导致了不能使用目前流行的 带验证功能的 SMTP 服务器(gmail, 163, 126等) 现在通过配置 XAMPP 提供的 sendmail 来使得 PHP 的 mail() 函数可以正常发送邮件,下面以:smtp.126.com 为例: 1. 找到 xampp/php/php.ini 文件,找到 [mail function] 语句块,修改如下: 1

Anders的技术成长专栏 3028

PHP发送邮件的两种方法分别是使用mail()函数和使用mailer类

PHP 函数通常通过本地邮件服务器发送,通常在 Linux、BSD 和 macOS 平台上以二进制文件开头,但是,Windows 通常不包括本地邮件服务器;有无数重叠(和冲突)的标准,需要严格遵守极其复杂的格式和编码规则——你在网上找到的绝大多数直接使用该功能的代码都是完全错误的,如果不是不安全的!纯文本邮件不支持HTML标记、样式、图片、附件或其他可视化元素,而仅仅是一段纯文本的消息。唯一直接支持此功能的 PHP 函数是。2.mailer类发送HTML格式的邮件、附件、内嵌图片等丰富内容的电子邮件。

zx990912的博客 931

php语言smtp类,自己写的一个php发送邮件的类(smtp协议)

class Smtp{private $Smtp = 'smtp.qq.com'; //邮件服务器private $PORS = 25; //邮件服务器端口private $LoginMail = ''; //邮件登陆用户账户private $LoginPass = ''; //邮件登陆用户密码private $...

weixin_28844359的博客 497

WordPress邮件发送优化:用SMTP替代PHP mail()函数

SMTP协议是电子邮件传输的核心标准,通过身份验证和加密机制确保邮件可靠投递。相比PHP原生mail()函数直接调用服务器sendmail服务的方式,SMTP协议支持SPF、DKIM等认证体系,能有效避免邮件被标记为垃圾邮件。在WordPress开发中,使用WP Mail SMTP等插件重构邮件发送流程,可显著提升送达率至98%以上。该方案特别适合需要用户注册验证、订单通知等关键业务的网站,通过可视化配置界面集成SendGrid、Mailgun等专业服务商,同时提供邮件队列、发送日志等企业级功能,是解决PH

weixin_31714129的博客 200

为什么你的PHP mail()函数总是失败?90%的人都忽略了这3个关键点

解决PHP邮件发送失败难题,深入解析mail函数配置关键细节。涵盖常见错误、服务器环境要求与安全设置三大核心点,助你快速实现稳定邮件发送。适用本地开发与线上部署场景,提升成功率,值得收藏。

LogicNest的博客 850

PHP如何通过SMTP验证发送邮件

原文地址:How to Send Email from a PHP Script Using SMTP Authentication   PHP mail()与SMTP验证 缺乏灵活性是PHP的mail()函数显得过于简单的部分原因。最重要而且令人沮丧的是,死板的mail()函数通常还不允许你使用你选择的SMTP服务器,并且它也根本不支持如今已被众多邮件服务器采用的SMTP验证。 幸运的是

我想跟代码谈谈 1万+

php如何发生邮件,php如何发送邮件?

php发送邮件的实现方法:1、使用PHP内置的“mail()”函数来发送邮件;2、封装一个SMTP协议的邮件类,使用SMTP协议来发送邮件。php如何发送邮件?总结了两种使用PHP来发送电子邮件的方法:1、使用PHP内置的mail()函数...

weixin_35739967的博客 391

php使用mail邮件服务器,PHP mail()中继到邮件服务器

does the PHP mail() function automatically create an SMTP message tothe server? Or do I have to set the php.ini settings to look at thelocalhost and then configure sendmail/postfix to send the message...

weixin_33201531的博客 374

配置mail使用SMTP发送邮件

转载请注明文章出处:https://tlanyan.me/config-mai... 前文“PHP回顾之发送邮件”介绍了邮件中的一些基本概念,今天分享在Linux上使用mail命令通过SMTP对外发送邮件。 mail、mailx和sendmail 先看一下三者的关系:mail是mailx的别名,最初叫nail(与arch linux目前...

weixin_34054931的博客 2181
上一篇: (原创)关于如何处理EXCEL( CSV)文件 导入数据库的解决方法!!
下一篇: 已经是凌晨2点了!
大白菜芯
博客等级 码龄23年 162粉丝 130原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值