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

搭建一个本地 SMTP 服务器

由于 SMTP 服务器的开放端口和安全性问题,许多现代邮件服务器不再允许直接通过 Telnet 连接到标准的 25 端口发送邮件,尤其是未经认证的用户。因此,许多公共电子邮件服务商如 Gmail、Yahoo 等也禁用了这种方式,转而要求使用更安全的加密连接,如通过 SSL/TLS 连接发送邮件。

不过,如果你有权限使用某个 SMTP 服务器(比如你自己公司的邮件服务器或本地服务器),你可以联系你的邮件服务器管理员获取服务器的名称和端口号,确保你可以通过 Telnet 进行实验。

如果你想自己搭建一个本地 SMTP 服务器

你可以在本地机器上运行一个简单的 SMTP 服务器,用来进行 Telnet 测试。以下是一些常用工具和步骤:

1. 使用 Python 自带的 SMTP 服务器

如果你使用的是 Linux 或 macOS,甚至 Windows,并且安装了 Python,可以通过以下命令在本地启动一个简单的 SMTP 服务器:

python -m smtpd -c DebuggingServer -n localhost:1025

这会启动一个运行在本地 localhost 上的 SMTP 服务器,监听 1025 端口。

2. 连接到本地 SMTP 服务器

启动后,你可以通过以下 Telnet 命令连接到本地 SMTP 服务器:

telnet localhost 1025

连接成功后,你就可以按照之前的步骤发送邮件了。

请确保严格按照以下步骤来发送邮件:

完整的 SMTP 命令顺序:

  1. HELO 命令(服务器问候):

    HELO mydomain.com
    
  2. MAIL FROM 命令(指定发件人):

    MAIL FROM: <alice@mydomain.com>
    
  3. RCPT TO 命令(指定收件人):

    RCPT TO: <bob@otherdomain.com>
    
  4. DATA 命令(准备发送邮件内容):

    DATA
    
  5. 输入邮件内容
    在服务器提示 354 Enter message, end with "." on a line by itself 后,输入邮件正文,最后用一个单独的句号 . 结束邮件内容:

    Subject: Test Email
    Hello,
    This is a test email sent via Telnet and Python SMTP server.
    .
    
  6. QUIT 命令(结束会话):

    QUIT
    

示例流程:

telnet localhost 1025
220 uavris-Lenovo-Legion-Y7000P2020 Python SMTP proxy version 0.2
HELO mydomain.com
250 Hello mydomain.com, pleased to meet you
MAIL FROM: <alice@mydomain.com>
250 Sender OK
RCPT TO: <bob@otherdomain.com>
250 Recipient OK
DATA
354 Enter message, end with "." on a line by itself
Subject: Test Email
Hello,
This is a test email sent via Telnet and Python SMTP server.
.
250 Message accepted for delivery
QUIT
221 Goodbye

关键点:

  • MAIL FROM 之后一定要先用 RCPT TO 指定收件人,才能执行 DATA 命令。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 08-图8 How Long Does It Take(C)
  • 移动应用门户实现的技术方案
  • 用了虚拟机后,本机摄像头打不开了(联想电脑thinkpad)
  • [数据集][目标检测]血细胞检测数据集VOC+YOLO格式2757张4类别
  • 2024国赛数学建模B题完整分析参考论文38页(含模型和可运行代码)
  • 家里有猫用宠物空气净化器有用吗?希喂、米家、有哈哪款更好
  • 在springboot中如何使用Jetty替换Tomcat
  • 同样数据源走RTMP播放延迟低还是RTSP低?
  • Redis的设计哲学和实现方式
  • Maven创建项目中的groupId, artifactId, 和 version的意思
  • Docker 的安装和使用
  • Day-04-QFile打开文件的两种方式
  • UNIX IPC方法的分类
  • 进程+线程+协程
  • Rust的常数、作用域与所有权
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • es6要点
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • KMP算法及优化
  • Python十分钟制作属于你自己的个性logo
  • Unix命令
  • Vue.js-Day01
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 检测对象或数组
  • 聊聊redis的数据结构的应用
  • 日剧·日综资源集合(建议收藏)
  • 使用SAX解析XML
  • 一个JAVA程序员成长之路分享
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • ​linux启动进程的方式
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • #162 (Div. 2)
  • #mysql 8.0 踩坑日记
  • #QT(一种朴素的计算器实现方法)
  • #单片机(TB6600驱动42步进电机)
  • #前后端分离# 头条发布系统
  • #微信小程序(布局、渲染层基础知识)
  • #知识分享#笔记#学习方法
  • (07)Hive——窗口函数详解
  • (1)(1.13) SiK无线电高级配置(五)
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (C语言)字符分类函数
  • (苍穹外卖)day03菜品管理
  • (第8天)保姆级 PL/SQL Developer 安装与配置
  • (转)Android中使用ormlite实现持久化(一)--HelloOrmLite
  • (转)setTimeout 和 setInterval 的区别
  • (转)一些感悟
  • (轉貼) 資訊相關科系畢業的學生,未來會是什麼樣子?(Misc)
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .Net Web窗口页属性
  • .net 发送邮件
  • .net/c# memcached 获取所有缓存键(keys)
  • .NET基础篇——反射的奥妙
  • .net开发时的诡异问题,button的onclick事件无效