一:题目

当某人从user1@mta1发送给另一个人user1@mta2时,这两个MTA将会通信。
如果两个收件人属于同一个MTA,发送者的MTA只需与这个MTA通信一次就可以把邮件发送给这两个人。
输入每个MTA里用户列表,对于每个发送请求(发送者和接收者),按顺序输出所有MTA之间的SMTP(简单邮件协议)交互。
发送人MTA连接收件人MTA的顺序应该与在输入中第一次出现的顺序一致。
例如,若发件人是Hamdy@Cairo,收件人列表为Conrado@MexicoCity、Shariff@SanFrancisco、Lisa@MexicoCity,
则Cairo应当依次连接MexicoCity和SanFrancisco。
如果连接某个MTA之后发现所有收件人都不存在,则不应该发送DATA。所有用户名均由不超过15个字母和数字组成。

(一)样例输入

MTA London 4 Fiona Paul Heather Nevil  //MTA无意义 第一个London是邮件传输代理 4 代表有四个用户  Fiona Paul Heather Nevil
MTA SanFrancisco 3 Mario Luigi Shariff
MTA Paris 3 Jacque Suzanne Maurice
MTA HongKong 3 Chen Jeng Hee
MTA MexicoCity 4 Conrado Estella Eva Raul
MTA Cairo 3 Hamdy Tarik Misa
*
Hamdy@Cairo Conrado@MexicoCity Shariff@SanFrancisco Lisa@MexicoCity  //第一个Hamdy@Cairo表示发件人  后面全是收件人(注意:收件人可能不存在)
*  //分割符
Congratulations on your efforts !!
--Hamdy                  //在遇到下面一个*之前的内容全是发送邮件内容
*
Fiona@London Chen@HongKong Natasha@Paris  //这是第二组邮件发送,和上面一致
*
Thanks for the report! --Fiona
*
*  //结束标识

(二)样例输出

Connection between Cairo and MexicoCity
HELO Cairo

MAIL FROM:<Hamdy@Cairo>

RCPT TO:<Conrado@MexicoCity>
250  //注意:当一次给多个发送时,只要有一个用户是有效的:下面都要写出发送内容。若是都无效,则像最下面的那样,不输出内容,直接退出
RCPT TO:<Lisa@MexicoCity>
550  //注意:
DATA

Congratulations on your efforts !!
--Hamdy
.

QUIT

Connection between Cairo and SanFrancisco
HELO Cairo MAIL FROM:<Hamdy@Cairo> RCPT TO:<Shariff@SanFrancisco> DATA Congratulations on your efforts !!
--Hamdy
. QUIT

Connection between London and HongKong
HELO London MAIL FROM:<Fiona@London> RCPT TO:<Chen@HongKong> DATA Thanks for the report! --Fiona
. QUIT

Connection between London and Paris
HELO London MAIL FROM:<Fiona@London> RCPT TO:<Natasha@Paris>
550
QUIT  //直接退出
221

注意:状态码含义

221 Closing connection (after QUIT)  //关闭连接
250 Action was okay (after MAIL FROM and RCPT TO specifying an acceptable user, or completion
of a message)  //行为未出错
354 Start sending mail (after DATA)  //开始传输邮件
550 Action not taken; no such user here (after RCPT TO with unknown user)  //行为出错,没有该用户

二:代码实现

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
#include <set>
#include <map>
#include <vector> using namespace std; int main()
{
freopen("data5_11.in", "r", stdin);
freopen("data5_11.out", "w", stdout); string info,agent,user,Uname,Eagt,content,source_agent;
int num; //列表个数
set<string> user_list; while (cin >> info&&info != "*") //1.获取所有的MTA用户列表
{
cin >> agent>> num;
for (int i = ; i < num; i++)
{
cin >> user;
user_list.insert(user+"@"+agent);  //用于后面检测用户存在
}
} while (cin >> info&&info != "*") //发送方存放在info中
{
source_agent = info.substr(info.find('@')+);
//获取接收方信息
map<string, vector<string> >dest;
vector<string> dest_agt; //接收方代理
set<string> dest_fullinfo; //防止重复发送
while (cin >> Uname&&Uname != "*") //发送方存放在info中
{
if (dest_fullinfo.count(Uname)) //防止重复发送
continue;
dest_fullinfo.insert(Uname); Eagt = Uname.substr(Uname.find('@')+);
Uname = Uname.substr(, Uname.find('@')); if (!dest.count(Eagt)) //如果代理是第一次出现
{
dest_agt.push_back(Eagt);
dest[Eagt] = vector<string>();
}
(dest[Eagt]).push_back(Uname); //插入新的用户
} vector<string> vec_cont; //获取发送内容
getchar(); //将前一个回车吃掉

while (getline(cin,content)&&content!="*")
vec_cont.push_back(content); for (vector<string>::iterator it = dest_agt.begin(); it != dest_agt.end(); it++) //进行信息发送
{
cout << "Connection between " << source_agent << " and " << *it << endl;
cout << "\tHELO " << source_agent << endl << "\t250" << endl;
cout << "\tMAIL FROM:<" << info << ">" << endl<<"\t250"<<endl; int flag = ;
for (vector<string>::iterator it_re = (dest[*it]).begin(); it_re != (dest[*it]).end(); it_re++) //遍历收件人
{
cout << "\tRCPT TO:<" << *it_re << "@" << *it << ">" << endl; if (!user_list.count(*it_re + "@" + *it)) //查找该用户是否存在
cout << "\t550" << endl;
else
{
cout << "\t250" << endl;
flag = 1; //如果出现一个人有效,则正常输出数据
}
}
if (flag) //如果出现一个人有效,则正常输出数据
{
cout << "\tDATA\n\t354" << endl; for (vector<string>::iterator it_c = vec_cont.begin(); it_c != vec_cont.end();it_c++)
cout <<'\t'<< *it_c << endl;
cout << "\t." << endl << "\t250" << endl;
}
cout << "\tQUIT" << endl<<"\t221"<<endl;
}
} freopen("CON", "r", stdin);
freopen("CON", "w", stdout);
return ;
}
命名有点混乱

算法习题---5.11邮件传输代理的交互(Uva814)的更多相关文章

  1. UVa 814邮件传输代理的交互

    好吧,终于知道原来string有这么多用法,map可以通过vector来映射多个数 #include <iostream> #include <string> #include ...

  2. Linux下6种优秀的邮件传输代理

    导读 在互联网上,邮件客户端向邮件服务器发送邮件然后将消息路由到正确的目的地(其他客户),其中邮件服务器使用的一个网络应用程序称为邮件传输代理(MTA). 最好的Linux邮件传输代理(MTAs) 邮 ...

  3. Linux中最受欢迎的邮件传输代理(MTA)

    MTA(Mail transfer Agent) -对于服务器管理员来说,邮件传输代理是最为重要的工具.MTA的主要工作就是将电子邮件从一台主机发送到另一台主机.MTA使用SMTP(简单邮件传输协议) ...

  4. 算法习题---3.11换抵挡装置(UVa1588)

    一:题目 给你连个长度分别为n1,n2且每列高度只为1或2的长条,然后将他们拼在一起,高度不能超过3,问他们拼在一起的最短长度 二:实现思路 1.获取主动轮和从动轮的数据. 2.主动轮不动,从动轮从左 ...

  5. SMTP 简单邮件传输协议

    SMTP 锁定 本词条由“科普中国”百科科学词条编写与应用工作项目 审核 . SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传 ...

  6. 【RL-TCPnet网络教程】第33章 SMTP简单邮件传输协议基础知识

    第33章      SMTP简单邮件传输协议基础知识 本章节为大家讲解SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)的基础知识,方便后面章节的实战操作. (本 ...

  7. SMTP邮件传输协议发送邮件和附件

    在以前接触的项目中,一直都是在做网站时用到了发送mail 的功能,在asp 和.net 中都有相关的发送mail 的类, 实现起来非常简单.最近这段时间因工作需要在C++ 中使用发送mail 的功能, ...

  8. SMTP邮件传输协议发送邮件和附件(转)

    1.     SMTP 常用命令简介 1). SMTP 常用命令 HELO/EHLO 向服务器标识用户身份 MAIL 初始化邮件传输 mail from: RCPT 标识单个的邮件接收人:常在MAIL ...

  9. 【算法习题】数组中任意2个(3个)数的和为sum的组合

    题1.给定一个int数组,一个数sum,求数组中和为sum的任意2个数的组合 @Test public void test_find2() { int[] arr = { -1, 0, 2, 3, 4 ...

随机推荐

  1. destoon自定义函数获取地区名称

    需要在api/extend.func.php 文件中加入的函数 获取地区名称 area_name($areaid) 传入地区id function area_name($areaid) { globa ...

  2. Python语言程序设计(3)--实例2-python蟒蛇绘制-turtle库

    1. 2. 3.了解turtle库 Turtle,也叫海龟渲染器,使用Turtle库画图也叫海龟作图.Turtle库是Python语言中一个很流行的绘制图像的函数库.海龟渲染器,和各种三维软件都有着良 ...

  3. Java静态代理与动态代理 理解与应用场景

    角色 抽象角色:接口类 实现角色: 实现类 代理角色:代理实现的类,最终使用的对象 静态代理 1. 接口 /** * description * * @author 70KG * @date 2018 ...

  4. nodejs查看本机hosts文件域名对应ip

    const dns = require('dns') dns.lookup('domainName', function(err, result) { console.log(result) }) r ...

  5. Go读写文件

    Go序列化和反序列化 package main import ( "bufio" "encoding/json" "fmt" "o ...

  6. Kubernetes 学习23 kubernetes资源指标API及自定义指标API

    一.概述 1.上集中我们说到,官方文档提示说从k8s 1.11版本开始,将监控体系指标数据获取机制移向新一代的监控模型.也就意味着对于我们的k8s来讲现在应该有这样两种资源指标被使用.一种是资源指标, ...

  7. Kubernetes 学习6 Pod控制器应用进阶

    一.资源配置清单 1.自主式Pod资源 2.资源的清单格式,大多数清单格式都遵循如下条件: a.一级字段:apiVersion(group/version),kind,metadata(name,na ...

  8. (尚012)Vue表单数据的自动手集(表单数据提交,需要收集表单数据)

    自动收集,就是我一输入数据,就自动收集,等我点击提交按钮的时候,数据就收集好了 1.使用v-model对表单数据自动收集 1)text/textare----单行/多行输入框 2)checkbox-- ...

  9. 2-使用git管理一个单片机程序

    https://www.cnblogs.com/yangfengwu/p/10842205.html 我用电脑压缩一个文件,然后通过git上传,然后在新买的linux系统通过wget 网络下载这个压缩 ...

  10. emacs源码安装

    1.源码下载地址=>下载 选择下载的版本,我下的是emacs-26.1.tar.xz 版本 2.解压 xz -d emacs-26.1.tar.xz # 解压成tar文件 tar -xvf em ...