不使用smtp直接发送邮件

用smtp发邮件挺蛋疼的,不是有配额限制就是有配额限制.所以我觉得应该有直接发送邮件的办法.回归到用命令行装逼的年代,我们是这样发信的:

C:\>nslookup
默认服务器:  google-public-dns-a.google.com
Address:  8.8.8.8
> set type=mx
> qq.com
服务器:  google-public-dns-a.google.com
Address:  8.8.8.8
非权威应答:
qq.com  MX preference = 10, mail exchanger = mx3.qq.com
qq.com  MX preference = 20, mail exchanger = mx2.qq.com
qq.com  MX preference = 30, mail exchanger = mx1.qq.com
C:\>telnet mx3.qq.com 25
220 newmx13.qq.com MX QQ Mail Server
HELO localhost
250 newmx13.qq.com
MAIL FROM:<eslizn@localhost>
250 Ok
RCPT TO:<10000@qq.com>
250 Ok
DATA
354 End data with <CR><LF>.<CR><LF>
hello!
.
550 Mail content denied. //service.mail.qq.com/cgi-bin/help?subtype=1&&id=20022&&no=1000726
QUIT

虽然邮件没有发送成功,但是是因为被过滤了,最好做下spf以及写全邮件头信息. 显然,我们可以利用程序模拟这个过程:

function realmail($to,$subject,$message,$from,$type="text/plain"){
    $rule="/([a-zA-Z0-9-.]+)\@([a-zA-Z0-9-.]+)/i";
    if(!pregmatch($rule,$to,$to) || !pregmatch($rule,$from,$from)){
        return false;
    }
    if (!getmxrr($to[2],$mx)){
        return false;
    }
    $message = array(
        "MIME-Version: 1.0",
        "X-Mailer: Xmailer",
        "Delivered-To: {$to[0]}",
        "From: {$from[1]} <{$from[0]}>",
        "To: {$to[1]} <{$to[0]}>",
        "Date: ".date("D, t F Y H:i:s O"),
        "Content-Type: {$type}; charset=UTF-8",
        "Content-Transfer-Encoding: base64",
        "Subject: =?UTF-8?B?".base64encode($subject)."?=",
        "",
        base64encode($message)
    );
    $cmds=array(
        "HELO {$from[2]}",
        "MAIL FROM:<{$from[0]}>",
        "RCPT TO:<{$to[0]}>",
        "DATA",
        implode("\r\n",$message)."\r\n.\r\n",
        "QUIT"
    );
    $fp=fsockopen(current($mx),25);
    foreach($cmds as $val){
        fwrite($fp,$val."\r\n");
        fgets($fp);
    }
    fclose($fp);
    return true;
}

这样就不用给smtp跪舔了,邮件想发就发

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Spark学习技巧

Flink与Spark Streaming在与kafka结合的区别!

本文主要是想聊聊flink与kafka结合。当然,单纯的介绍flink与kafka的结合呢,比较单调,也没有可对比性,所以的准备顺便帮大家简单回顾一下Spark...

932
来自专栏逸鹏说道

记一次SQLServer的分页优化兼谈谈使用Row_Number()分页存在的问题

最近有项目反应,在服务器CPU使用较高的时候,我们的事件查询页面非常的慢,查询几条记录竟然要4分钟甚至更长,而且在翻第二页的时候也是要这么多的时间,这肯定是不能...

28412
来自专栏微服务生态

小程聊微服务-数据抽取那点事(一)

我们在《微服务是在双刃剑 http://www.jianshu.com/p/82ec12651d2d 》中提到了当我们将应用服务化以后,很多在单块系统中能够开展...

802
来自专栏IT笔记

从构建分布式秒杀系统聊聊Disruptor高性能队列

1955
来自专栏领域驱动设计DDD实战进阶

DDD实战进阶第一波(七):开发一般业务的大健康行业直销系统(实现产品上下文接口与测试)

994
来自专栏Golang语言社区

Golang 语言调用动态库实现OpenGL及windows的API编程

最近晚上没有事情的时候,研究下了开源的walk-master源码,自己简单的分析了下,如果在 import ( "github.com/lxn/win...

28712
来自专栏Ryan Miao

Mybatis-update - 数据库死锁 - 获取数据库连接池等待

最近学习测试mybatis,单个增删改查都没问题,最后使用mvn test的时候发现了几个问题: update失败,原因是数据库死锁 select等待,原因是c...

3165
来自专栏张善友的专栏

API网关Ocelot 使用Polly 处理部分失败问题

在实现API Gateway过程中,另外一个需要考虑的问题就是部分失败。这个问题发生在分布式系统中当一个服务调用另外一个服务超时或者不可用的情况。API Gat...

2295
来自专栏领域驱动设计DDD实战进阶

DDD实战进阶第一波(七):开发一般业务的大健康行业直销系统(实现产品上下文接口与测试)

前一篇文章我们介绍了如何将创建产品的领域逻辑与产品的持久化仓储通过上架产品的用例组织起来,完成了一个功能。在实际的项目中,多种前端的形态比如PC Web、 微信...

3445
来自专栏喔家ArchiSelf

老码农眼中的存储

存储,是我们码农每天都要打交道的事情,而当我们面对RAID,SAN,对象存储,分布式数据库等技术的时候,又往往似是而非,存储成了我们熟悉的陌生人。

1033

扫码关注云+社区