2016-10-28 14:19:20 shishui07 阅读数 8092
  • Nginx从入门到应用

    Nginx ("engine x") 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。

    3391 人正在学习 去看看 姜威

mailx是linux系统上常见的邮件发送工具,可以通过配置smtp服务器使用大部分的邮箱发送邮件。
使用yum源安装mailx

yum install mailx

安装完成后可以在/etc/目录下看到mailx的配置文件mail.rc(nail.rc)。编辑该文件,在文件的最后加入smtp服务器的设置

vi /etc/mail.rc
...
set from=xxxxxx@xxxxx.cn smtp=mail.xxxxx.cn
set smtp-auth-user=xxxxxx@xxxxx.cn smtp-auth-password=........
set smtp-auth=login

保存配置,需要注意的是* smtp配置中from后的邮箱地址与smtp-auth-user是要求一致的。不过不是同一个,会发生报错*
配置完成后mailx的发送邮件语法可以是

echo "mail content"|mailx -s "mail title" xxxxx@xxxxx.cn,xxxxx@xxxx.cn 

或者

mailx -s "mail title" xxxx@xxxx.cn <mailcontent.txt

至此就可以使用mailx顺利的发送邮件了

2018-09-07 23:05:30 txc3210 阅读数 1456
  • Nginx从入门到应用

    Nginx ("engine x") 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。

    3391 人正在学习 去看看 姜威

#Linux C语言使用SMTP协议发送邮件(使用25端口)

本程序使用SMTP协议发送邮件,使用普通的25端口,属于非加密邮件。

经测试,可以使用的邮箱服务器有126,163,sohu,QQ企业邮箱等,在使用的时候,有些邮箱可以直接使用密码登录,有些邮件要使用授权码,这个可以看邮箱说明。

返回值:0代表发送邮件成功,<0发送失败。

注意:大部分云服务器禁用了25端口,会导致连接邮箱服务器失败,不是本程序的问题,这种情况需要使用465端口SSL加密方式发邮件,SSL方式发送邮件后面再写。

代码如下

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <errno.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <unistd.h>	

struct Base64Date6
{
	unsigned int d4:6;
	unsigned int d3:6;
	unsigned int d2:6;
	unsigned int d1:6;
};

char ConvertToBase64(char uc)
{
	if(uc < 26)	
		return 'A' + uc;	
	if(uc < 52)	
		return 'a' + (uc - 26);	
	if(uc < 62)	
		return '0' + (uc - 52);	
	if(uc == 62)	
		return '+';	
	return '/';
}

void  EncodeBase64(char*dbuf,char*buf128,int len)
{
	struct  Base64Date6*ddd =NULL;
	int i = 0;
	char buf[256] = {0};
	char *tmp = NULL;
	char cc = '\0';
	memset(buf, 0, 256);
	strcpy(buf, buf128);
	for(i = 1; i <= len / 3; i++)
	{
		tmp = buf + (i - 1) * 3;
		cc = tmp[2];
		tmp[2] = tmp[0];
		tmp[0] = cc;
		ddd = (struct Base64Date6*)tmp;
		dbuf[(i - 1) * 4 + 0]=ConvertToBase64((unsigned int)ddd->d1);
		dbuf[(i - 1) * 4 + 1]=ConvertToBase64((unsigned int)ddd->d2);
		dbuf[(i - 1) * 4 + 2]=ConvertToBase64((unsigned int)ddd->d3);
		dbuf[(i - 1) * 4 + 3]=ConvertToBase64((unsigned int)ddd->d4);
	}
	if(len % 3 == 1)
	{
		tmp = buf + (i - 1) * 3;
		cc = tmp[2];
		tmp[2] = tmp[0];
		tmp[0] = cc;
		ddd = (struct Base64Date6*)tmp;
		dbuf[(i - 1) * 4 + 0]=ConvertToBase64((unsigned int)ddd->d1);
		dbuf[(i - 1) * 4 + 1]=ConvertToBase64((unsigned int)ddd->d2);
		dbuf[(i - 1) * 4 + 2]='=';
		dbuf[(i - 1) * 4 + 3]='=';
	}
	if(len % 3 == 2)
	{
		tmp = buf + ( i - 1) * 3;
		cc = tmp[2];
		tmp[2] = tmp[0];
		tmp[0] = cc;
		ddd = (struct Base64Date6*)tmp;
		dbuf[(i - 1) * 4 + 0]=ConvertToBase64((unsigned int)ddd->d1);
		dbuf[(i - 1) * 4 + 1]=ConvertToBase64((unsigned int)ddd->d2);
		dbuf[(i - 1) * 4 + 2]=ConvertToBase64((unsigned int)ddd->d3);
		dbuf[(i - 1) * 4 + 3]='=';
	}
	return;
}

class Socket_RAII{
public:
	Socket_RAII(int sockfd)
	{
		m_sockfd = sockfd;
	}
	~Socket_RAII()
	{
		close(m_sockfd);		
	}
private:
	int m_sockfd;
};

int SendEmail(
	const char *smtp,//邮箱服务器地址:如smtp.exmail.qq.com
	unsigned short port,//邮箱服务器商品:25
	const char *account,//发送方的邮箱帐号
	const char *password,//发送方的邮箱密码或授权码
	const char* email,//目标邮箱
	const char* body,//邮件正文件内容,字符串
	const char* from_name,//邮件发送方的名称
	const char* to_name,//邮件接收方的名称
	const char* subject )//邮件主题
{	
	struct sockaddr_in server_addr;	
	memset(&server_addr, 0, sizeof(server_addr));
	server_addr.sin_family = AF_INET;	
	server_addr.sin_port = htons(port);
	hostent* hptr = gethostbyname(smtp); 
	server_addr.sin_addr = *(struct in_addr*)*hptr->h_addr_list;		
	int sockfd = socket(AF_INET, SOCK_STREAM, 0);	
	int ret = connect(sockfd, (struct sockaddr*)(&server_addr), sizeof(server_addr));
	if(ret == -1)
	{
		printf("%s():connect email server failed:%s(errno:%d)\n", 
				__func__, strerror(errno), errno);
		return -1;
	}	
	Socket_RAII Raii(sockfd); //使用RAII关闭SOCKET连接
	char rbuf[255];	
	memset(rbuf, 0, sizeof(rbuf));
	ret = recv(sockfd, rbuf, sizeof(rbuf), 0);
	if(ret <= 0)	
		return -2;
	if(strncmp(rbuf, "220", 3) != 0)
		return -3;
	
	char sbuf[1500];	
	// EHLO
	int len = snprintf(sbuf, sizeof(sbuf), "EHLO HYL-PC\r\n");
	ret = send(sockfd, sbuf, len, 0);
	if(ret == SOCKET_ERROR)
		return -4;
	memset(rbuf, 0, sizeof(rbuf));
	ret = recv(sockfd, rbuf, sizeof(rbuf), 0);	
	if(ret <= 0)	
		return -5;
	if(strncmp(rbuf, "250", 3) != 0)
		return -6;
		
	// AUTH LOGIN
	len = snprintf(sbuf, sizeof(sbuf), "AUTH LOGIN\r\n");
	ret = send(sockfd, sbuf, len, 0);
	if(ret == SOCKET_ERROR)
		return -7;
	memset(rbuf, 0, sizeof(rbuf));
	ret = recv(sockfd, rbuf, sizeof(rbuf), 0);	
	if(ret <= 0)	
		return -8;
	if(strncmp(rbuf, "334", 3) != 0)
		return -9;
	
	//USER
	len = snprintf(sbuf, sizeof(sbuf), "%s", account);
	char login[128];
	memset(login, 0, sizeof(login));
	EncodeBase64(login, sbuf, len);
	len = snprintf(sbuf, sizeof(sbuf), "%s\r\n", login);
	ret = send(sockfd, sbuf, len, 0);
	if(ret == SOCKET_ERROR)
		return -10;
	memset(rbuf, 0, sizeof(rbuf));
	ret = recv(sockfd, rbuf, sizeof(rbuf), 0);	
	if(ret <= 0)	
		return -11;
	if(strncmp(rbuf, "334", 3) != 0)
		return -12;
		
	//PASSWORD
	len = snprintf(sbuf, sizeof(sbuf), "%s", password);
	//char login[128];
	memset(login, 0, sizeof(login));
	EncodeBase64(login, sbuf, len);
	len = snprintf(sbuf, sizeof(sbuf), "%s\r\n", login);
	ret = send(sockfd, sbuf, len, 0);
	if(ret == SOCKET_ERROR)
		return -13;
	memset(rbuf, 0, sizeof(rbuf));
	ret = recv(sockfd, rbuf, sizeof(rbuf), 0);	
	if(ret <= 0)	
		return -14;
	if(strncmp(rbuf, "235", 3) != 0)
		return -15;
	
	// MAIL FROM
	len = snprintf(sbuf, sizeof(sbuf), "MAIL FROM:<%s>\r\n", account);
	ret = send(sockfd, sbuf, len, 0);
	if(ret == SOCKET_ERROR)
		return -16;
	memset(rbuf, 0, sizeof(rbuf));
	ret = recv(sockfd, rbuf, sizeof(rbuf), 0);	
	if(ret <= 0)	
		return -17;
	if(strncmp(rbuf, "250", 3) != 0)
		return -18;	
	
	// RCPT TO
	len = snprintf(sbuf, sizeof(sbuf), "RCPT TO:<%s>\r\n", email);
	ret = send(sockfd, sbuf, len, 0);
	if(ret == SOCKET_ERROR)
		return -19;
	memset(rbuf, 0, sizeof(rbuf));
	ret = recv(sockfd, rbuf, sizeof(rbuf), 0);	
	if(ret <= 0)	
		return -20;
	if(strncmp(rbuf, "250", 3) != 0)
		return -21;
		
	// DATA 准备开始发送邮件内容
	len = snprintf(sbuf, sizeof(sbuf), "DATA\r\n");
	ret = send(sockfd, sbuf, len, 0);
	if(ret == SOCKET_ERROR)
		return -22;
	memset(rbuf, 0, sizeof(rbuf));
	ret = recv(sockfd, rbuf, sizeof(rbuf), 0);	
	if(ret <= 0)	
		return -23;
	if(strncmp(rbuf, "354", 3) != 0)
		return -24;		
		
	// 发送邮件内容,\r\n.\r\n内容结束标记
	len = snprintf(sbuf, sizeof(sbuf),
			"From: %s<%s>\r\n""To: %s<%s>\r\n""Subject: %s\r\n\r\n""%s\r\n.\r\n",
			from_name, account, to_name, email, subject, body);
	ret = send(sockfd, sbuf, len, 0);
	if(ret == SOCKET_ERROR)
		return -25;
	memset(rbuf, 0, sizeof(rbuf));
	ret = recv(sockfd, rbuf, sizeof(rbuf), 0);	
	if(ret <= 0)	
		return -26;
	if(strncmp(rbuf, "250", 3) != 0)
		return -27;	
		
	// QUIT
	len = snprintf(sbuf, sizeof(sbuf), "QUIT\r\n");
	ret = send(sockfd, sbuf, len, 0);
	if(ret == SOCKET_ERROR)
		return -28;
	memset(rbuf, 0, sizeof(rbuf));
	ret = recv(sockfd, rbuf, sizeof(rbuf), 0);	
	if(ret <= 0)	
		return -29;
	if(strncmp(rbuf, "221", 3) != 0)
		return -30;				
	return 0;
};

int main(int argc, char* argv[])
{	
	int ret = SendEmail("smtp.exmail.qq.com", 25, "account","password",
					"111111@qq.com", "This is the body", "from name",
					"To name", "This is the subject");	
	if(ret == 0)
		printf("SendEmail success\n");
	else
		printf("SendEmail failed,errno= %d\n",ret);
	return 0;
}
2016-12-14 19:00:59 u011420693 阅读数 250
  • Nginx从入门到应用

    Nginx ("engine x") 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。

    3391 人正在学习 去看看 姜威

(只有问题啊,能不能把整体流程,常用配置熟悉啊,啊啊啊,后期补,希望后会有期T.T——20161214)


命令行发送邮件:

 echo  hello word | mail -s " title" test@test.com

问题:

send-mail: fatal: parameter inet_interfaces: no local interface found for ::1

解决:

(1)sudo vi  /etc/postfix/main.cf 

将 inet_interfaces = loclhost 改成inet_interfaces = all

(2)sudo   service postfix start

解决原由见文件注释中,也就是说默认是网络接口在本地,改成all就是全部都可以接收到本机发出的邮件

(天哪,这硬翻真的是好惭愧,宝宝还要好好练专业英语T.T ——20161214)

# RECEIVING MAIL

# The inet_interfaces parameter specifies the network interface
# addresses that this mail system receives mail on.  By default,
# the software claims all active interfaces on the machine. The
# parameter also controls delivery of mail to user@[ip.address].
#
# See also the proxy_interfaces parameter, for network addresses that
# are forwarded to us via a proxy or network address translator.
#
# Note: you need to stop/start Postfix when this parameter changes.

2018-01-08 16:54:05 lysinely 阅读数 112
  • Nginx从入门到应用

    Nginx ("engine x") 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。

    3391 人正在学习 去看看 姜威


MUA(Mail User Agent)接收邮件所使用的邮件客户端,使用IMAP或POP3协议与服务器通信;如 outlook、thunderbird、Mac Mail、mutt;
MTA(Mail Transfer Agent) 通过SMTP协议发送、转发邮件;如:sendmail、postfix
MDA(Mail Deliver Agent)将MTA接收到的邮件保存到磁盘或指定地方,通常会进行垃圾邮件及病毒扫描;如 procmail、dropmail
MRA(Mail Receive Agent)负责实现IMAP与POP3协议,与MUA进行交互;dovecot。
SMTP(Simple Mail Transfer Protocol)简单邮件传输协议;
IMAP(Internet Message Access Protocol)接收邮件使用的标准协议之一;
POP3(Post Office Protocol 3) 接收邮件使用的标准协议之一。

POP3通常用于网络连接较慢的用户连接至邮件服务器。POP3的一条基本原则是,MUA从服务器上下载邮件并保存在本地磁盘上,然后将服务器上的邮件删除。
IMAP通常用于局域网(LAN)或网络连接较快的用户,使用 IMAP的目的就是只在每次有未读消息时才连接服务器(而不是使用类似于MUA的缓存)。

##邮件格式:
1、abc@xyz.com(用户名@域名)
2、abc@mail.xyz.com(用户名@主机名)
而1是最早创建的格式,2是最为确切的位置
域并不代表一个特定的主机,所以还不知道邮件服务器的主机名是那个,而在dns中可以记录一个域的邮件服务器地址(称为mx记录)。所以在发送邮件时候还要通过dns去查找该域下的邮件服务器的地址。

##SMTP
SMTP协议属于TCP/IP协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地;
SMTP使用TCP端口25。要为一个给定的域名决定一个SMTP服务器,需要使用MX (Mail eXchange)DNS。

登陆smtp服务器:
telnet smtp.qq.com 465
ping smtp.qq.com

状态码:
220 : 服务就绪
250 :请求邮件动作正确,完成(HELO,MAIL FROM,RCPT TO,QUIT 指令执行成功会返回此信息)
235 :认证通过
221 :正在处理
354 :开始发送数据,结束以 .(DATA指令执行成功会返回此信息)
500 :语法错误,命令不能识别
550 :命令不能执行,邮箱无效
552 :中断处理:用户超出文件空间

1.利用qq邮箱的smtp发送邮件

 auth login后需要输入你的qq邮箱的用户名和密码,而且要转换为BASE64编码,如QQ 352000114 用户名对应MzUwNTEwMzc2,



出现的问题:


由于qq邮箱的安全设置问题,需要开启POP3/SMTP服务获取授权码登陆;
一般通过网站发送的邮件会被认为不安全的,可以在邮箱首页-自助查询-收信查询-邮件拦截     查看被过滤的邮件


2.postfix的配置(发送邮件服务器)
vim /etc/postfix/main.cf
主要配置参数:
myhostname = mail.lysine.com
 #postfix邮件系统的主机名
mydomain = lysine.com
 
myorigin = $mydomain
#指明发件人域名,为@后面的域名
 
inet_interfaces = all
#指定postfix系统监听的网络接口
inet_protocols = all
 
mydestination = $myhostname, localhost.$mydomain, localhost,$mydomain
#指定postfix接收邮件时的收件人域名
mynetworks = 192.168.1.0/24, 127.0.0.0/8
#指定所在网络地址,区别远程还是本地,允许本地访问
broken_sasl_auth_clients = yes
smtpd_banner = $myhostname ESMTP Server
smtpd_sasl_auth_enable = yes   #服务器使用smtp认证
smtpd_client_restrictions = permit_sasl_authenticated
smtpd_sasl_security_options = noanonymous  #不允许匿名登陆
message_size_limit = 5242880    #邮件大小为5M


2.smtp认证的相关配置
vim /etc/sasl2/smtp.conf


为了提高安全性,不将系统用户的密码作为相应用户SMTP认证的密码,而将在后面为用户建立SMTP认证专用的密码,并采用MD5加密方式;


vim /etc/sysconfig/saslauthd
MECH=shadow
FLAGS=sasldb2


chmod 755 /etc/sasldb2
chkconfig postfix on


 发送邮件



日志查看  tailf /var/log/maillog



3.dovercot  开源的IMAP和POP3,作为MRA
vim /etc/dovecot/dovecot.conf


vim /etc/dovecot/conf.d/10-auth.conf
disable_plaintext_auth = no

auth_mechanisms = plain login


在/etc/hosts 添加本地的域名映射:192.168.1.120  mail.lysine.com

测试devocot



2017-01-01 22:01:14 shawpan 阅读数 7324
  • Nginx从入门到应用

    Nginx ("engine x") 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。

    3391 人正在学习 去看看 姜威

在mint下,sentmail和postfix的配置有比较麻烦..配置了N个小时,最终弄的头晕眼花也没弄好...

下面的方法可以让你完全摆脱这两个工具...当然,你要是想做邮件服务器的话就令当别论了...你要是只想让服务器自动发个邮件什么的,用下面的就行了。

如果之前安装了sendmail, postfix.先关闭本机的sendmail服务或者postfix服务。

service sendmail stop
service postfix stop

或者直接卸载

sudo apt-get remove sendmail mailutils postfix

然后安装mailx

sudo apt-get install heirloom-mailx

然后修改/etc/nail.rc,注意是nail.rc文件。网上有些教程写的是mail.rc文件(Centos下是 /etc/mail.rc),如果mint(或ubuntu)下修改mail.rc,就会报No such file or directory as on /usr/lib/sendmail 的错误,见:http://askubuntu.com/questions/408808/no-such-file-or-directory-as-on-usr-lib-sendmail-ubuntu

在/etc/nail.rc中添加如下内容:

  1. set from=yourname@yeah.net
  2. set smtp=smtp.yeah.net
  3. set smtp-auth-user=yourname@yeah.net
  4. set smtp-auth-password=12345678
  5. set smtp-auth=login

然后就可以通过命令来发送邮件了

  1. echo testmail | mail -s 'test' -a README.md 123456789@qq.com

将echo后的内容通过管道给mail作为邮件内容,-s 表示主题,-a表示附件。

发送多个附件:

若添加多个附件,则使用多次-a,如:

  1. echo testfile | mail -s 'test_attachments' -a README.md -a 123.txt -a sendmail.py 12345678@qq.com

或者先将邮件内容写到一个文件,然后通过管道或者重定向将文件内容写到mail中

  1. cat 123.txt | mail -s 'test' 12345678@qq.com
  2. 或者
  3. mail -s 'test' 12345678@qq.com <123.txt
没有更多推荐了,返回首页