simpleMailTool

程序链接

https://github.com/kohunglee/simpleMailTool/

一个简单的 php 发邮件的轮子,跟其他著名大轮子相比(如 PHPMailer),特性有两个

  1. 是能在不发送邮件的情况下验证账号密码是否正确
  2. 用最小体积和足够安全的代码,实现 99% 的人需要的全部功能(其实还能更简单,但没必要)

当然也有缺点,就是

  1. 不支持 STMP 发送邮件自行生成 DKIM 签名

DKIM 是什么意思呢?

DKIM 是一种验证邮箱是否伪造的方式。目前这类方式被广泛应用的还有 SPF、DMARC。DKIM 可以在邮箱发送时生成签名,然后在接受邮件的服务器那边利用共用的规则来进行验证,以确定这封邮件确实是邮件表头里的那个服务商地址发送的,识别伪造地址邮件和垃圾邮件(比如防止某人伪造华为的 hr@huawei.com 给别人恶作剧)。举个例子, stmp.qq.com 向 163 邮箱网站发送了一个邮件,那这个邮件里肯定包含了发送者的很多信息,像服务器的地址 @qq.com ,那么 DKIM 可以帮助 163 邮箱网站确认邮件确实是 stmp.qq.com 发送的。

如果不支持,会造成什么后果?

没太大后果

  1. 接收方服务器会出现 DKIM 验证不通过的情况
  2. QQ 邮箱后台可能会出现 “此地址未验证,请注意识别” 的字样

上面两点都是说的可能,并不是绝对,一般来讲,同服务平台间通信不会造成 DKIM 验证不通过,如 @qq.com 和 @qq.com 发邮件

不过不用担心,因为 DKIM 验证不通过很正常,DKIM 只是一种辅助手段而非唯一依据,使用本轮子,在账号密码正确情况下,其他两项都会正常通过,对于各大邮件服务提供商, DKIM 验证不通过是有其合理存在的理由的,电子邮件服务器不会拒绝由于缺少或无法验证 DKIM 签名 (RFC 4871) 的邮件。

绝大部分邮件服务提供商并不会因为 DKIM 不通过而在前台标识一些痕迹,目前我只发现 qq 邮件后台会标识,个人猜测其目的是推销自己的 QQ 企业邮箱。如果想不在 QQ 邮箱后台显示,推荐配合 QQ 邮箱使用本轮子,因为同服务平台间通信不会造成 DKIM 验证不通过。

如果想彻底解决这个问题,可以使用大轮子 https://github.com/PHPMailer/PHPMailer

为什么不支持自行生成 DKIM 签名?

因为追求轻量级。大轮子 PHPMailer 和本轮子发邮件的底层原理不一样,PHPMailer 是一款强大的工具,它是从几乎最底部对邮件的标头进行制作,其中包括 DKIM 签名 DKIM-Signature ,是一个驱动级别的程序,而本轮子,是利用 php 自带的 Socket 函数,与远程邮件服务器进行通信,通过发送命令的方式,轻松将邮件发送出去,原理类似于使用 Telnet 和 SMTP 通过敲命令发送邮件,如 https://blog.51cto.com/biweili/1834198 ,所以会精简很多。

利用本轮子的模式,标头中很多内容,都将由邮件服务器制作的,包括 DKIM 签名 ,而利用这种模式可能无法自定义生成 DKIM 签名,当然这只是我的猜想,目前也在找解决办法,在解决前,本轮子将不能进行自行生成 DKIM 签名。

不过,本轮子大小只有个位数 kb ,而大轮子 PHPMailer 的 kb 大小则数以百计,并且相比之下本轮子还速度更快,代码简单便于修正问题和自定义修改,又附带了不发邮件验证账号密码正确性的功能,最终生成的标头与大轮子并没有太大差别,如果仅仅为了发个简单的邮件的话,推荐使用本轮子。

注意

本程序还处于测试阶段,请勿用于生产环境

参考资料:

https://stackoverflow.com/questions/4712553/signing-mails-sent-through-smtp-with-dkim#comment5203489_4712553

https://stackoverflow.com/questions/2799611/setting-up-domainkeys-dkim-in-a-php-based-smtp-client

https://support.google.com/a/answer/174124?hl=zh-Hans&ref_topic=2752442

自制一个超级简单的 php 发邮件的轮子 simpleMailTool.php的更多相关文章

  1. 依据 smtp协议的简单golang 的发邮件实现

    依据 smtp协议的简单golang 的发邮件实现 协议格式如下 From:sender_user@demo.net To:to_user@demo.net Subject:这是主题 Mime-Ver ...

  2. pygame学习笔记(6)——一个超级简单的游戏

    转载请注明:@小五义  http://www.cnblogs.com/xiaowuyi 学了这么长时间的Pygame,一直想写个游戏实战一下.看起来很简单的游戏,写其来怎么这么难.最初想写个俄罗斯方块 ...

  3. vs2015制作一个超级简单的MVC项目

    使用vs2015制作一个超级简单的MVC项目   本文链接:https://blog.csdn.net/qq_40919762/article/details/100705314 直奔主题一,创建一个 ...

  4. JavaScript,一个超级简单的方法判断浏览器的内核前缀

    先说明,此处的方法是说超级简单的方法,不是指代码超级少,而是用非常简单的知识点,只要懂得怎么写JavaScript的行内样式就可以判断. 大家应该还记得JavaScript行内样式怎么写吧?(看来我是 ...

  5. 一个超级简单的node.js爬虫(内附表情包)

    之所以会想到要写爬虫,并不是出于什么高大上的理由,仅仅是为了下载个表情包而已-- 容我先推荐一下西乔出品的神秘的程序员表情包. 这套表情包着实是抵御产品.对付测试.嘲讽队友.恐吓前任的良品, 不过不知 ...

  6. 一个超级简单php的留言板

    第一步:配置好测试环境:(详细略了) 第二部:新建一个数据库,命名为guestbook(名字可以随便改),可以直接在phpmyadmin里面操作,在数据库里面新建一张表‘content’,表里面有4个 ...

  7. 一个超级简单的HTML模板框架源代码以及使用示例

    HTML模板框架源代码 var HtmlTemplate = (function () { function HtmlTemplate(htmlSource) { this.htmlSource = ...

  8. Gtest源码剖析:1.实现一个超级简单的测试框架xtest

    下面的代码模仿gtest实现,主要说明了以下两点: ASSERT_* 和 EXPECT_*系列断言的原理和作用. gtest是怎样通过宏自动注册测试代码让其自动运行的. #include <io ...

  9. 一个超级简单的demo带你走进redux的大坑

    先上代码 import React, { Component } from 'react'; import ReactDOM from 'react-dom'; import { createStor ...

  10. 一个超级简单的Jetty实例

    Maven: <!-- https://mvnrepository.com/artifact/org.mortbay.jetty/jetty --> <dependency> ...

随机推荐

  1. Github + Jekyll 搭建项目wiki

    网站托管 创建新仓库 创建以自己名字为前缀, .github.io​为后缀的仓库 ​​ 在仓库的Settings中的Pages里设置Build and deployment​为Github Actio ...

  2. 展锐Android平台增加gadget 虚拟usb串口

    方案一:需要修改展锐现有Windows端驱动,增加一组MI接口.由于无法推动展锐修改Windows驱动,该方案不推荐. SL8541E/device/sprd/sharkle/common/rootd ...

  3. pdf文件内容分析工具简介(研究pdf标准好帮手)

    前言:PDF文件标准诞生于20年前,从今天的视角来看,标准设计理念有些过时了:然而,pdf文件生态已经形成,尾大不掉吧.纵然有各种缺点,但是不可否认的事实:pdf是当今应用最广泛的版式文件. pdf文 ...

  4. 【译】使用 Visual Studio Profiler 进行基准测试

    在 Visual Studio 17.13 预览版中,我们发布了更新的 BenchmarkDotNet 诊断器,允许您使用性能分析器中的更多工具来分析基准测试.有了这个变化,可以非常快速地挖掘 CPU ...

  5. NAT、DANT、SNAT的区别

    NAT NAT(Network Address Translation,网络地址转换)是将IP 数据包头中的IP 地址转换为另一个IP 地址的过程.在实际应用中,NAT 主要用于实现私有网络访问公共网 ...

  6. 类的加载与ClassLoader的理解

    加载:将class文件字节码内容加载到内存中,并将这些静态数据转换成方法区的运行时数据结构,然后生成一个代表这个类的java.lang.Class对象,作为方法区中类数据的访问入口(即引用地址).所 ...

  7. 基本类型、包装类与String类间的转换

  8. JavaScript 事件绑定:立即执行函数的闭包 vs let的块作用域

    以下两个写法,在执行时是等价的: // 立即执行函数表达式写法 var btns_var = document.getElementsByTagName('button'); for(var i = ...

  9. mysql之增删改

    编写配置文件[db.properties]: driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/jdbcStudy?useUni ...

  10. 升级 element-ui 2.15.7 后遇到 el-date-picker 警告问题

    近期把 element-ui 升级到了官网最新的 2.15.7 版本,无意间发现控制台出现了 Prop being mutated: "placement" 警告,完整警告: