关于Message-ID的入信校验

说明

新注册用户Message-ID不符合规则将被退信,现有用户不受影响。

一、什么是Message-ID

Message-ID是一个唯一的标识,用于在邮件系统中区分不同的邮件。

二、Message-ID的语法规则

我们给出一个规范Message-ID的子集:

  • Message-ID首尾分别是<和>

  • @符号的左边和右边的字符串是由零个或多个 . 分割的非空子字符串组成

  • 非空字符串里只能存在可打印的ASCII字符

RFC-5322规范示例:

<d52ce63e-a0d5-4f95-b6a9-e1256a44f5fb@example.net>

<5ef31701.1c631ghz1.13943.bu15@example.net>

校验的该规则的正则表达式为:

<[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+)*@[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+)*>

如需要在Message-ID中加入注释之类的需求,可自行参考RFC 5322,如:

(THIS IS A COMMENT 1)<test@example.net>(THIS is A COMMENT 2))

三、Message-ID的影响

1、一些邮件服务商比如Gmail要求收到的邮件Message-ID符合RFC 5322规范,否则可能会被退信或进入垃圾箱,因此建议发信时,优化Message-ID。

2、邮件通过SMTP程序,入信到阿里的邮件服务器,若Message-ID不符合上述规则,将入信失败,错误如下:

#Message-ID不合法:
564 The format of the message-id is incorrect.Please refer to RFC 5322 section 3.6.4
#注释嵌套太多:如:(outer(inner)(another comment))
565 The nested comment depth exceeds the server's support

Python示例:

# -*- coding: utf-8 -*-
import re


def find_message_ids(text_list):
    # 定义一个用于匹配Message-ID的正则表达式模式
    pattern = '''<[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+)*@[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+)*>'''

    # 遍历列表中的每个文本
    for text in text_list:
        # 使用findall方法在文本中查找所有匹配的电子邮件地址
        emails = re.findall(pattern, text)

        # 打印符合规则的Message-ID
        for email in emails:
            print(f"符合规则: {email}")


# 测试文本列表,包含多个字符串
test_text = [
    "<d52ce63e-a0d5-4f95-b6a9-e1256a44f5fb@example.net>",
    "这是一个测试文本,Message-ID。",
    "<5ef31701.1c631ghz1.13943.bu15@example.net>"
]

# 调用函数
find_message_ids(test_text)