在 ABAP 中检查电子邮件地址 Email 是否有效的两种方法

282 阅读3分钟

在上一篇文章 ABAP 程序中使用正则表达式验证邮箱格式是否正确 中,我使用了正则表达式来验证邮箱 Email 格式,在后续的开发中,还发现了系统标准的函数也可以用于识别电子邮箱是否有效,因此把这篇文章也记录一下如何使用标准函数来检查电子邮件。

在 ABAP 中检查电子邮件是否有效

检查电子邮件是否有效是输入电子邮件地址字段的常见业务要求。常见的邮件格式:

[mail]@[Domain].[Extension]

根据定义电子邮件地址标准的 RFC 5322 官方标准,正则表达式必须是:

(?:[a-z0-9!#$%&’*+/=?^_{|}~-]+(?:.[a-z0-9!#$%&'*+/=?^_{|}~-]+)*|”(?:[x01-x08x0bx0cx0e-x1fx21x23-x5bx5d-x7f]|[x01-x09x0bx0cx0e-x7f])*”)@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[x01-x08x0bx0cx0e-x1fx21-x5ax53-x7f]|[x01-x09x0bx0cx0e-x7f])+)])

由于各种语言对正则表达式的支持不同、语法差异和覆盖率不同,所以,不同语言里面的正则表达式也不同,你可以通过在网上搜索对应语言的 Email 正则是啥,本文只介绍 ABAP 语言。

标准函数 SX_INTERNET_ADDRESS_TO_NORMAL

对于输入字段,请确保根据数据元素 AD_SMTPADR 定义电子邮件地址字段。域 AD_SMTPADR 有 2 个转换例程:

  • CONVERSION_EXIT_SXIDN_INPUT
  • CONVERSION_EXIT_SXIDN_OUTPUT

在 ABAP 中,可以利用标准函数检查电子邮箱地址的有效性: SX_INTERNET_ADDRESS_TO_NORMAL,这个函数是在 AD_SMTPADR 字段的 CONVERSION_EXIT_SXIDN_INPUT 的转换例程中调用的。

地址电子邮箱的地址类型为 INT,地址类型除了邮箱,还有 FAX、TEL 等等,可以在 SXADDRTYPE 表中查询:

image.png

*&---------------------------------------------------------------------*
*& Report ZCHECK_EMAIL
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zcheck_email.

PARAMETERS: p_email TYPE string LOWER CASE.

TYPES: sx_addr_type TYPE sx_addrtyp, "R/3 Addresstype
       sx_addr      TYPE so_rec_ext . "Address in plain string

TYPES: BEGIN OF sx_address,           "SAPconnect general addr
         type    TYPE sx_addr_type,
         address TYPE sx_addr,
       END OF sx_address.

CONSTANTS: cx_t_int    TYPE sx_addr_type VALUE 'INT'.  "SMTP address

DATA: ls_addr_unst      TYPE sx_address.
DATA: ls_addr           TYPE sx_address.
DATA: lv_address_normal TYPE sx_address.
DATA: lv_local          TYPE sx_addr.
DATA: lv_domain         TYPE sx_addr.
DATA: lv_comment        TYPE sx_addr.

ls_addr_unst-type    = cx_t_int.
ls_addr_unst-address = p_email. " P_email : input

CALL FUNCTION 'SX_INTERNET_ADDRESS_TO_NORMAL'
  EXPORTING
    address_unstruct     = ls_addr_unst
  IMPORTING
    address_normal       = lv_address_normal
    local                = lv_local
    domain               = lv_domain
    comment              = lv_comment
    addr_normal_no_upper = ls_addr
  EXCEPTIONS
    error_address_type   = 1
    error_address        = 2
    error_group_address  = 3
    OTHERS               = 4.
IF sy-subrc NE 0 .
  MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
      WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ELSE.
  MESSAGE 'Email address' && ` ` &&  p_email && ' is valid' TYPE 'I'.
ENDIF.

这个程序的测试就交给读者自己进行了。

正则表达式

在 ABAP 中使用的电子邮件的正则表达式是:

\w+(\.\w+)*@(\w+\.)+(\w{2,4})

CL_ABAP_MATCHER 类提供了创建正则表达式和进行匹配检查的方法:

*&---------------------------------------------------------------------*
*& Report ZCHECK_EMAIL
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zcheck_email.

DATA: lv_pattern TYPE string.
DATA: lv_success TYPE char1. "abap_pool. " ABAP_FALSE/TRUE
DATA: lr_matcher TYPE REF TO cl_abap_matcher.

PARAMETERS: p_email TYPE string.

lv_pattern = '\w+(\.\w+)*@(\w+\.)+(\w{2,4})'.
lr_matcher = cl_abap_matcher=>create(
                 pattern = lv_pattern
                 text = 'test@gmail.com' ) .
TRY.
    lr_matcher = cl_abap_matcher=>create(
          pattern       = lv_pattern
          text          = p_email " P_EMAIL: input
          ignore_case   = abap_false
          simple_regex  = abap_false
          no_submatches = abap_false ).

    CALL METHOD lr_matcher->match
      RECEIVING
        success = lv_success.

    IF lv_success = abap_true.
      MESSAGE 'Email is valid' TYPE 'I'.
    ELSE.
      MESSAGE 'Email is not valid' TYPE 'W'.
    ENDIF.
  CATCH cx_sy_regex.
    MESSAGE 'Error occurs' TYPE 'E'.
  CATCH cx_sy_matcher .
    MESSAGE 'Error occurs' TYPE 'E'.
ENDTRY.

测试程序:

  1. 测试输入 hannah.morris.com

image.png

输出:Email is not valid

  1. 测试输入 Hannah.morris@outlook.com,得到下图:

image.png