#P1876. The Letter Carrier's Rounds
The Letter Carrier's Rounds
题目描述
对于一个电子邮件应用程序,你需要描述基于SMTP协议的MTA(邮件传输代理)之间的通信过程。发送方的用户代理(User Agent)将格式化好的消息交给发送方的MTA。发送方MTA使用简单邮件传输协议(SMTP)与接收方MTA进行通信。接收方MTA将邮件递送给接收方的用户代理。
通信链路初始化后,发送方MTA会逐条向接收方MTA发送命令,接收方MTA在处理完每条命令后会返回一个三位数的响应码。发送方命令按以下顺序发送(每条消息):
- `HELO myname`:向接收方标识发送方(注意:只有一个L)
- `MAIL FROM:<sender>`:标识消息发送者
- `RCPT TO:<user>`:标识消息的一个接收者(同一消息发送给同一MTA的多个用户时会有多个该命令)
- `DATA`:后跟任意行数的消息正文,以单独一行包含英文句点(.)结束
- `QUIT`:终止通信
接收方MTA返回的响应码包括:
- `221`:关闭连接(在QUIT后返回)
- `250`:操作成功(在MAIL FROM和RCPT TO指定有效用户后,或消息传输完成时返回)
- `354`:开始发送邮件(在DATA后返回)
- `550`:操作未执行;无此用户(在RCPT TO指定未知用户时返回)
输入格式
输入包含多个MTA描述,后跟任意数量的消息。每个MTA描述以MTA名称(1-15个字母数字字符)开始,接着是该MTA的用户数量和用户列表(每个用户1-15个字母数字字符)。MTA描述以单独一行的星号(*)结束。
每条消息以发送者名称开始,后跟接收者列表(格式为user@mtaname)。消息正文(每行不超过72个字符)以单独一行的星号开始和结束。单独一行的星号(而非发送者和接收者列表)表示整个输入结束。
输出格式
对于每条消息,显示发送方和接收方MTA之间的通信过程。消息中提到的每个MTA都是有效的,但接收方MTA可能不存在指定的用户。接收方MTA会通过返回550响应码拒绝这些用户的邮件。拒绝不会影响同一MTA上其他授权用户的邮件接收。如果某个MTA没有至少一个有效接收者,则不会发送DATA命令。发送给同一MTA的多个用户只需一个SMTP会话。此外,同一用户只会被发送一次消息。
如样例输出所示,在通信内容前标明通信的MTA名称,并缩进每行通信内容。
输入数据 1
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
*
Congratulations on your efforts !!
--Hamdy
*
Fiona@London Chen@HongKong Natasha@Paris
*
Thanks for the report! --Fiona
*
*
输出数据 1
Connection between Cairo and MexicoCity
HELO Cairo
250
MAIL FROM:<Hamdy@Cairo>
250
RCPT TO:<Conrado@MexicoCity>
250
RCPT TO:<Lisa@MexicoCity>
550
DATA
354
Congratulations on your efforts !!
--Hamdy
.
250
QUIT
221
Connection between Cairo and SanFrancisco
HELO Cairo
250
MAIL FROM:<Hamdy@Cairo>
250
RCPT TO:<Shariff@SanFrancisco>
250
DATA
354
Congratulations on your efforts !!
--Hamdy
.
250
QUIT
221
Connection between London and HongKong
HELO London
250
MAIL FROM:<Fiona@London>
250
RCPT TO:<Chen@HongKong>
250
DATA
354
Thanks for the report! --Fiona
.
250
QUIT
221
Connection between London and Paris
HELO London
250
MAIL FROM:<Fiona@London>
250
RCPT TO:<Natasha@Paris>
550
QUIT
221