当前位置: 首页 > news >正文

[Linux] PHP程序员玩转Linux系列-telnet轻松使用邮箱

1.PHP程序员玩转Linux系列-怎么安装使用CentOS

2.PHP程序员玩转Linux系列-lnmp环境的搭建

3.PHP程序员玩转Linux系列-搭建FTP代码开发环境

4.PHP程序员玩转Linux系列-备份还原MySQL

5.PHP程序员玩转Linux系列-自动备份与SVN

6.PHP程序员玩转Linux系列-Linux和Windows安装nginx

7.PHP程序员玩转Linux系列-nginx初学者引导

8.PHP程序员玩转Linux系列-Nginx中的HTTPS

9.PHP程序员玩转Linux系列-使用supervisor实现守护进程

10.PHP程序员玩转Linux系列-升级PHP到PHP7

 

邮箱是工作中非常重要的一个工具,平常我都是使用foxmail软件或者直接登录web来操作邮件,现在我要换种方式使用邮箱.使用邮箱都是通过pop协议收取邮件,使用smtp协议发送邮件,现在我就直接在命令行中来操作一下邮箱.

pop服务器非SSL加密,一般的端口是110,例如:pop3.sina.net  端口:110

telnet pop3.sina.net 110

使用USER指令,指定邮箱名

USER shihan2@appdev.sinanet.com

使用PASS指令,指定密码

PASS 密码xxx

使用STAT指令,查看邮箱统计,前一个是邮件数,后一个是邮件所占的空间大小

STAT

使用LIST指令,列出邮件列表,前一个是邮件的编号,后一个是该邮件所占的大小

LIST

 

使用RETR指令,读取邮件详情,RETR 编号,读出来的就是信体内容了

RETR 1

 

使用smtp发送邮件

使用如下命令

telnet smtp.sina.cn 25
ehlo sina.cn
auth login
xxxxxxxxxxxxxxxxxxxx== #base64加密的邮箱
MjAzOTQ0LmNvbQ==       #base64加密的密码
mail from:<shihan@appdev.sinanet.com> #发件人
rcpt to:<630892807@qq.com>  #收件人
data
To:630892807@qq.com
From:shihan@appdev.sinanet.com
Subject:测试一下telnet发邮件

测试一下telnet发邮件测试一下telnet发邮件

.  #这个必须有

PHP代码实现收发信

<?php
try {
    define('PATH', dirname(__FILE__).'/emails/');
    //pop协议读取下载邮件
    $pop=new Pop();
    echo $pop->connect("pop3.sina.net",110);  
    echo $pop->user("shihan2@appdev.sinanet.com");
    echo $pop->pass("xxxx");
    echo $pop->stat();
    $pop->download($pop->lists());

    //smtp协议发邮件
    $dir = dir(PATH); 
    while($file = $dir->read()){ 
        if($file=="."|| $file==".."){
            continue;
        } 
        $smtp=new Smtp();
        echo $smtp->connect("smtp.sina.net",25);
        echo $smtp->helo("shihan2@appdev.sinanet.com");
        echo $smtp->auth();
        echo $smtp->user();
        echo $smtp->pass("xxxx");
        echo $smtp->mailFrom("shihan2@appdev.sinanet.com");
        echo $smtp->rcpt("shihan2@appdev.sinanet.com");
        echo $smtp->data();
        echo $smtp->send(file_get_contents(PATH.$file));
    } 
} catch (Exception $e) {
    echo $e->getMessage();
}
class Pop{
    private $socket;
    public function __construct(){
        ini_set('memory_limit', '200M');
        ini_set("auto_detect_line_endings", true);
    }
    public function connect($popServer,$popPort){
        $res=@fsockopen("tcp://".$popServer,$popPort,$errno,$errstr);
        if(!$res){
            throw new Exception($errstr, $errno);
        }
        $this->socket=$res;
        return $this->readLine();
    }
    public function user($email){
        $user="USER {$email}\r\n";
        fwrite($this->socket,$user);
        return $this->readLine();
    }
    public function pass($pwd){
        $pass="PASS {$pwd}\r\n";
        fwrite($this->socket,$pass);
        return $this->readLine();
    }
    public function lists(){
        fwrite($this->socket,"LIST\r\n");
        $lists=$this->read();
        return $this->parseList($lists);
    }
    public function retr($id){
        fwrite($this->socket,"RETR {$id}\r\n");
        return $this->read();
    }
    public function stat(){
        fwrite($this->socket,"STAT\r\n");
        return $this->readLine();
    }
    public function read() {
        $buf="";
        while ($ln = $this->readLine()) {
            if (trim($ln) == '.') {
                break;
            }
            $buf .= $ln;
        }
        return $buf;
    }
    public function download($emails){
        foreach ($emails as $key => $email) {
            $name=$email['id'].".eml";
            if(!is_dir(PATH)){
                mkdir(PATH,0777);
            }
            $path=PATH.$name;
            if(file_exists($path)){
                continue;
            }
            echo "{$name} email  is downloading... \r\n";
            $file=$this->retr($email['id']);
            file_put_contents($path, $file);
            echo "{$name} email  is ok! \r\n";
        }
    }
    public function readLine(){
        $result="";
        while(true){
            $buffer=@fgets($this->socket,10);
            $n = strlen($buffer);
            $result.=$buffer;
            if (!$n) {
                break;
            }
            if ($buffer[$n - 1] == "\n") {
                break;
            }
        }
        return $result;
    }
    private function parseList($list){
        $result=array();
        $emails=explode("\n", $list);
        foreach ($emails as $key => $v) {
            $emailId=explode(" ", $v);
            if(!is_array($emailId)||$emailId[0]=='+OK'||!isset($emailId[0])||!isset($emailId[1])){
                continue;
            }
            if($emailId[0][0]=='.'){
                break;
            }
            $temp=array();
            $temp['id']=$emailId[0];
            $temp['size']=$emailId[1];
            $result[]=$temp;
        }
        return $result;
    }
}
class Smtp{
    private $socket;
    private $email;
    public function __construct(){
        ini_set('memory_limit', '200M');
        ini_set("auto_detect_line_endings", true);
    }
    public function connect($smtpServer,$smtpPort){
        $res=@fsockopen("tcp://".$smtpServer,$smtpPort,$errno, $errstr);
        if(!$res){
            throw new Exception($errstr, $errno);
        }
        $this->socket=$res;
        return $this->readLine();
    }
    public function helo($email){
        $user="HELO {$email}\r\n";
        fwrite($this->socket,$user);
        $this->email=$email;
        return $this->readLine();
    }
    public function auth(){
        $pass="AUTH LOGIN\r\n";
        fwrite($this->socket,$pass);
        return $this->readLine();
    }
    public function user(){
        $pass=base64_encode($this->email)."\r\n";
        fwrite($this->socket,$pass);
        return $this->readLine();
    }
    public function pass($pwd){
        $pass=base64_encode($pwd)."\r\n";
        fwrite($this->socket,$pass);
        return $this->readLine();
    }
    public function mailFrom($from){
        $data="MAIL FROM:<{$from}>\r\n";
        fwrite($this->socket,$data);
        return $this->readLine();
    }
    public function rcpt($rcpt){
        $data="RCPT TO:<{$rcpt}>\r\n";
        fwrite($this->socket,$data);
        return $this->readLine();
    }
    public function data(){
        $email="data\r\n";
        fwrite($this->socket,$email);
        return $this->readLine();
    }
    public function send($data){
        $email="{$data}\r\n";
        $email.=".\r\n";
        fwrite($this->socket,$email);
        return $this->readLine();
    }
    public function read() {
        $buf="";
        while ($ln = $this->readLine()) {
            if (trim($ln) == '.') {
                break;
            }
            $buf .= $ln;
        }
        return $buf;
    }
    public function readLine(){
        $result="";
        while(true){
            $buffer=@fgets($this->socket,10);
            $n = strlen($buffer);
            $result.=$buffer;
            if (!$n) {
                break;
            }
            if ($buffer[$n - 1] == "\n") {
                break;
            }
        }
        return $result;
    }

}

 

转载于:https://www.cnblogs.com/taoshihan/p/6732039.html

相关文章:

  • Linux程序接口实验:取进程标志及用户信息
  • SHELL编程练习-批量创建删除用户和组
  • angular学习第一篇-----环境搭建
  • 回溯算法入门及经典案例剖析(初学者必备宝典)
  • Linux系统的LOG日志文件及入侵后日志的清除
  • C# int? 关键字
  • 4-机器学习启蒙- 聚类和相似度模型
  • 1.2—Spring项目快速搭建—2.基于Spring Tool Suite搭建
  • “box-shadow”属性(转)
  • SQL Server 使用 Pivot 和 UnPivot 实现行列转换
  • 博通孔海泉:一个完全无线连接的市场要解决4个问题
  • CCF NOI1048 检测矩阵
  • IndexedDB
  • pl/sql 笔记之存储过程、函数、包、触发器(下)
  • mysql的库和表相关操作
  • 78. Subsets
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • Apache的80端口被占用以及访问时报错403
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • ES2017异步函数现已正式可用
  • ES6之路之模块详解
  • iOS | NSProxy
  • JavaScript类型识别
  • JavaScript中的对象个人分享
  • Lsb图片隐写
  • nginx 负载服务器优化
  • PHP的类修饰符与访问修饰符
  • Python打包系统简单入门
  • SpiderData 2019年2月23日 DApp数据排行榜
  • 机器学习 vs. 深度学习
  • 模型微调
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • ​第20课 在Android Native开发中加入新的C++类
  • #{} 和 ${}区别
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • (arch)linux 转换文件编码格式
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (分布式缓存)Redis持久化
  • (汇总)os模块以及shutil模块对文件的操作
  • (论文阅读30/100)Convolutional Pose Machines
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • (转)linux 命令大全
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl
  • .“空心村”成因分析及解决对策122344
  • .NET Core日志内容详解,详解不同日志级别的区别和有关日志记录的实用工具和第三方库详解与示例
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上