cancel
Showing results for 
Search instead for 
Did you mean: 

Texto no corpo do E-mail

Former Member
0 Kudos

Olá Pessoal,

Consegui executar o procedimento do Henrique Pinto para enviar o XML por e-mail para os clientes, e criei um adapter module para alterar o nome do anexo para a chave de acesso. Entretanto, gostaria de inserir no corpo do e-mail um texto informativo.

Pesquisei em alguns fóruns aqui no SDN a melhor maneira de fazer, porém não encontrei solução.

Ao criar a solução baseada na solução do link: Wiki a seguinte excpetion ocorre:

Message processing failed. Cause: com.sap.engine.services.ejb.exceptions.BaseTransactionRolledbackLocalException: Exception thrown in method process. The transaction is marked for rollback.

Tentei realizar conforme o Marcio resolveu no Link, porém não foi possível, pois gerava StringIndexOutOfBoundsException, num lugar que não era um código que eu construí.

Segue o erro:

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> 
- <!--  Request Message Mapping 
  --> 
- <SAP:Error xmlns:SAP="http://sap.com/xi/XI/Message/30" xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/" SOAP:mustUnderstand="">
  <SAP:Category>Application</SAP:Category> 
  <SAP:Code area="MAPPING">EXCEPTION_DURING_EXECUTE</SAP:Code> 
  <SAP:P1>sap/com/xi/nfe/map/NTB2B_NFeToB2BReceiverConverte~</SAP:P1> 
  <SAP:P2>java.lang.StringIndexOutOfBoundsException</SAP:P2> 
  <SAP:P3>String index out of range: -12</SAP:P3> 
  <SAP:P4></SAP:P4> 
  <SAP:AdditionalText></SAP:AdditionalText> 
  <SAP:ApplicationFaultMessage namespace=""></SAP:ApplicationFaultMessage> 
  <SAP:Stack>java.lang.StringIndexOutOfBoundsException thrown during application mapping sap/com/xi/nfe/map/NTB2B_NFeToB2BReceiverConverte~: String index out of range: -12</SAP:Stack> 
  <SAP:Retry>M</SAP:Retry> 
  </SAP:Error>

Assim, gerei o seguinte código no adapter Module que envia o e-mail com o XML em anexo, porém o texto do corpo do e-mail está indo como anexo também.

	public ModuleData process(ModuleContext moduleContext, ModuleData inputModuleData) throws ModuleException {
		try {
			String strCorpoEmail = "Teste do corpo do email";
			Message msg = (Message) inputModuleData.getPrincipalData();
			TextPayload txtPayload = msg.createTextPayload();
			txtPayload.setName("texto");
			txtPayload.setContent(strCorpoEmail.getBytes());
			txtPayload.setText(strCorpoEmail );
			Payload payload = msg.getDocument();
			byte[] b = payload.getContent();
			String strPayload = new String(b);
			int intIndex = strPayload.indexOf("Id="NFe");
			String strId = strPayload.substring((intIndex + 4), (intIndex + 51));
			strId = strId + ".xml";
			payload.setContentType("text/plain;charset = "UTF-8";" + "filename="" + strId + """);
			inputModuleData.setPrincipalData(msg);
		} catch (Exception e) {
			throw new ModuleException(e);
		}
		return inputModuleData;

Como fazer a variável

strCorpoEmail

ir no corpo do e-mail e não como anexo?

Obrigado,

Douglas Rodrigues de Figueiredo

Accepted Solutions (1)

Accepted Solutions (1)

henrique_pinto
Active Contributor
0 Kudos

Douglas,

aquele codigo que pus no wiki funcionava em alguma versao anterior de SP do netweaver e deixou de funcionar, creio que por alguma atualizacao.

2 coisas com que vc pode "brincar":

1) tentar marcar/desmarcar o flag "Keep Attachments" no communication channel;

2) tente usar o transport protocol "XIALL" em vez do "XIPAYLOAD"

3) worst case scenario, use esse método:

Em particular, se vc estiver no PI 7.1+, use o seguinte:

http://help.sap.com/javadocs/pi/SP3/xpi/com/sap/engine/interfaces/messaging/api/Message.html#setMain...

Abs,

Henrique.

Former Member
0 Kudos

Henrique,

eu desmarquei a opção de "Keep Attachment" e o XML passou a vir no corpo da mensagem.

Troquei de XIPayload para XIALL, toda a interface roda, porém o e-mail não chega ao destinatário.

Com relação a sua terceira opção, já havia tentado fazer, porém, a Exception java.lang.StringIndexOutOfBoundsException é lançada. O Engraçado desta exception é que não é no Java Mapping e sim no componente standard, conforme o xml da exception abaixo:

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> 
- <!--  Request Message Mapping 
  --> 
- <SAP:Error xmlns:SAP="http://sap.com/xi/XI/Message/30" xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/" SOAP:mustUnderstand="">
  <SAP:Category>Application</SAP:Category> 
  <SAP:Code area="MAPPING">EXCEPTION_DURING_EXECUTE</SAP:Code> 
  <SAP:P1>sap/com/xi/nfe/map/NTB2B_NFeToB2BReceiverConverte~</SAP:P1> 
  <SAP:P2>java.lang.StringIndexOutOfBoundsException</SAP:P2> 
  <SAP:P3>String index out of range: -12</SAP:P3> 
  <SAP:P4></SAP:P4> 
  <SAP:AdditionalText></SAP:AdditionalText> 
  <SAP:ApplicationFaultMessage namespace=""></SAP:ApplicationFaultMessage> 
  <SAP:Stack>java.lang.StringIndexOutOfBoundsException thrown during application mapping sap/com/xi/nfe/map/NTB2B_NFeToB2BReceiverConverte~: String index out of range: -12</SAP:Stack> 
  <SAP:Retry>M</SAP:Retry> 
  </SAP:Error>

Alguma outra sugestão?

Muito obrigado pela sua rápida resposta.

Douglas

Edited by: drfigueiredo on Jul 29, 2010 4:20 PM

henrique_pinto
Active Contributor
0 Kudos

Acredito que o caminho é pela 1a opcao, mas vc tem que "trocar" de lugar os attachments (note que ao final vc tem 2 attachments, o XML e o texto), para que o XML vah como anexo e o outro como corpo.

Pior hipotese, vc copia o content de um pra outro e vice-versa.

Abs,

Henrique.

Former Member
0 Kudos

Henrique,

Você conhece alguma maneira de fazer esta "troca" de content?? Vc tem algum exemplo de como fazer?

Experimentei fazer a cópia da seguinte maneira:

			
			Payload payTemp = payXml;
			payXml = txtPayload;
			txtPayload = payTemp;

Desta menira o está vindo o xml em anexo e no corpo do Email.

Lembrando que o Message protocol está XIALL.

henrique_pinto
Active Contributor
0 Kudos

Douglas,

eu tinha pensado num metodo mais bruto, rs.

Pelo q entendi, vc tinha conseguido fazer um payload ir no corpo e outro como anexo, mas invertido (i.e. XML no corpo e texto como anexo), certo?

Dai vc poderia tentar trocar o content dos payloads (usando os metodos getContent() e setContent()) pra trocar o conteudo de um pra outro, e depois trocar os nomes tb.

Abs,

Henrique.

Former Member
0 Kudos

Henrique,

Eu fiz o teste que você solicitou, porém uma correção que tenho que fazer, quando eu disse que conseguia colocar o XML no corpo do e-mail, estava falando do Envelope todo, tanto que o XML todo começa da seguinte maneira:

<SOAP:Envelope xmlns:SOAP='http://schemas.xmlsoap.org/soap/envelope/'><SOAP:Header><sap:Main xmlns:sap='http://sap.com/xi/XI/Message/30' versionMajor='3' versionMinor='0' SOAP:mustUnderstand='1' xmlns:wsu='http://www.docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd' wsu:Id='wsuid-main-92ABE13F5C59AB7FE10000000A1551F7'><sap:MessageClass>ApplicationMessage</sap:MessageClass><sap:ProcessingMode>asynchronous</sap:ProcessingMode><sap:MessageId>df9b380b-94c3-4af1-a251-001517d1330b</sap:MessageId><sap:TimeSent>2010-07-29T17:38:10Z</sap:TimeSent><sap:Sender><sap:Party agency='' scheme=''></sap:Party><sap:Service>Business_System_PID_GRC</sap:Service></sap:Sender><sap:Receiver><sap:Party agency='http://sap.com/xi/XI' scheme='XIParty'>Yara</sap:Party><sap:Service>SAP_SSL_NFE</sap:Service></sap:Receiver>

Retomei a esrattégia de montar o envelope no javamapping, alguma dica para fazer assim? Acima mostrei para o Marcio os problemas que vem me ocorrendo.

Obrigado,

Douglas

henrique_pinto
Active Contributor
0 Kudos

O fato de aparecer o envelope é por causa do XIALL.

Volte pro XIPAYLOAD, tire o flag de Keep Attachments e crie o novo payload.

Os 2 ficam como attachment ou 1 deles vai como texto?

Abs,

Henrique.

Former Member
0 Kudos

Olá Henrique, tudo bom??

Com o Keep Attachment flegado, foram criados dois anexos no email recebido, um XML e um TXT. Como "troquei" os contents, o xml está com o texto do corpo do e-mail e txt vem com o conteudo do XML da NFe.

Se desmarco o keep attachment, o texto que eu quero vem no corpo do e-mail, porém o XML não está anexado.

Estou passando o código que estou usando:

	String strCorpoEmail = "Teste do corpo do email";
			Message msg = (Message) inputModuleData.getPrincipalData();
			TextPayload payCorpoEmail = msg.createTextPayload();
			payCorpoEmail.setName("texto");
			payCorpoEmail.setContent(strCorpoEmail.getBytes());
			payCorpoEmail.setText(strCorpoEmail );
			Payload payXmlNfe = msg.getDocument();
			byte[] b = payXmlNfe.getContent();
			String strPayload = new String(b);
			int intIndex = strPayload.indexOf("Id="NFe");
			String strId = strPayload.substring((intIndex + 4), (intIndex + 51));
			strId = strId + ".xml";
			payXmlNfe.setContentType("text/plain;charset = "UTF-8";" + "filename="" + strId + """);
			
			//Setar payload para uma variável temporária.
			Payload payTemp = msg.createPayload();
			payTemp.setContent(payXmlNfe.getContent());
			
			//Jogar o conteúdo do payload do corpo do e-mail, no payload que vem na mensagem
			payXmlNfe.setContent(payCorpoEmail.getContent());
			
			//Jogar conteudo do temporário para o conteudo do corpo do email
			payCorpoEmail.setContent(payTemp.getContent());
			
			msg.addAttachment(payCorpoEmail);
			inputModuleData.setPrincipalData(msg);

desde já obrigado,

Douglas Rodrigues de Figueiredo

henrique_pinto
Active Contributor
0 Kudos

É complicado cara, pq o que aparentemente funcionava em SPs anteriores deixou de funcionar. É meio que tentativa e erro, até dar certo.

Uma outra variavel que vc pode usar para brincar é o PayloadSwapBean. Já tentou utilizar?

Use o keep attachments e tente fazer swap do txt com o main payload.

Outra coisa, pesquise tb no forum de XI, vai ter mais dicas por lá: .

Abs,

Henrique.

Former Member
0 Kudos

Henrique,

Nunca utilizei o PayloadSwapBean, o que ele deve fazer?

pensei em usar o msg.setProperty(String, String), porém não encontro uma lista de properties, gostaria de encontrar alguma tipo bodyText, ou algo semelhante.

Você sabe me dizer onde posso encontrar esta lista de properties? Via DynamicConfiguration, não consigo fazer alterar algo como Body? Onde há uma documentação de todos os DynamicConfiguration?

Desculpe o excesso de perguntas, mas ta dificil de evoluir nisso...

Grande abraço

Douglas

henrique_pinto
Active Contributor
0 Kudos

Essas properties nao sao documentadas msm. Acho que sao mais pra uso interno.

Mas lah na outra thread propous algo do tipo: "Content-Disposition", "inline".

Tente algo nessa linha.

Abs,

Henrique.

Former Member
0 Kudos

Henrique,

com o código

payCorpoEmail.setContentType("text/plain;inline") ;

também o anexo vai como TXT.

Vc tem algum exemplo de utilização do PayloadSwapBean?

Obrigado

Former Member
0 Kudos

Henrique,

Consegui resolver o meu problema de enviar o xml com o nome customizado e inserir um texto no corpo do e-mail.

Segue o código fonte:

		String strCorpoEmail = "Texto do corpo do email";
			Message msg = (Message) inputModuleData.getPrincipalData();
			Payload payCorpoEmail = msg.createPayload();
			payCorpoEmail.setName("texto");
			payCorpoEmail.setContent(strCorpoEmail.getBytes());
			payCorpoEmail.setContentType("multipart/mixed;") ;
			
			Payload payXmlNfe = msg.getDocument();
			byte[] b = payXmlNfe.getContent();
			String strPayload = new String(b);
			int intIndex = strPayload.indexOf("Id="NFe");
			String strId = strPayload.substring((intIndex + 4), (intIndex + 51));
			strId = strId + ".xml";
			payXmlNfe.setContentType("text/plain;charset = "UTF-8";" + "filename="" + strId + """);

			//Setar payload para uma variável temporária.
			//Payload payTemp = msg.createPayload();
			//payTemp.setContent(payXmlNfe.getContent());

			//Jogar o conteúdo do payload do corpo do e-mail, no payload que vem na mensagem
			//payXmlNfe.setContent(payCorpoEmail.getContent());

			//Jogar conteudo do temporário para o conteudo do corpo do email
			//payCorpoEmail.setContent(payTemp.getContent());

			msg.addAttachment(payCorpoEmail);
			inputModuleData.setPrincipalData(msg);
		} catch (Exception e) {
			throw new ModuleException(e);
		}

O segredo da solução esta nesta linha, que deixa escrever no corpo do e-mail:

payCorpoEmail.setContentType("multipart/mixed;") ;

Muito obrigado pela ajuda,

Douglas Rodrigues de Figueiredo

henrique_pinto
Active Contributor
0 Kudos

Muito bom Douglas!!!

Faz o seguinte, edita lá essa sugestao no wiki que eu tinha criado.

Abs,

Henrique.

Answers (3)

Answers (3)

Former Member
0 Kudos

Resolvido com o último código fonte.

henrique_pinto
Active Contributor
0 Kudos

Oi Douglas,

já que vc nao pôs o codigo no wiki, eu pus.

Abs,

Henrique.

Former Member
0 Kudos

Henrique,

Obrigado por atualizar o Wiki, eu tentei fazer isto na sexta-feira e não consegui fazer.

Mais uma vez obrigado pela ajuda.

henrique_pinto
Active Contributor
0 Kudos

Tranquilo,

por algum motivo estranho, nao tao conseguindo editar wikis q eu crio.

Outra coisa, esse metodo .setName() do payload tem no 7.0?

Abs,

Henrique.

Former Member
0 Kudos

O método tem sim na API 7.0. Eu estou rodando PI 7.0 SP13.

abs

henrique_pinto
Active Contributor
0 Kudos

Blz!

Former Member
0 Kudos

Precisei modificar o código fonte, visto que clients de e-mail diferente do Lotus Notes não estavam interpretando corretamente.

Segue este novo código que foi testado com Gmail e Notes.

	public ModuleData process(ModuleContext moduleContext, ModuleData inputModuleData) throws ModuleException {
		try {
			String strQuebraDeLinha = "

";
			String strCorpoEmail =  "Prezado Cliente," + strQuebraDeLinha + "Em anexo você está recebendo um arquivo contendo os dados da Nota Fiscal Eletrônica no formato exigido pela Receita Federal." + strQuebraDeLinha +
									"Nele pode-se consultar dados da NF-e para sua conferência." + strQuebraDeLinha +
									"Esse email é meramente informativo, caso não utilize, favor desconsiderar. Você continuará recebendo uma cópia da Nota Fiscal junto com o produto." + strQuebraDeLinha +
									"Em caso de dúvidas contate o Supervisor de Vendas da sua região." + strQuebraDeLinha + strQuebraDeLinha +
									"Yara Brasil Fertilizantes S/A " + strQuebraDeLinha; 
			Message msg = (Message) inputModuleData.getPrincipalData();
			XMLPayload payCorpoEmail = msg.createXMLPayload();
			
			payCorpoEmail.setContent(strCorpoEmail.getBytes());
			payCorpoEmail.setContentType("multipart/alternative;charset=ISO-8859-1");
			
			
			Payload payXmlNfe = msg.getDocument();
			byte[] b = payXmlNfe.getContent();
			String strPayload = new String(b);

			int intIndex = strPayload.indexOf("Id="NFe");
			String strId = strPayload.substring((intIndex + 4), (intIndex + 51));
			strId = strId + ".xml";
			payXmlNfe.setName(strId);
			msg.addAttachment(payXmlNfe);
			msg.setDocument(payCorpoEmail);
			
			
			inputModuleData.setPrincipalData(msg);
		} catch (Exception e) {
			throw new ModuleException(e);
		}
		return inputModuleData;
	}

Former Member
0 Kudos

Douglas, somente consegui fazer isso funcionar usando o Mail Package mesmo. Usei um java mapping para criar o email exatamente igual ao blog. Faça uma revisão das etapas que você desenvolveu, pode ser que algum parâmetro não foi preenchido, como o destinatário ou outra informação. Lembre-se que toda mensagem é montada na mão mesmo, não tem como usar a ferramenta gráfica nesse caso não. Lembre-se também de remover o módulo que você havia construído, utilize somente o módulo standart no canal receiver.

Former Member
0 Kudos

Marcio,

fiz exatamente o que o blog 6321 solicita, trocando apenas o endereço de e-mail e a seguinte exception é lançada:

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> 
- <!--  Request Message Mapping 
  --> 
- <SAP:Error xmlns:SAP="http://sap.com/xi/XI/Message/30" xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/" SOAP:mustUnderstand="">
  <SAP:Category>Application</SAP:Category> 
  <SAP:Code area="MAPPING">EXCEPTION_DURING_EXECUTE</SAP:Code> 
  <SAP:P1>com/sap/xi/tf/_MM_ENVIAR_XML_2_CUSTOMER_</SAP:P1> 
  <SAP:P2>com.sap.aii.utilxi.misc.api.BaseRuntimeException</SAP:P2> 
  <SAP:P3>RuntimeException in Message-Mapping transformatio~</SAP:P3> 
  <SAP:P4></SAP:P4> 
  <SAP:AdditionalText></SAP:AdditionalText> 
  <SAP:ApplicationFaultMessage namespace=""></SAP:ApplicationFaultMessage> 
  <SAP:Stack>com.sap.aii.utilxi.misc.api.BaseRuntimeException thrown during application mapping com/sap/xi/tf/_MM_ENVIAR_XML_2_CUSTOMER_: RuntimeException in Message-Mapping transformatio~</SAP:Stack> 
  <SAP:Retry>M</SAP:Retry> 
  </SAP:Error>

No trace do request message Mapping, segue um trecho do código onde gera a exception.

<Trace level="3" type="T">Search com/sap/xi/tf/_MM_ENVIAR_XML_2_CUSTOMER_.class (http://yara.com/PI70/Send_XML_2_Customer, -1) in swcv 741437f1-2c42-11df-a169-d6a00a650125.</Trace> 
  <Trace level="3" type="T">Loaded class com.sap.xi.tf._MM_ENVIAR_XML_2_CUSTOMER_</Trace> 
  <Trace level="2" type="T">Call method execute of the application Java mapping com.sap.xi.tf._MM_ENVIAR_XML_2_CUSTOMER_</Trace> 
  <Trace level="1" type="T">RuntimeException during appliction Java mapping com/sap/xi/tf/_MM_ENVIAR_XML_2_CUSTOMER_</Trace> 
  <Trace level="1" type="T">com.sap.aii.utilxi.misc.api.BaseRuntimeException: RuntimeException in Message-Mapping transformation: Cannot produce target element /ns0:procNFe/ns0:CNPJRec. Check xml instance is valid for source xsd and target-field mapping fulfills requirements of target xsd at com.sap.aii.mappingtool.tf3.AMappingProgram.start(AMappingProgram.java:406) at com.sap.aii.mappingtool.tf3.Transformer.start(Transformer.java:142) at com.sap.aii.mappingtool.tf3.AMappingProgram.execute(AMappingProgram.java:105) at com.sap.aii.ibrun.server.mapping.JavaMapping.executeStep(JavaMapping.java:64) at com.sap.aii.ibrun.server.mapping.Mapping.execute(Mapping.java:92) at

Uma pergunta, na interface determination, qual a ordem correta dos elementos. Agora está configurado da seguinte maneira:

Java Class - A classe que eu criei com o conteudo do blog

Messag Mapping - messagem mapping criado para buscar o e-mail pelo CNPJ/CPF

Java Class - Classe standar de mapemanto (NTB2B_NFeToB2BReceiverConverter)

Desde já agradeç