#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