点击此处---> 群内免费提供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); 字符串要求=""; 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自动生成的方法存根 } } " + idNFe +"
邮件随正文文本和附件XML一起到达,但附件XML断断续续,好像它已折断,并且在读取XML时出现错误
我希望您能解决这个问题。
您使用的是String类型的缓冲读取器。 但是,XI有效载荷是二进制的。
我建议仅用三行读取XI有效负载:
字节输入[] =新字节[in.available()];
in.read(输入);
String inptxml = new String(input," UTF-8");
一周热门 更多>