linux怎么搭建邮件服务器啊
linux服务器搭建好了,用java可以收发邮件,可我想注册一个用户,那么这个oot用户身份发送的你换那个要发的用户登录发的话,对发收到的就是改用户的
141Linux 安装及配置邮件服务器
效果截图
Sendmail :sendmail 是最古老的 MTA(Mail Transfer Agent,电子邮件系统)之一,最早它诞生的时候,Internet 还没有被标准化,当时主机之间使用的是 UUCP 技术来交换邮件。它被设计得比较灵活,便于配置和运行于各种类型的机器。
Qmail :qmail 是新生一代的 MTA 代表,它以速度快、体积小、易配置安装等特性而著称。作者 D.J.Bernstein 是一个数学教授,富有传奇色彩。他于 1995 年开发 qmail,1996 年发布 0.70 版,并使用了多种当时比较先进的 技术,包括 Maildir,与 sendmail 单个 binary 不同的模块化设计,权限分离,以及使用了大量由他编写的配套工具,如 daemontool,ucsip-tcp 等。qmai 迅速成为了 Internet 上最有名的 MTA,使用者众。
postfix :postfix 如今已经独树一帜,流水线、模块化的设计,兼顾了效率和功能。灵活的配置和扩展,使得配置 postfix 变得富有趣味。其主要的特点是速度快、稳定,而且配置/功能非常强大,并和 sendmail 类似,提供了与外部程序对接的 API/protocol。尤其是配置部分,postfix 另一个优势是至今依然保持活跃的开发工作,而且稳步发展,适合高流量大负载的系统,扩充能力较强。本实验也是基于 postfix 服务器软件来实现。
邮件服务器基本的工作原理
MUA(Mail User Agent):向外发送邮件,以及提供用户浏览与编写邮件的功能。
MTA(Mail Transfer Agent):(可以理解为 smtpd 服务器)帮忙将用户的邮件传递出去或接收进来。
MDA(Mail Delivery Agent):将接收下来的邮件存放到对应用户邮筒当中的程序。通过分析 MTA 所收到邮件的表头或内容,来判断此邮件是属于哪个用户,然后决定将此邮件投递给哪个用户的邮筒里。
MRA(Mail Retrieval Agent):通过 MRA 服务器提供的邮政服务协议(POP)来接收自己的邮件。
邮件中继:
SMTPD 要支持邮件路由功能,需要打开 Open Relay 开放式中继。
SMTPD 是根据收件人判断邮件是否需要中继,而且只给指定的客户端中继。
注:当 DNS 上存在多个 MX 记录的主机这时就是根据 DNS 的邮件级判断了。DNS 上定义的值越小,其优先级越高。辅助交换器接受到邮件并不能保存邮件。而是这个辅助交换器会等到主邮件交换器空闲的时候把代替它接受下来的邮件在转给主邮件交换器。所以任何邮件处理都是主邮件交换器处理的。所以我们实际情况下,如果有 2 台服务器做邮件交换器,性能比较高的应该为主的。
安装配置过程中,postfix 通过 Internet 发送和接收 email,并存储在用户邮箱里。同时客户也可以通过 IMAP 或者 POP3 恢复他们的邮件。其中的客户认证是通过 Courier Authdaemon 模块的。下图表示出了这个过程:
出现安装界面时,首先按下 tab 键切换到确定,然后按下回车。
安装 postfix 的时候会问你安装的服务器类型,对于我们的需要,我们选择默认的 Internet Site,这是最符合我们的服务器类型,然后按下回车确认。
使用 vim 编辑配置文件:
大概在第 31 行,编辑 myhostname,修改为 myhostname = shiyanlou.com。
然后我们把 alias_map 参数修改为 alias_maps = hash:/etc/postfix/virtual,之后会讲解 virtual 里面填写什么。
之后设置 mynetworks 段落,它定义可以使用这台服务器的主机,我们这里就用默认的本地地址。你也可设置为其他地址。
编辑完成后按下 Esc 键,输入 :wq 保存退出。
此命令创建了一个用户 master,其中 -d 和 -m 选项用来为登录名 master 产生一个主目录 /usr/master(/usr 为默认的用户主目录所在的父目录)。
我们编写之前设置的 virtual 文件,这些邮箱地址是用来传送邮件的。
在这个文件里,我们将设置一个表,对应相关的邮件地址。
完成后保存关闭文件。
我们可以通过调用下面这个命令来实现我们的映射:
接着我们重启 postfix,完成我们的修改:
我们可以用 shiyanlou 这个账号给 master 这个账号发一封邮件。首先我们需要安装一个命令行收发邮件的软件 mailutils 。
写一封邮件
输入如下内容:
其中 -s 参数是指邮件的标题, 后面是将要发送的邮件内容从 hello.txt 中重定向。这个命令如果正确执行不会有输出。
然后我们切换到 master 用户,查看我们的邮件。
按下回车建可以查看邮件内容,输入 quit 即可退出邮箱。
Linux 邮件服务器原理介绍,编译安装 Postfix 实现本地的邮件服务
Ubuntu 服务器指南-邮件服务-Postfix
how-to-run-your-own-mail-server-with-mail-in-a-box-on-ubuntu-14-04
如何在linux 下配置 SMTP 服务
Linux下的SMTP服务的配置,比较复杂一些,且各发行版本有些差异,以下是一个示例,供参考(建议使用第三个方法)
linux下smtp配置方法有几种,具体如下:
方法一,使用mail函数发送邮件;使用时时需要在本地系统上正确设置SMTP,否则将不能发送邮件。由于对系统的依赖性比较大,很多时候很不稳定,在一些提供虚拟主机服务的代理商中使用mail函数发送邮件往往很不好用,所以不推荐使用这种方法。
方法二,使用管道的形式发送邮件,主要是使用php中的popen函数。使用管道的方法发送邮件属于比较底层的操作,它取决于用户调用程序的稳定性。所以相比mail函数,这是一种可选的发送邮件的方式,但是这些本地的邮件系统都太复杂了,用户可能不会配置。
方法三(推荐),使用phpmailer。phpmailer类是一个开源的发送邮件类,可以从官网下载,它含两个文件class.smtp.php和class.phpmailer.php。代码如下
include_once(\"class.phpmailer.php\");
/**
* 定义邮件模块配制信息
*/
define(\"SMTP_HOST\",\"smtp.mail.yahoo.com\"); // SMTP 主机
define(\"SMTP_MAIL\",\" XXXX@yahoo.cn\"); // SMTP 用户email
define(\"SMTP_PASS\",\" XXXX\"); // SMTP 用的密码
define(\"SERVICE_MAIL\",\" XXXX@yahoo.cn\"); // SMTP 用户email
define(\"SERVICE_NAME\",\"PHPBOOK邮件测试\"); // SMTP 用的名字
/**
* 使用phpmailer发邮件模块
*
* @param string $email
* @param string $user
* @param string $subject
* @param string $body
* @return bool
*/
function sendMail($email,$user,$subject,$body)
{
$mail = new PHPMailer();
//$this;
$mail-IsSMTP(); // 设置使用SMTP
$mail-Host = SMTP_HOST; // 设置SMTP服务器地址
$mail-SMTPAuth = true; // 打开SMTP权限验证
$mail-Username = SMTP_MAIL; // SMTP 用户名
$mail-Password = SMTP_PASS; // SMTP 服务器密码
$mail-From = SERVICE_MAIL; // 设置发送者地址
$mail-FromName = SERVICE_NAME; // 设置发送者名字
$mail-AddAddress($email, $user); // 添加接收者地址
$mail-AddReplyTo(SERVICE_MAIL, SERVICE_NAME); // 设置回复地址
$mail-WordWrap = 50; // 设置显示格式
$mail-IsHTML(true); // 设置邮件支持html
$mail-Subject = $subject;
$mail-Body = $body;
$mail-AltBody = \"\"; // 文本类型的邮件
if(!$mail-Send())
{
return $mail-ErrorInfo;
}
return true;
}
//开始发送测试邮件ng: fsockopen() [function.fsockopen]: php_network_getaddresses: getaddrinfo failed: Name or service not known in /var/www/xiehui/admin/mail/class.smtp.php on line 89
$tomail = \" XXXX@126.com\";
$user = \" XXXXlinux\";
$_mailSubject = \"邮件测试示例!\"; // 发给用户的邮件标题小组
$_mailBody = \"新浪网\"; // 邮件内容小组
sendMail($tomail,$user,$_mailSubject,$_mailBody);
?
实验证明yahoo的smtp很好用,号称sina的其实并不好用,我卡在着好长时间。
方法四,给予socket编写的程序,源代码如下
使用socket发送邮件的封装类:
class sendmail{
var $lastmessage; //记录最后返回的响应信息
var $lastact; //最后的动作,字符串形式
var $welcome; //用在HELO后面,欢迎用户
var $debug; //是否显示调试信息
var $smtp; //smtp服务器
var $port; //smtp端口号
var $fp; //socket句柄
//发送邮件函数
function send_mail($smtp, $welcome=\"\", $debug=false) {
if(empty($smtp)) die(\"SMTP不能为空!\");
$this-smtp=$smtp;
if(empty($welcome)) {
$this-welcome=gethostbyaddr(\"localhost\");
}else
$this-welcome=$welcome;
$this-debug=$debug;
$this-lastmessage=\"\";
$this-lastact=\"\";
$this-port=\"25\";
}
//显示调试信息
function show_debug($message, $inout) {
if ($this-debug) {
if($inout==\"in\"){ //响应信息
$m=\' \';
}else
$m=\' \';
if(!ereg(\"\\n$\", $message))
$message .= \"
\";
$message=nl2br($message);
echo \"${m}${message}\";
}
}
//执行传递的命令
function do_command($command, $code) {
$this-lastact=$command;
$this-show_debug($this-lastact, \"out\");
fputs ( $this-fp, $this-lastact );
$this-lastmessage = fgets ( $this-fp, 512 );
$this-show_debug($this-lastmessage, \"in\");
if(!ereg(\"^$code\", $this-lastmessage))
return false;
else
return true;
}
//邮件发送处理
function send( $to,$from,$subject,$message) {
//连接服务器
$this-lastact=\"connect\";
$this-show_debug(\"连接到SMTP 服务器: \".$this-smtp, \"out\");
$this-fp = fsockopen ( $this-smtp, $this-port );
if ( $this-fp ) {
$this-set_socket_blocking( $this-fp, true );
$this-lastmessage=fgets($this-fp,512);
$this-show_debug($this-lastmessage, \"in\");
if (! ereg ( \"^220\", $this-lastmessage ) ) {
return false;
}else{
$this-lastact=\"HELO \" . $this-welcome . \"\\n\";
if(!$this-do_command($this-lastact, \"250\")){
fclose($this-fp);
return false;
}
$this-lastact=\"MAIL FROM: $from\" . \"\\n\";
if(!$this-do_command($this-lastact, \"250\")){
fclose($this-fp);
return false;
}
$this-lastact=\"RCPT TO: $to\" . \"\\n\";
if(!$this-do_command($this-lastact, \"250\")){
fclose($this-fp);
return false;
}
//开始发送邮件正文
$this-lastact=\"DATA\\n\";
if(!$this-do_command($this-lastact, \"354\")){
fclose($this-fp);
return false;
}
//开始处理邮件主题头
$head=\"Subject: $subject\\n\";
if(!empty($subject) !ereg($head, $message)){
$message = $head.$message;
}
//开始处理邮件From头
$head=\"From: $from\\n\";
if(!empty($from) !ereg($head, $message)) {
$message = $head.$message;
}
//开始处理邮件To头
$head=\"To: $to\\n\";
if(!empty($to) !ereg($head, $message)) {
$message = $head.$message;
}
//处理结束串
if(!ereg(\"\\n\\.\\n\", $message))
$message .= \"\\n.\\n\";
$this-show_debug($message, \"out\");
fputs($this-fp, $message);
$this-lastact=\"QUIT\\n\";
if(!$this-do_command($this-lastact, \"250\")){
fclose($this-fp);
return false;
}
}
return true;
}else{
$this-show_debug(\"连接失败!!\", \"in\");
return false;
}
}
}
?
使用socket发送邮件示例:
include (\"./sendmail.class.php\");
$mail = new sendmail();
$email = \"您好,这是一个测试邮件!\";
$sendmail = new send_mail(\"smtp.mail.126.com\",\"PHPBOOK\",true); //显示调示信息
if($mail-send(\"XXXX@126.com\", \"XXXX@126.com\", \"测试SOCKET邮件\", $email)) {
echo \"发送成功!
\";
}else{
echo \"发送失败!
\";
}
?