Java映射-带有xml附件和正文的电子邮件

2020-09-26 23:41发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


专家们。

我有一种情况,我需要在邮件附件中发送NFE XML,并在邮件正文中发送文本。 标准解决方案使用消息类型,该消息类型同时具有用于接收和发送消息的NFE XML字段,因此有必要使用结构XI MAIL:SAP Note 748024创建JAVA MAPPING。

遵循使用的JAVA MAPPING:

 import java.io.BufferedReader;
 导入java.io.ByteArrayInputStream;
 导入java.io.IOException;
 导入java.io.InputStream;
 导入java.io.InputStreamReader;
 导入java.io.OutputStream;
 导入java.util.Map;
 导入javax.xml.parsers.DocumentBuilder;
 导入javax.xml.parsers.DocumentBuilderFactory;
 导入javax.xml.parsers.ParserConfigurationException;
 导入javax.xml.transform.Transformer;
 导入javax.xml.transform.TransformerConfigurationException;
 导入javax.xml.transform.TransformerException;
 导入javax.xml.transform.TransformerFactory;
 导入javax.xml.transform.dom.DOMSource;
 导入javax.xml.transform.stream.StreamResult;
 导入org.w3c.dom.Document;
 导入org.w3c.dom.Element;
 导入org.w3c.dom.Node;
 导入org.w3c.dom.Text;
 导入org.xml.sax.SAXException;
 导入com.sap.aii.mapping.api.StreamTransformation;
 导入com.sap.aii.mapping.api.StreamTransformationException;
 导入com.sap.aii.mapping.lookup.Channel;
 导入com.sap.aii.mapping.lookup.LookupService;
 导入com.sap.aii.mapping.lookup.RfcAccessor;
 导入com.sap.aii.mapping.lookup.XmlPayload;
 公共类XmlNFe_To_Mail实现StreamTransformation {
     私有字符串prefixoSubject = new String();
     私人String emailFrom = new String();
     私有字符串prefixoDocumento = new String();
     私人字符串frase = new String();
     private String gap =" \ n \ r";
     私有最终字符串NFe =" NFE";
     公共字符串getGap(){
         回报差距
     }
     public void setGap(String gap){
         this.gap =差距;
     }
     公共字符串getFrase(){
         反击
     }
     public void setFrase(String frase){
         this.frase = frase;
     }
    //INI --------------------------------------------------------------  --------------
     静态字符串BSystem =" SAP_ERP_QAS_500";
     静态字符串CChannel =" WAS_RFC_RCV";
     公共字符串getBSystem(){
         返回BSystem;
     }
     公共字符串getPrefixoSubject(){
         返回prefixoSubject;
     }
     公共无效setPrefixoSubject(String prefixoSubject){
         this.prefixoSubject = prefixoSubject;
     }
     公共字符串getEmailFrom(){
         返回emailFrom;
     }
     公共无效setEmailFrom(String emailFrom){
         this.emailFrom = emailFrom;
     }
     公共字符串getPrefixoDocumento(){
         返回prefixoDocumento;
     }
     public void setPrefixoDocumento(String prefixoDocumento){
         this.prefixoDocumento = prefixoDocumento;
     }
     公共字符串getCChannel(){
         返回CChannel;
     }
     私人void configParamEmail(){
         setEmailFrom(" fiscal@netshoes.com");
         setPrefixoDocumento(NFe);
         setPrefixoSubject(NFe);
     }
     公共无效执行(InputStream in,OutputStream out)
             引发StreamTransformationException {
         尝试{
             configParamEmail();
            //转换mensagem em entrada em字符串---- INICIO
             BufferedReader inpxml = new BufferedReader(new InputStreamReader(in));
             StringBuffer buffer =新的StringBuffer();
             字符串行="";
             while((line = inpxml.readLine())!= null){
                 buffer.append(line);
             }
             字符串inptxml = buffer.toString();
            //Obtendo dados para o envio de电子邮件
             字符串idNFe ="";
             字符串numeroNF ="";
             idNFe = inptxml.substring(inptxml.indexOf(" ")+ 7,inptxml.indexOf(" ")));
             numeroNF = idNFe.substring(25,34);
             如果(inptxml.indexOf(" infEvento")> 0){
                 this.setPrefixoDocumento(this.getPrefixoDocumento()。replaceAll(" NFE"," CCE")));
                 this.setPrefixoSubject(this.getPrefixoSubject()。replaceAll(" NFE"," CCE")));
             }
             如果(inptxml.indexOf(" infCanc")> 0){
                 this.setPrefixoDocumento(this.getPrefixoDocumento()。replaceAll(" NFE"," CancNFe"));
                 this.setPrefixoSubject(this.getPrefixoSubject()。replaceAll(" NFE"," NFE CANCELADA"));
             }
            //--------------------------------- RFC LOOKUP -------------------------  ----------------
             频道chn = null;
             RfcAccessor rfc = null;
             字符串email ="";
             chn = LookupService.getChannel(this.getBSystem(),this.getCChannel());
             rfc = LookupService.getRfcAccessor(chn);
             字符串要求="  "
             + idNFe
             +"  ";
             InputStream inputRFC =新的ByteArrayInputStream(req.getBytes(" UTF-8"));
             XmlPayload rfcPayload = LookupService.getXmlPayload(inputRFC);
             XmlPayload结果= rfc.call(rfcPayload);
             InputStream resp = result.getContent();
             DocumentBuilder builder = DocumentBuilderFactory.newInstance()。newDocumentBuilder();
             文档doc = builder.parse(resp);
             节点node =(Node)doc.getElementsByTagName(" EMAIL_CLI")。item(0);
             如果(node.hasChildNodes()&&!node.getFirstChild()。getNodeValue()。equals("")){
                 电子邮件= node.getFirstChild()。getNodeValue();
             }
            //monta XML de saida XiMail
             DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
             DocumentBuilder db = dbf.newDocumentBuilder();
             TransformerFactory tf = TransformerFactory.newInstance();
             变压器transform = tf.newTransformer();
            //Cria escopo做XML
             文档docout = db.newDocument();
             元素根= docout.createElement(" ns1:Mail");
             root.setAttribute(" xmlns:ns1"," http://sap.com/xi/XI/Mail/30");
             docout.appendChild(root);
            //Cria elemento主题
             元素subject = docout.createElement(" Subject");
             root.appendChild(subject);
             文字subjectText = docout.createTextNode(getPrefixoSubject()+ numeroNF); //Cria valor campo
             subject.appendChild(subjectText);
            //Cria elemento来自
             元素来自= docout.createElement(" From");
             root.appendChild(from);
             文本fromText = docout.createTextNode(getEmailFrom()); //Cria valor campo
             from.appendChild(fromText);
             如果(email.length()> 0){
                 电子邮件+ =";";
             }其他{
                 电子邮件=" fiscal@netshoes.com";
             }
            //Cria elemento至
             元素为docout.createElement(" To");
             root.appendChild(to);
             文本toText = docout.createTextNode(email); //Cria valor campo
             to.appendChild(toText);
            //Cria elemento内容类型
             元素contentType = docout.createElement(" Content_Type");
             root.appendChild(contentType);
             文本contentTypeText = docout.createTextNode(" multipart/mixed; boundary =-AaZz"); //Cria valor campo
             contentType.appendChild(contentTypeText);
            //Criando o corpo de texto发送电子邮件至anexo
             元素内容= docout.createElement(" Content");
             root.appendChild(content);
             字符串bodyText ="";
             StringBuilder finalBodyText = new StringBuilder();
             文字内容文字;
             节点=(节点)doc.getElementsByTagName(" BODY_TEXT")。item(0);
             如果(node.hasChildNodes()&&!node.getFirstChild()。getNodeValue()。equals("")){
             bodyText = node.getFirstChild()。getNodeValue();
                 finalBodyText.append(" ---- AaZz \ r \ n Content-Type:文本/纯文本;字符集= UTF-8 \ r \ n")
                              .append(" Content-Disposition:inline \ r \ n \ r \ n")
                              .append(bodyText)
                              .append(" \ r \ n ---- AaZz \ r \ nContent-Disposition:附件; filename = NFE:")
                              .append(idNFe)
                              .append("。xml")
                              .append(" \ r \ n \ r \ n")
                              .append(inptxml.replaceAll(" \ n",""))
                              .append(" \ r \ n");
             }
             contentText =(docout.createTextNode(finalBodyText.toString()));
             content.appendChild(contentText);
            //Fecha o XML
             DOMSource domS =新的DOMSource(docout);
             transform.transform((domS),新的StreamResult(out));
         } catch(IOException e){
            //TODO自动生成的catch块
             e.printStackTrace();
         } catch(ParserConfigurationException e){
            //TODO自动生成的catch块
             e.printStackTrace();
         } catch(TransformerConfigurationException e){
            //TODO自动生成的catch块
             e.printStackTrace();
         } catch(TransformerException e){
            //TODO自动生成的catch块
             e.printStackTrace();
         } catch(SAXException e){
            //TODO自动生成的catch块
             e.printStackTrace();
         }
     }
     public void setParameter(Map arg0){
        //TODO自动生成的方法存根
     }
 } 

邮件随正文文本和附件XML一起到达,但附件XML断断续续,好像它已折断,并且在读取XML时出现错误

我希望您能解决这个问题。

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


专家们。

我有一种情况,我需要在邮件附件中发送NFE XML,并在邮件正文中发送文本。 标准解决方案使用消息类型,该消息类型同时具有用于接收和发送消息的NFE XML字段,因此有必要使用结构XI MAIL:SAP Note 748024创建JAVA MAPPING。

遵循使用的JAVA MAPPING:

 import java.io.BufferedReader;
 导入java.io.ByteArrayInputStream;
 导入java.io.IOException;
 导入java.io.InputStream;
 导入java.io.InputStreamReader;
 导入java.io.OutputStream;
 导入java.util.Map;
 导入javax.xml.parsers.DocumentBuilder;
 导入javax.xml.parsers.DocumentBuilderFactory;
 导入javax.xml.parsers.ParserConfigurationException;
 导入javax.xml.transform.Transformer;
 导入javax.xml.transform.TransformerConfigurationException;
 导入javax.xml.transform.TransformerException;
 导入javax.xml.transform.TransformerFactory;
 导入javax.xml.transform.dom.DOMSource;
 导入javax.xml.transform.stream.StreamResult;
 导入org.w3c.dom.Document;
 导入org.w3c.dom.Element;
 导入org.w3c.dom.Node;
 导入org.w3c.dom.Text;
 导入org.xml.sax.SAXException;
 导入com.sap.aii.mapping.api.StreamTransformation;
 导入com.sap.aii.mapping.api.StreamTransformationException;
 导入com.sap.aii.mapping.lookup.Channel;
 导入com.sap.aii.mapping.lookup.LookupService;
 导入com.sap.aii.mapping.lookup.RfcAccessor;
 导入com.sap.aii.mapping.lookup.XmlPayload;
 公共类XmlNFe_To_Mail实现StreamTransformation {
     私有字符串prefixoSubject = new String();
     私人String emailFrom = new String();
     私有字符串prefixoDocumento = new String();
     私人字符串frase = new String();
     private String gap =" \ n \ r";
     私有最终字符串NFe =" NFE";
     公共字符串getGap(){
         回报差距
     }
     public void setGap(String gap){
         this.gap =差距;
     }
     公共字符串getFrase(){
         反击
     }
     public void setFrase(String frase){
         this.frase = frase;
     }
    //INI --------------------------------------------------------------  --------------
     静态字符串BSystem =" SAP_ERP_QAS_500";
     静态字符串CChannel =" WAS_RFC_RCV";
     公共字符串getBSystem(){
         返回BSystem;
     }
     公共字符串getPrefixoSubject(){
         返回prefixoSubject;
     }
     公共无效setPrefixoSubject(String prefixoSubject){
         this.prefixoSubject = prefixoSubject;
     }
     公共字符串getEmailFrom(){
         返回emailFrom;
     }
     公共无效setEmailFrom(String emailFrom){
         this.emailFrom = emailFrom;
     }
     公共字符串getPrefixoDocumento(){
         返回prefixoDocumento;
     }
     public void setPrefixoDocumento(String prefixoDocumento){
         this.prefixoDocumento = prefixoDocumento;
     }
     公共字符串getCChannel(){
         返回CChannel;
     }
     私人void configParamEmail(){
         setEmailFrom(" fiscal@netshoes.com");
         setPrefixoDocumento(NFe);
         setPrefixoSubject(NFe);
     }
     公共无效执行(InputStream in,OutputStream out)
             引发StreamTransformationException {
         尝试{
             configParamEmail();
            //转换mensagem em entrada em字符串---- INICIO
             BufferedReader inpxml = new BufferedReader(new InputStreamReader(in));
             StringBuffer buffer =新的StringBuffer();
             字符串行="";
             while((line = inpxml.readLine())!= null){
                 buffer.append(line);
             }
             字符串inptxml = buffer.toString();
            //Obtendo dados para o envio de电子邮件
             字符串idNFe ="";
             字符串numeroNF ="";
             idNFe = inptxml.substring(inptxml.indexOf(" ")+ 7,inptxml.indexOf(" ")));
             numeroNF = idNFe.substring(25,34);
             如果(inptxml.indexOf(" infEvento")> 0){
                 this.setPrefixoDocumento(this.getPrefixoDocumento()。replaceAll(" NFE"," CCE")));
                 this.setPrefixoSubject(this.getPrefixoSubject()。replaceAll(" NFE"," CCE")));
             }
             如果(inptxml.indexOf(" infCanc")> 0){
                 this.setPrefixoDocumento(this.getPrefixoDocumento()。replaceAll(" NFE"," CancNFe"));
                 this.setPrefixoSubject(this.getPrefixoSubject()。replaceAll(" NFE"," NFE CANCELADA"));
             }
            //--------------------------------- RFC LOOKUP -------------------------  ----------------
             频道chn = null;
             RfcAccessor rfc = null;
             字符串email ="";
             chn = LookupService.getChannel(this.getBSystem(),this.getCChannel());
             rfc = LookupService.getRfcAccessor(chn);
             字符串要求="  "
             + idNFe
             +"  ";
             InputStream inputRFC =新的ByteArrayInputStream(req.getBytes(" UTF-8"));
             XmlPayload rfcPayload = LookupService.getXmlPayload(inputRFC);
             XmlPayload结果= rfc.call(rfcPayload);
             InputStream resp = result.getContent();
             DocumentBuilder builder = DocumentBuilderFactory.newInstance()。newDocumentBuilder();
             文档doc = builder.parse(resp);
             节点node =(Node)doc.getElementsByTagName(" EMAIL_CLI")。item(0);
             如果(node.hasChildNodes()&&!node.getFirstChild()。getNodeValue()。equals("")){
                 电子邮件= node.getFirstChild()。getNodeValue();
             }
            //monta XML de saida XiMail
             DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
             DocumentBuilder db = dbf.newDocumentBuilder();
             TransformerFactory tf = TransformerFactory.newInstance();
             变压器transform = tf.newTransformer();
            //Cria escopo做XML
             文档docout = db.newDocument();
             元素根= docout.createElement(" ns1:Mail");
             root.setAttribute(" xmlns:ns1"," http://sap.com/xi/XI/Mail/30");
             docout.appendChild(root);
            //Cria elemento主题
             元素subject = docout.createElement(" Subject");
             root.appendChild(subject);
             文字subjectText = docout.createTextNode(getPrefixoSubject()+ numeroNF); //Cria valor campo
             subject.appendChild(subjectText);
            //Cria elemento来自
             元素来自= docout.createElement(" From");
             root.appendChild(from);
             文本fromText = docout.createTextNode(getEmailFrom()); //Cria valor campo
             from.appendChild(fromText);
             如果(email.length()> 0){
                 电子邮件+ =";";
             }其他{
                 电子邮件=" fiscal@netshoes.com";
             }
            //Cria elemento至
             元素为docout.createElement(" To");
             root.appendChild(to);
             文本toText = docout.createTextNode(email); //Cria valor campo
             to.appendChild(toText);
            //Cria elemento内容类型
             元素contentType = docout.createElement(" Content_Type");
             root.appendChild(contentType);
             文本contentTypeText = docout.createTextNode(" multipart/mixed; boundary =-AaZz"); //Cria valor campo
             contentType.appendChild(contentTypeText);
            //Criando o corpo de texto发送电子邮件至anexo
             元素内容= docout.createElement(" Content");
             root.appendChild(content);
             字符串bodyText ="";
             StringBuilder finalBodyText = new StringBuilder();
             文字内容文字;
             节点=(节点)doc.getElementsByTagName(" BODY_TEXT")。item(0);
             如果(node.hasChildNodes()&&!node.getFirstChild()。getNodeValue()。equals("")){
             bodyText = node.getFirstChild()。getNodeValue();
                 finalBodyText.append(" ---- AaZz \ r \ n Content-Type:文本/纯文本;字符集= UTF-8 \ r \ n")
                              .append(" Content-Disposition:inline \ r \ n \ r \ n")
                              .append(bodyText)
                              .append(" \ r \ n ---- AaZz \ r \ nContent-Disposition:附件; filename = NFE:")
                              .append(idNFe)
                              .append("。xml")
                              .append(" \ r \ n \ r \ n")
                              .append(inptxml.replaceAll(" \ n",""))
                              .append(" \ r \ n");
             }
             contentText =(docout.createTextNode(finalBodyText.toString()));
             content.appendChild(contentText);
            //Fecha o XML
             DOMSource domS =新的DOMSource(docout);
             transform.transform((domS),新的StreamResult(out));
         } catch(IOException e){
            //TODO自动生成的catch块
             e.printStackTrace();
         } catch(ParserConfigurationException e){
            //TODO自动生成的catch块
             e.printStackTrace();
         } catch(TransformerConfigurationException e){
            //TODO自动生成的catch块
             e.printStackTrace();
         } catch(TransformerException e){
            //TODO自动生成的catch块
             e.printStackTrace();
         } catch(SAXException e){
            //TODO自动生成的catch块
             e.printStackTrace();
         }
     }
     public void setParameter(Map arg0){
        //TODO自动生成的方法存根
     }
 } 

邮件随正文文本和附件XML一起到达,但附件XML断断续续,好像它已折断,并且在读取XML时出现错误

我希望您能解决这个问题。

付费偷看设置
发送
1条回答
compass1988
1楼-- · 2020-09-27 00:04

您使用的是String类型的缓冲读取器。 但是,XI有效载荷是二进制的。

我建议仅用三行读取XI有效负载:

字节输入[] =新字节[in.available()];

in.read(输入);

String inptxml = new String(input," UTF-8");

一周热门 更多>