Skip to Content

Overview:

  • Business scenario, where it is required to extract mail attachments and store it to some SAP directory.
  • Here, one common mail-id is been used by a group of users to send mail-attachments from their respective ends.
  • There may be two cases:
    1. One attachment per unread Mail
    2. Multiple attachment per unread Mail

 SAP PI Scenario details:

  • One SAP-PI’s “Mail to File Inbound Asynchronous” interface will be created to achieve above requirement.
  • Using Mail Sender Adapter, interface will read all mail with their attachments.
  • Using File Receiver Adapter, interface will download attachments to the directory.
  • Here only Integration Directory’s configurational objects are required.
  • As no message transformation is in scope, so Integration Repository objects are not required.

Pre-requisites:

  • SAP-PI should have SMTP mail server accessibility
  • SAP-PI should have access to SAP ECC application server’s directory

Steps to develop Interface in SAP-PI:

In SAP-PI’s Integration Directory, we need to follow below steps to develop “Configuration Scenario” of “Mail to File Inbound Asynchronous” interface:

  • Note: Object naming conventions is for example purpose, it can be as per client’s conventions

[I]. Business Components: Create two business components, one for sender and other for receiver

  1. Sender Business Components
    • This will work on behalf on sender-side while reading Mails
    • Name it as SENDER_BS_COMP
  2. Receiver Business Components
    • This will work on behalf on receiver-side while storing attachments to directory Mails
    • Name it as RECEIVER_BS_COMP

[II]. Communication Channels:

Case-1: One attachment per unread Mail : (Sender/Receiver Comm. Channel Cofig.)

Here, with help of below config, one attachment can be easily extracted from unread mail to sap’ app directory.

Sender Mail Adapter Communication Channel:

Select ‘Mail Adapter’ to read mails from mail server and configure below details in channel “SENDER_MAIL_CHNL”:

  • We use ‘Transport Protocol’ IMAP4 (Internet Message Access Protocol) to retrieve e-mails from a folder of an e-mail server.
  • It reads mail from INBOX folder and post read, mark its status to ‘read’.
  • Using ‘Message Protocol’ XIPAYLOAD, The content of the e-mail is put in the payload of the XI/PI message.
  • Enable ‘Keep Attachments’ functionality while reading mails.
  • Enable ‘Set Adapter-Specific Message Attributes’ functionality while reading mails, this is required to get header details of message. From header details we extract attachment names.
  • As we need to extract all attachments of one mail, this can be achieved with help of below Module Beans:
  • Module Bean ‘PayloadSwapBean
    • With help of this bean, we swap main payload with 1st attachment
    • And with help of File-Receiver channel we will download it to sap app directory
  • Module Bean ‘MultipartHeaderBean
    • With help of this bean, we add the following values in dynamic configuration:
    • Attributes of other payloads that are appended to the XI message as an additional attachment

Receiver File Adapter Communication Channel:

Here, we use ‘File Adapter’ to download attachment to folder and configure below details in channel “RECEIVER_FILE_CHNL”:

  • 1st attachment is already ready to get downloaded, which is swapped with main-payload
  • Using ‘DynamicConfigurationBean’, get 1st attachment’s original name
  • Please note: Here, with this config we can not store multiple attachments from one mail to folder
  • Here ‘File Name Scheme’ is referring to variable which is defined in ‘Variable Substitution’
  • Define a variable ‘fname’ using Variable Substitution, which stores message interface name.
  • Use Module Bean ‘DynamicConfigurationBean’, to get 1st attachment’s original name using logic “Mail  Part[1].Content-Description” and set it to message interface name
  • Test Screens:
  • Unread mail in Mail-Inbox with one attachment
  • Mail-Content
  • Post Mail read by PI-Channel (Mail-Sender-Adapter), below is the channel log
  • Sxmb_Moni log:
  • And post attachment extraction by interface, file present in sap app directory

 

 

Case-2: Multiple attachment per unread Mail : (Sender/Receiver Channel Cofig.)

Here, we use a custom java adapter module at File-Receiver-Channel side.

  • For this case, we create a custom java adapter module, which will have below functionalities:
    • Read all attachments with their original names
    • and store them to sap directory
    • This module will require one user input as ‘SapDirPath’ which is sap directory path location, where attachments will be saved
    • This module will be used as Module parameters in ‘Receiver File Adapter communication Channel’
  • To create this custom java adapter module, please follow link as :
  • Sender/Receiver channel configurations are as below:

Sender Mail Adapter Communication Channel:

 

Receiver File Adapter Communication Channel:

  • Here, using File Receiver, one Temp file (Test.dat) will be generated in directory, which will keep on over-writing every time. This file is of no business use, it is used only to complete channel config.
  • Now one custom adapter module will be used, which will have below functionalities:
    • Read all incoming attachments from inbound message
    • Store it to folder path with original attachment names
    • This module requires one input which is sap directory path location ‘SapDirPath’
  • Below Module configurations required in File-Receiver-Channel for custom adapter module access, that require input as FolderPath
  • And below is the test screen which depicts how multiple attachments from one unread mail gets extracted and store to sap directory
  • For Testing example, below case considered:
  • Incoming Mail to (mail-id), which need to be read by interface:
  • Below is PI’s SXMB_MONI log, in which Mail adapter has forwarded all attachments to receiver channel side
  • Below is log of File-Receiver-Channel, in which Custom adapter module’s log can be seen
  • and at last, screen of sap directory where files are been stored by custom module

 

[III]. Receiver Determination

  • receiver determinationis required to specify the receiver or receivers of the message, as well as conditions for the forwarding of the message to the receiver or receivers
  • Here we create it with below parameters:
Sender
Communication Component SENDER_BS_COMP
Interface INT_MailToFile
Namespace NM_MailToFile
Receiver
Communication Component  *
Configured Receiver RECEIVER_BS_COMP

[IV]. Interface Determination

  • An interface determination is required to specify the inbound interface of a specified receiver that a message is to be sent to. We can also define mappings here, if required.
  • Here we create it with below parameters:
Sender
Communication Component SENDER_BS_COMP
Interface INT_MailToFile
Namespace NM_MailToFile
Receiver
Communication Component RECEIVER_BS_COMP
Receiver Interfaces
Name INT_MailToFile
Namespace NM_MailToFile

[V]. Sender Agreement

Sender
Communication Component SENDER_BS_COMP
Interface INT_MailToFile
Namespace NM_MailToFile
Receiver
Communication Component
Sender Communication Channel SENDER_MAIL_CHNL

[VI]. Receiver Agreement

Sender
Communication Component SENDER_BS_COMP
Interface INT_MailToFile
Namespace NM_MailToFile
Receiver
Communication Component
Receiver Communication Channel RECEIVER_FILE_CHNL

 

To report this post you need to login first.

32 Comments

You must be Logged on to comment or reply to a post.

  1. Evgeniy Kolmakov

    Hi Dilip!

    Wouldn’t you please provide more detailed explanation of how multiple attachements within one message are processed. I guess it’s not clear enough. For now I could see the logic to send the first attachment only. Or did I miss anything?

    Regards, Evgeniy.

    (1) 
    1. Dilip Kumar KrishnaDev Pandey Post author

      Dear Evgeniy Kolmakov

      With help of above Interface,

      • Mails having multiple attachments can be read
      • and all attachments (like pdf, excel, file) of a mail from Mail-Inbox can be downloaded to folders
      • Post read, each mail will have status ‘UnRead’

      About, how multiple attachments get downloaded to folders, below are the details:

      At Sender side:

      • Module parameter “PayloadSwapBean“, swaps 1st attachments with main-payload.
      • “MultipartHeaderBean” adds the following values in dynamic configuration:
        • Attributes of other payloads that are appended to the XI message as an additional attachment.

      At Receiver Side:

      •  With help of “DynamicConfigurationBean” and “Variable Substitution” interface is able to download multiple attachments in to the directory

       

      I hope, above clarifies things.

       

      Thanks & Regards,

      Dilip.

      (0) 
      1. Evgeniy Kolmakov

        Hi Dilip!

        I feel a little bit confused. Does the file adapter at receiver’s side handle attachments? How are attachments saved?

        And if I understand the logic right, mail body is going to be saved too?

        Regards, Evgeniy.

        (0) 
        1. Dilip Kumar KrishnaDev Pandey Post author

          Dear Evgeniy Kolmakov

          Receiver File adapter will downloads attachments to folder directory.

          Mail body is not going to be saved, because we are replacing mail body with 1st attachment,

          and rest attachments will be handled using “DynamicConfig’ of channel.

          I have updated the blog for more clarifications, hope that will be enough for understanding the scenario working.

          Thanks & Regards,

          Dilip.

          (0) 
  2. Evgeniy Kolmakov

    Hi Dilip!

    1. Receiver file adapter doesn’t support working with attachments.
    2. When you use PayloadSwapBean, payloads are swapped – attachment is moved to main payload and the main payload, if any, moved to attachment (as module name even says).
    3. DynamicConfiguration attributes and Variable Substitution are intended to be used with main payload, not with attachments.

    So let me ask: have you ever tried to implement the scenario you describe in your blog?

    Regards, Evgeniy.

     

    (0) 
    1. Dilip Kumar KrishnaDev Pandey Post author

      Dear Evgeniy Kolmakov

      This is a working scenario, can download multiple attachments of a mail to directory.

      • Mail Adapter Module parameters
      • File Adapter Module Parameters
      • And SXMB_Moni log screen

      As per above log screen, when Mail adapter reads a mail, it forwards all its attribute to receiver side.

      Now using ‘DynamicConfig‘ and ‘variable substitution’ parameters, interface can download attachments to folders.

       

      Thanks & Regards,

      Dilip.

      (0) 
        1. Dilip Kumar KrishnaDev Pandey Post author

          Dear Evgeniy Kolmakov

          At receiver side, in mapped folder, we get all attachments with their original naming conventions and file extensions (pdf, excel, txt…etc.)

          And thank you for your time and detailed observations, that made me understand, how one blog should be more informative for clear picture of the Idea.

           

          Thanks & Regards,

          Dilip.

          (0) 
        2. Manoj K

          Agree with Eve , reading multiple attachment from sender mail was never an issue . But the main concern was to drop all the attachments via one single message. Additional in your File channel you are reading Attachment name from Part[1]Content-Description  which will always have the first attachment name only and channel will always drop only the first attachment as you have swapped with first attachment only  .Also i believe you have variable substitution also as you needs to assign the message.interface for filename attribute of file channel.

          I am really not a blogger but my suggestion is to always put a screenshot of your config as picture talks more than 1000 words.

          Br,

          Manoj

          (1) 
              1. Dilip Kumar KrishnaDev Pandey Post author

                Dear Eve/Manoj,

                You both are right, about below things:

                • File Receiver adapter can’t handle multiple attachments
                • Part[1]Content-Description  which will always have the first attachment name only and channel will always drop only the first attachment as you have swapped with first attachment only

                About above blog:

                • It reads mail with multiple attachments, forwards all attachments with main-payload to receiver side, and stores only 1st attachment in to the directory using configured parameters in Receiver-File-Adapter-channel.
                • Multiple attachment is been downloaded with help of Receiver-SFTP-Adapter-Channel using same Module config, but few corrections still required, I am working on it.

                 

                I will re-update blog with new details shortly.

                Thanks & Regards,

                Dilip.

                (0) 
                1. Manoj K

                  Yes Dilip you are right with SFTP you can handle it as there is option of “Store Attachment” along with additional Parameter retain.attachment name . But in this case you need to drop only all the attachments so you need to find a way to suppress the main payload.

                   

                  (1) 
                2. Former Member

                  I never tried, but if we want to store the multiple attachments with main payload, we can add all main payload and attachments in zip file. send that zip file as main payload and create that zip file as output file in the folder.

                  later unzip using either module or command line.

                   

                   

                  (0) 
  3. Ahmet Kücük

    Hi,

    I’ve also tried to implement this with your description, but get always the error:

    write property message.interface from key (http://sap.com/xi/XI/System/Mail)Part[1].Content-Description with value null; “

    Do you know the reason why the message doesn’t create the tag “Content-description?”

    (0) 
        1. Dilip Kumar KrishnaDeo Pandey Post author

          Hi Ahmet,

          Your config too seems to be fine, but I am not clear what causing issue at your side.

          For your better insight, I have updated  the blog with test screen too, please go through once again, I hope you may get something.

           

          Thanks & Regards,

          Dilip

          (0) 
  4. Ahmet Kücük

    Hi,

     

    here my logs:

     

     

    And here are message informations listed:

     

    Here is my mail Test:

    As you can see here, the part “description isn’t listed. But the clu is. When I download the file and send this file from my mail account to the folder, than it will be correctly picked up and all informations comes through. I’ve checked also the differences. The origin message is send  “text/plain” content type and charset in  utf-8. My mail was send with “text/html charset in ISO-8859-1

    (0) 
    1. Evgeniy Kolmakov

      Hi Ahmet!

      Content-Description headers are optional and are often used to add descriptive text to non-textual body parts.

      I guess that you should check both Content-Disposition and Content-Description headers to get file name.

      Regards, Evgeniy.

      (0) 
  5. Ahmet Kücük

    Hi Evgeniy,

     

    but both are empty in case of origin mail procession.

    Or the name isn’t correctly set in disposition. There you find only “attachment”, not the name of the file.

    Check my screens.

    Regards,

    Ahmet

     

    (0) 
    1. Dilip Kumar KrishnaDeo Pandey Post author

      Hi Ahmet,

      As in your message log too,

      • write property message.interface from key (http://sap.com/xi/XI/System/Mail)Part[1].Content-Description with value null;
      • so in this case you will get filename = Receiver ServiceName only

      So case may be, either mail is not having any attachment or either Mail-Adapter is not picking up mail attachment or either swapping is not taking place properly.

      Please re-verify your Sender Mail config, and you can cross check with below my side logs:

       

      Thanks & Regards

      Dilip

       

       

       

      (0) 
  6. Ahmet Kücük

    Hi Dilip,

    There is only one difference between my communication variant and yours.

     

    I have a FTP Adapter on receiver side and you’re using nfs?

    Is this the problem? can the current FTP adapter not proceed all send message information’s?

     

    Regards,

    Ahmet

    (0) 
  7. Ahmet Kücük

    I’ve also tried your second example regarding Custom/MailtoFile

    and there I get the error message below:

    In this case I#ve also used the FTP-Adapter

    (0) 
    1. Dilip Kumar KrishnaDeo Pandey Post author

      Hi Ahmet,

      If you check log, JAM is getting a “.csv” file, but while dropping it to the given directory path it raises exception.

      Check if PI have access to directory path or if such directory exists.

      And please note, that JAM example is properly working with File-NFS, but not tested with FTP

       

      Regards,

      Dilip

      (1) 
      1. Ahmet Kücük

        Hi,

        yes you’re right that’s the reason for JAM in my case. I use FTP-Adapter on every communication lines as I’ve many scenarios.

        What about option 1 and FTP? Could you check this?

         

        Regards,

        Ahmet

        (0) 
  8. Ahmet Kücük

    Hey Dilip,

    option 2 worked fine and I could import the file in NFS mode correct name in local folder!

    But, I’ve seen it generates minimum two file. One of these is the dummy file, which is named in “Process” menu. In you example you had named it “test.dat”.

    Thanks alot for your help!

     

    Regards,

    Ahmet

    (1) 
    1. Dilip Kumar KrishnaDeo Pandey Post author

      Hey Ahmet,

      Nice to hear that your issue gets resolved,

      but in option 2, there is no need of var substitution, becasue all multiple attachments gets strored in sap’s directory using JavaAdapterModule (JAM) functionality itself.

      JAM requires dirPath and for..loop runs for each file to store them in this path

       

      Thanks & Regards,

      Dilip

      (1) 
      1. Ahmet Kücük

        Yes, your’re right that was my temporarily fault. Therefore I’ve changed the message. 🙂

        But the second file will be generated as I wrote.

         

        (0) 
        1. Dilip Kumar KrishnaDeo Pandey Post author

          Dear Ahmet,

          Just for more clarity, please find following details w.r.t. “JavaAdapterModule (JAM) example for multiple Mail attachment download” :

          • About file ‘test.dat’
            • File Receiver channel will always generate this file with overwriting feature as per shown channel config, this is a dummy file (is of no use as per business) but required to complete the scenario
            • Here, please note, we are not using fileName and filePath input parameter references of File-Receiver-Adapter while saving multiple mail attachments.
          • About ‘JAM’
            • Applied on File-Receiver-Adapter channel has separate input parameter ‘SapDirPath’ where multiple mail attachments will get downloaded.
            • In given example, mail has 4 attachments, which get downloaded in given path
            • And if we look inside JAM code, below screen section code downloads each attachment
            • JAM Link ref:

           

           

          Thanks & Regards,

          Dilip,

          (0) 

Leave a Reply