邮件服务器搭建 iredmail
前提
我搭建的网站里面需要有绑定邮箱服务,用qq
邮箱这些肯定是不行的,没有那么多,计划得随机生成很多。
所以需要自己搭建一个邮箱服务器。
记录
之前有其他人弄过模版了,所以我没有实际自己去搭,就记录几个疑惑的点。
看了一些帖子:
https://qing.su/article/154.html
https://qing.su/article/158.html
https://blog.csdn.net/witton/article/details/105882959
https://blog.csdn.net/qq_37960324/article/details/83012526
让我最最疑惑的就是这里面明明都配置了dns
,而我用的那个很明显没有搭dns
,为什么它就是可以测试通。
我的环境是:
邮件服务器搭在虚拟机里,之后要实现的内容是在同一个局域网内的其他虚拟机,通过php
代码收发邮件。
直接用了已经建好的虚拟机,里面就有邮件服务器。我在物理机上测试了之后是可以正常发送、接受邮件的。但是按照上述链接4中,感觉应该需要有个配置DNS
的环节,要不然它怎么知道解析到哪里,邮件服务器搭到哪里呢??
我看了搭建邮件服务器的虚拟机里/etc/hosts
文件中有配置了127.0.0.1 mx.iredmail.org
,然后iredmail
后台是有绑定了域名mail.163.com
的。在虚拟机内部可以发送邮件是正常可以理解的,但为什么在物理机上也能发送??让我感觉像是那个web
服务器写入、读取数据库一样,就感觉是没有通过邮箱服务。
直到我查了物理机的/etc/hosts
文件之后,发现里面也配置了mx.iredmail.org
的ip
的。哦…我都不知道自己一天在纠结什么。
2020.12.22更新
应该是这样的,只要在搭建邮件服务器的虚拟机里配置了127.0.0.1 mx.iredmail.org
就是可以的了。之所以物理机也能发送,是因为物理机通过访问webmail
,发起了发送邮件的请求,而webmail
所在服务器(也就是搭建邮件服务器的虚拟机)在接收到请求之后,就会与邮件服务器通信,通信的这个请求是在搭建邮件服务器的机子上进行的,所以不管物理机有没有配置/etc/hosts
都是可以正常发送邮件的。
3中提到的问题:
错误码:550 Domain may not exist or DNS check failed
即域名不存在或者DNS检查失败。有些邮箱会在收到邮件时,验证是否可以向该地址发送邮件,如果不能发送则会拒收,以防止垃圾邮件。
我也遇到了,给了很好的解答。
总结
写的比较乱哈。
邮件服务开在mx.iredmail.org
的25端口(这是原本已经定好的域名了,感觉容易和实际的iredmail.org
搞混,最好还是弄一个自己特定的域名),然后可以通过web
管理界面去添加域名,也就是我上面提到的mail.163.com
,邮箱名就是postmaster@mail.163.com
。(这个后缀感觉是一般都会起的和主机域名一样的)
它的逻辑应该是发送邮件的时候,会连接到该端口,然后这个端口的服务再根据邮箱后缀名做一些什么事情。总的来说就是要有DNS
把mx.iredmail.org
解析到搭建邮件服务器的ip
上。
而/etc/hosts
文件就可以充当dns
的作用。
所以我之后可能就是需要在每台用到邮件服务的机子上都配置好邮件服务器域名和ip
的对应关系。
(涉及到这些协议的东西真是因缺思厅)
iredmail关闭https
在我的物理机上访问iredmail
的web
界面一直出问题,而且之后要用代码去发起请求,感觉https
可能会带来一些麻烦,所以就想着直接把https
关掉。
进行了以下操作:
- 将
/opt/www/roundcubemail/config/config.inc.php
文件中的$config['force_https']=true
改为$config['force_https']=false
- 配置
/etc/dovecot/dovecot.conf
文件,将ssl = required
改为ssl = no
;将disable_plaintext_auth = yes
改为disable_plaintext_auth = no
(这个应该是关闭了imap
的ssl
) - 重启服务
service dovecot restart
- 将
/etc/nginx/site-available/
目录下的00-default-ssl.conf
文件改为00-default-ssl.conf.bak
(主要是为了删除这个文件,但是又怕只会有用到,就备份了一下) - 将
/etc/nginx/site-available/
目录下的00-default.conf
同样备份只会,将其中内容换为00-default-ssl.conf
文件中的内容,并且把端口值改为80
,注释掉include /etc/nginx/templates/ssl.tmpl
一行 service nginx restart
重启nginx
。这之后就可以通过http
协议来访问http://xxx/iredamin
了,但是不能访问http://xxx/mail
。还在找问题。
看了一下代码。/opt/www/roundcubemail/index.php
文件应该就是我们访问http://xxx/mail
时候访问的链接。里面通过$GLOBALS['env']
引入配置参数。而配置参数就是在/opt/www/roundcubemail/config
目录下的。所以讲道理应该不会出问题的。
而且/opt/www/roundcubemail/index.php
代码逻辑也是会去读取force_https
参数值,来判断是否要重定向到https
。
看完这些之后,我在想是不是全局变量没有更新?没有具体找是在哪里读入这些参数,并存储到GLOBALS['env']
参数中的。过了一会之后我重新访问了一下http://xxx/mail/index.php
之后,好了…webmail
也可以直接通过http
访问了。(不加index.php
还是不能访问)
(大概就是想让我多了解一下源码吧)
结束了。终于可以在本地写脚本来申请新建用户了。
其中也要改一些地方的内容。上午看了代码中是涉及到csrf-token
校验的。这对我脚本自动化去申请新建不方便。
通过php发送邮件
下面代码可以实现通过phpmailer
用qq
邮箱账号发送邮件的功能。
function send_mail($toemail, $name, $subject = '', $body = '',$attachment = null)
{$mail = new \PHPMailer\PHPMailer\PHPMailer(); //实例化PHPMailer对象$mail->CharSet = 'UTF-8'; //设定邮件编码,默认ISO-8859-1,如果发中文此项必须设置,否则乱码$mail->IsSMTP(); // 设定使用SMTP服务$mail->SMTPDebug = 0; // SMTP调试功能 0=关闭 1 = 错误和消息 2 = 消息$mail->SMTPAuth = true; // 启用 SMTP 验证功能$mail->SMTPSecure = 'ssl'; // 使用安全协议$mail->Host = "smtp.qq.com"; // SMTP 服务器$mail->Port = 465; // SMTP服务器的端口号$mail->Username = 'xxx@qq.com'; // SMTP服务器用户名$mail->Password = 'xxx'; // SMTP服务器密码//这里的密码可以是邮箱登录密码也可以是SMTP服务器密码$mail->SetFrom('xxx@qq.com', 'test success!');$replyEmail = ''; //留空则为发件人EMAIL$replyName = ''; //回复名称(留空则为发件人名称)$mail->AddReplyTo($replyEmail, $replyName);$mail->Subject = $subject;$mail->MsgHTML($body);$mail->AddAddress($toemail, $name);if (is_array($attachment)) { // 添加附件foreach ($attachment as $file) {is_file($file) && $mail->AddAttachment($file);}}return $mail->Send() ? true : $mail->ErrorInfo;
}
直接用这个,将$mail->Host = "smtp.qq.com";
改为你所设置的iredmail
邮件服务器的hostname
,端口的话,ssl
是587
,普通是25
。
通过命令行telnet mx.iredmail.org 587/25
测试之后发现都是通的,正常返回smtp
服务该有的响应。但是通过php
一直提示connect error
,查看了邮件服务器的日志信息/var/log/mail.log
,发现通过ssl 587
去连接的时候一直有什么SSL
报错,我就干脆想着通过25
端口。
只需要修改如下即可:
$mail->SMTPAuth = true; // 启用 SMTP 验证功能$mail->SMTPSecure = false; // 使用安全协议$mail->SMTPAutoTLS = false; // 这条才是真正的不启用tls的配置语句
但是现在又出现了一个新的问题:
SMTP ERROR: RCPT TO command failed: 554 5.7.1 <xxx.xxx.xxx.xxx>: Helo command rejected: ACCESS DENIED. Your email was rejected because the sending mail server sent non RFC compliant HELO identity (xxx.xxx.xxx.xxx)
PHPMailer
默认是把EHLO
声明为了代码所在主机的ip
地址。然后查看/etc/postfix/mail.cf
文件中,有和HELO
相关的配置,猜测下图配置就是相关的校验内容。
然后查看了/etc/postfix/sender_access.pcre
之后,发现报错的内容就是从这个文件中来的。然后我索性关掉了所有的验证(截图中check_helo_access pcre:/etc/postfix/helo_access.pcre
就是我注释掉的)。后面还是报错提示说need full-qualified hostname
,然后我就把上述reject_non_fqdn_helo_hostname
和reject_unknown_helo_hostname
都注释掉了。终于不报和helo
相关的错误了。(因为我的目的就只是在测试环境下使用,通过代码发送、接收邮件等,目前感觉这样草率地注释掉没啥问题)
后面又接着报错说could not authentication
,猜测可能是跟tls
有关,参考https://www.cnblogs.com/miketwais/articles/6278945.html
中和关闭smtp
相关的部分。修改了/etc/postfix/main.cf
文件,变成如下:
终于可以发送邮件了。
脚本请求添加用户
想通过脚本来请求添加用户的话,因为有CSRF
和登录的限制,会比较麻烦,对于我要实现的场景来说,没有必要(因为不涉及到这方面的安全性考虑)。所以我打算改掉相关源码。
/opt/www/iredamin/controller/mysql/user.py
文件是处理添加操作的,将该文件中Create
类的post
函数之前的两个装饰器去掉,这两个装饰器看名字也可以看出来,一个是要求登录(@decorators.require_login
),一个是要求CSRF-token
校验(@decorators.csrf_protected
)。
(测试的时候,发现了很玄学的事情,没有用过nginx
,不知道是不是和缓存什么的有关系,明明把代码都删掉了…还能正常访问…我疯了…检查了一遍又一遍,确信相关代码是在/opt/www/iredamin/controller/mysql/user.py
中,但仍然无法去掉CSRF-token
校验,终于…我reboot
了,然后正常了。而这个代码是我测试前十几分钟就这样改了的…所以我这俩小时在干啥!!!)
还有/opt/www/iredadmin/libs/mysql/user.php
中add
函数去掉@decorators.require_domain_access
装饰器。
/opt/www/iredadmin/controller/mysql/domain.php
中profile
函数去掉@decorators.require_domain_access
装饰器。
(总之就是把需要登录的函数的装饰器都去掉)
现在可以在没有登录且csrf-token
为空的情况下,创建新的邮件用户了。
(能随便改源码的感觉真是太爽了。随心所欲的实现自己想要的功能。)
对应的用php
来请求创建用户的代码:
// 请求添加用户private function add_user($username, $domain_name, $newpw, $confirmpw){$mail_domain = '192.168.110.92:5932';$iredadmin = 'http://' . $mail_domain . '/iredadmin/create/user/accountbind.com';/* 这样写总是报错$data = ['username' => $username,'domainName' => $domain_name,'newpw' => $newpw,'confirmpw' => $confirmpw,'mailQuota' => 10];*/$data = 'username='.$username.'&domainName='.$domain_name.'&newpw='.$newpw.'&confirmpw='.$confirmpw.'&mailQuota=10';$ch = curl_init();curl_setopt($ch, CURLOPT_URL, $iredadmin);curl_setopt($ch, CURLOPT_HEADER, 0);curl_setopt($ch, CURLOPT_POST, 1);curl_setopt($ch, CURLOPT_POSTFIELDS, $data);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded'));// $res = json_decode(curl_exec($ch), true);$response_header = curl_exec($ch);$meta = curl_getinfo($ch);//$request_header = $meta['request_header'];curl_close($ch);// jsonp返回给客户端return json($meta);}
(对了,再说一次,如果你也需要修改源代码的话,记得重启
邮件服务器搭建 iredmail相关推荐
- centos 7.2 邮件服务器搭建-iredmail邮件服务器搭建与使用
安装以前的装备工作: 修改hostname 使hostname 满足 FQDN的规则 hostname mail.test.com sh hostname #使修改立即生效(当前shell) h ...
- 从零开始邮件服务器搭建
概念解释 SPF:Sender Policy Framework,直译过来就是发件人保证框架.出现的主要原因是SMTP协议的缺陷.XMTP中,发件人的邮箱地址是可以伪造的,因而SPF的出现就是防止伪造 ...
- Linux下简单的邮件服务器搭建
Linux下简单的邮件服务器搭建 电子邮件服务简介 电子邮件是因特网上最为流行的应用之一,而邮件服务器是一种用来负责电子邮件收发管理的设备,它构成了电子邮件系统的核心. 电子邮件系统的组成 MUA( ...
- Postfix邮件服务器搭建之roundcube webmail安装与配置
前几篇文章,我们介绍了有关postfix的相关安装与配置,这篇文章我们再来介绍下,在web下管理postfix的软件roundcube webmail. 注意:本篇文章所需的基础环境都是根据<烂 ...
- linux环境下企业基于域名访问的web于电子邮件服务器 论文,基于Linux平台的企业邮件服务器搭建...
我失骄杨君失柳,杨柳轻飏直上重霄九.得道多助,失道寡助.身后有余忘缩手,眼前无路想回头.鸟宿池边树,僧敲月下门.想当年,金戈铁马,气吞万里如虎. 本文由418133804贡献 pdf文档可能在WAP端 ...
- Linux邮件服务器搭建实验
Linux邮件服务器搭建实验 前言 本文重点在于后面的搭建过程,前面会简单介绍邮件服务原理与工作流程,如果有什么错误或遗漏的地方,欢迎大家指正批评,谢谢. 基本理论说明 电子邮件服务器是处理邮件交换的 ...
- Ubuntu+Sendmail+Dovecot+Openwebmail 邮件服务器搭建完全解决方案
Linux下邮件系统的种类比较多, 但是相较于WIN系统下, 无论是sendmail, 还是qmail, postix来说, 配置过程都是极为艰难的,没错, 是艰难. 相信看到这一篇文章的童鞋早已经熟 ...
- Postfix邮件服务器搭建之虚拟用户配置
参考烂泥的文章 在前一篇文章<烂泥:Postfix邮件服务器搭建之软件安装与配置>中,我们介绍了psotfix邮件服务器搭建所需要的软件,以及各个软件的基本配置. 目前已经达到了通过系统用 ...
- linux系统搭建局域网邮件,Linux局域网邮件服务器搭建
随着企业信息化的普及,国内大部分企事业单位都有属于自己的局域网邮件服务器,如何在Linux局域网内搭建邮件服务器,实现邮件的收发.我们就给大家介绍一下怎样用U-Mail邮件服务器软件来搭建局域网邮件服 ...
- 企业邮件服务器搭建之品牌形象塑造
为什么80%的码农都做不了架构师?>>> 企业邮件服务器搭建,顾名思义即为企业所专门搭建的邮件服务器系统,其目的则主要是通过独立邮件系统,使之能够更好地处理企业内外的电子邮件业 ...
最新文章
- ftp服务----基于虚拟用户的创建
- python前段管理3
- 高并发场景下 disk io 引发的高时延问题
- 三种方式让你轻松监控 EntityFramework 中的 sql 流转
- 如何修复Mac清倒废纸篓提示“操作无法完成,因为该项目正在使用中”
- Unity3d读取XML配置文件
- 丰巢回应小学生用照片“刷脸”取件;苹果明年或发布四款 5G 手机;Spring Boot 2.2.0 发布 | 极客头条...
- Java高并发之CountDownLatch源码分析
- GDI绘制矩形缺少右边和底部边界线问题
- java决策树算法_零基础学习大数据开发技术需要哪些基础知识(1)Java、大数据基础...
- apache log分析
- 小猴子下落nyoj63(一道可以直接写的好题)
- 数据标准在网易的实践
- jdk7 linux 32位 安装包 微云网盘下载
- Camera 数据通路
- [ZZ]在争议中逐渐成熟 电力线通信填平信息鸿沟
- Python字符串和列表常用的方法和操作
- 阿里云ARM服务器通用型g6r实例CPU性能参数详解
- 苏宁零售云,“动物凶猛”
- 高数(下) 第八章:空间解析集合与向量代数
热门文章
- 魔兽世界燃烧的远征最新服务器,魔兽世界燃烧的远征怀旧服
- python 时频图_python,地震波形、时频图、频谱图计算和显示软件
- MTCNN优化和另类用法
- Android Studio+SDK+tools下载、安装、配置及应用程序运行(详细,亲测)
- 【杂项】vmware fusion 流畅度设置
- 【千锋】网络安全笔记(总篇)--- 持续更新
- 通达oa服务器文件夹管理,通达OA办公系统软件功能介绍.doc
- 关于DTCC数据库技术大会
- 极光推送 简书android,极光推送 (具体步骤,指导操作,推送成功)
- 事业单位资产管理系统解决方案:国有资产全生命周期管理监管体系