Thursday 17 August 2017

Javamail Content-Transfer-Encoding Binary Options


Manipulação de dados binários com conteúdo do Axis2 (MTOM / SwA) Introdução Apesar da flexibilidade, interoperabilidade e aceitação global do XML, há momentos em que serializar dados em XML não faz sentido. Os usuários de serviços da Web podem querer transmitir anexos binários de vários tipos, como imagens, desenhos, documentos XML, etc., juntamente com uma mensagem SOAP. Esses dados são freqüentemente em um formato binário particular. Tradicionalmente, duas técnicas têm sido usadas no tratamento de dados opacos em XML. Enviar dados binários por valor é obtido incorporando dados opacos (obviamente após alguma forma de codificação) como um elemento ou conteúdo de atributo do componente XML de dados. A principal vantagem desta técnica é que dá aos aplicativos a capacidade de processar e descrever dados, com base apenas no componente XML dos dados. O XML suporta dados opacos como conteúdo através do uso de codificação de texto base64 ou hexadecimal. Ambas as técnicas incham o tamanho dos dados. Para a codificação de texto subjacente ao UTF-8, a codificação base64 aumenta o tamanho dos dados binários por um fator de 1,33x do tamanho original, enquanto a codificação hexadecimal expande dados por um fator de 2x. Os fatores acima serão duplicados se a codificação de texto UTF-16 for usada. Também é preocupante a sobrecarga nos custos de processamento (real e percebido) para esses formatos, especialmente quando a decodificação volta para o binário bruto. O envio de dados binários por referência é conseguido anexando dados binários puros como entidades externas não segmentadas externas ao documento XML e incorporando URIs de referência a essas entidades como elementos ou valores de atributo. Isso evita o inchaço desnecessário de dados e desperdício de poder de processamento. O principal obstáculo para o uso dessas entidades não analisadas é a sua grande dependência de DTDs, o que impede a modularidade, bem como o uso de namespaces XML. Havia várias especificações introduzidas no mundo dos serviços da Web para lidar com esse problema de anexos binários usando a técnica quotby referencequot. SOAP with Attachments é um exemplo. Como o SOAP proíbe declarações de tipo de documento (DTD) em mensagens, isso leva ao problema de não representar dados como parte da mensagem infoset, criando, portanto, dois modelos de dados. Esse cenário é como enviar anexos com uma mensagem de email. Mesmo que esses anexos estejam relacionados ao conteúdo da mensagem eles não estão dentro da mensagem. Isso faz com que as tecnologias que processam e descrevem os dados com base no componente XML dos dados com mau funcionamento. Um exemplo é o WS-Security. Onde MTOM vem em MTOM (SOAP Message Transmission Optimization Mechanism) é outra especificação que se concentra em resolver o quotAttachmentsquot problema. MTOM tenta aproveitar as vantagens das duas técnicas acima, tentando mesclar as duas técnicas. MTOM é na verdade um método de referência quotby. O formato de fio de uma mensagem otimizada MTOM é o mesmo que a mensagem SOAP com anexos, que também torna compatível com Swa endpoints. A característica mais notável do MTOM é o uso do elemento XOP: Include, que é definido na especificação XOP (XML Binary Optimized Packaging) para fazer referência aos anexos binários (entidades gerais externas não analisadas) da mensagem. Com o uso deste elemento exclusivo, o conteúdo binário anexado logicamente torna-se inline (por valor) com o documento SOAP, mesmo que ele realmente é anexado separadamente. Isso funde os dois domínios, tornando possível trabalhar apenas com um modelo de dados. Isso permite que as aplicações processem e descrevam apenas olhando para a parte XML, tornando obsoleta a dependência de DTDs. Em uma nota mais leve, MTOM tem padronizado o mecanismo de referência SwA. O seguinte é um extrato da especificação XOP. No nível conceitual, esses dados binários podem ser considerados base64-codificados no documento XML. Como essa forma conceitual pode ser necessária durante algum processamento do documento XML (por exemplo, para assinar o documento XML), é necessário ter uma correspondência um-para-um entre os conjuntos de informações XML e os pacotes XOP. Portanto, a representação conceitual de tais dados binários é como se fosse codificada em base64, usando a forma léxica canônica do tipo de dados base64Binary Schema XML (consulte XML Schema Parte 2: Datatypes Second Edition 3.2.16 base64Binary). Na direção inversa, XOP é capaz de otimizar apenas dados de Infoset codificados em base64 que estão na forma lexical canônica. Apache Axis2 suporta a codificação Base64. SOAP com anexos e MTOM (mecanismo de optimização de transmissão de mensagens SOAP). MTOM com Modelo de Programação Axis2 AXIOM é (e pode ser o primeiro) Modelo de Objeto que tem a capacidade de armazenar dados binários. Ele tem essa capacidade como OMText pode conter conteúdo binário bruto na forma de javax. activation. DataHandler. OMText foi escolhido para este fim com duas razões. Uma delas é que o XOP (MTOM) é capaz de otimizar apenas dados de Infoset codificados em base64 que estão na forma léxica canônica do tipo de dados base64Binary Schema XML. Outro é preservar o infoset tanto no remetente como no receptor. (Para armazenar o conteúdo binário no mesmo tipo de objeto, independentemente de estar otimizado ou não). O MTOM permite codificar seletivamente porções da mensagem, o que nos permite enviar dados baseados em código base, bem como dados binários brutos conectados externamente, referenciados pelo elemento quotXOPquot (conteúdo otimizado) para ser enviado em uma mensagem SOAP. Você pode especificar se um nó OMText que contém dados binários brutos ou dados binários base64encoded está qualificado para ser otimizado no momento da construção desse nó ou posterior. Para uma melhor eficiência do MTOM, um usuário é aconselhado a enviar anexos binários menores usando base64encoding (não otimizado) e anexos maiores como conteúdo otimizado. Além disso, um usuário pode criar um nó de conteúdo binário otimizável usando uma seqüência codificada em base64, que contém conteúdo binário codificado, fornecido com o tipo MIME da representação binária real. Axis2 usa javax. activation. DataHandler para manipular os dados binários. Todos os nós de conteúdo binário otimizados serão serializados como Cadeias de Base64 se quotMTOM não estiver ativadoquot. Você também pode criar nós de conteúdo binário, que não serão otimizados em qualquer caso. Eles serão serializados e enviados como Base64 Strings. Habilitando a otimização do MTOM no lado do cliente em Opções, defina a propriedade quotenableMTOMquot como True quando enviar mensagens. Quando essa propriedade é definida como True, qualquer envelope SOAP, independentemente de ele conter conteúdo otimizável ou não, será serializado como uma mensagem MIME otimizada MTOM. Axis2 serializa todos os nós de conteúdo binário como seqüências codificadas Base64 independentemente se eles são qualificados para ser otimizado ou não se a propriedade quotenableMTOMquot estiver definida como False. Se o envelope contiver qualquer item de informação do elemento do nome xop: Include (veja XML-binário Otimizado Embalagem 3. XOP Infosets Constructs). O usuário não precisa especificar nada para que o Axis2 receba mensagens MTOM otimizadas. Axis2 irá automaticamente identificar e des-serializar em conformidade, como e quando uma mensagem MTOM chega. Habilitando a otimização do MTOM no lado do servidor O servidor do Axis 2 identifica automaticamente mensagens MTOM recebidas de entrada com base no tipo de conteúdo e as desalifa adequadamente. O usuário pode habilitarMTOM no lado do servidor para mensagens de saída, Para habilitarMTOM globalmente para todos os serviços, os usuários podem definir o parâmetro quotenableMTOMquot como True no Axis2.xml. Quando estiver definido, todas as mensagens de saída serão serializadas e enviadas como mensagens MIME optimizadas MTOM. Se não estiver definido, todos os dados binários nos nós de conteúdo binário serão serializados como cadeias codificadas em Base64. Essa configuração pode ser substituída em services. xml com base em por serviço e por operação. Você deve reiniciar o servidor após a configuração desse parâmetro. Acessando Dados Binários Recebidos (Código de Amostra) Estou escrevendo um servidor web simples em python que permite ao usuário carregar um arquivo usando multipart / form-data. Tanto quanto eu posso dizer, multipart MIME dados é suposto ser linha baseada. Por exemplo, o limite tem de estar no início de uma linha. Eu não consigo descobrir como os dados binários são tratados a este respeito. Meu cliente (Firefox) não está codificando em 7 bits ASCII ou qualquer coisa, seus dados binários apenas raw seu envio. Será que dividir os dados em linhas em locais arbitrários Existe um comprimento de linha máximo especificado para dados de várias partes Ive tentou olhar através do RFC para multipart / form-data, mas não encontrou nada. Perguntou Mar 27 13 at 16:54 Depois de cavar através dos RFCs, acho que finalmente consegui tudo direto na minha cabeça. As partes do corpo (isto é, o conteúdo do corpo de uma parte individual numa multipart / mensagem) apenas precisam de ser baseadas em linha de modo que o limite no final da parte começa com um CRLF. Mas, caso contrário, os dados não precisam ser baseados em linha, e se o conteúdo acontece com linebreaks nele, não há distância máxima entre eles, nem eles precisam ser escapados de qualquer maneira (bem, a menos que talvez o Content-Transfer - A codificação é quoted-string). As opções de 7 bits, 8 bits e binárias para Content-Transfer-Encoding não indicam realmente que qualquer codificação foi feita nos dados (e, portanto, nenhuma codificação precisa ser desfeita), eles significam apenas para indicar o tipo de dados Você pode esperar para ver na parte do corpo. O que eu estava realmente começando em minha pergunta mal expressa era como ler / buffer os dados do soquete para que eu pudesse ter certeza que eu peguei o limite, e sem ter que ter um buffer arbitrariamente grande (por exemplo, se aconteceu de ser não Linebreaks no conteúdo, e assim um readline acabou buffering a coisa toda). O que eu acabei fazendo foi buffer do soquete com um readline usando um comprimento máximo, então o buffer nunca seria mais longo do que isso, mas também iria certificar-se de terminar se um linebreak foi encontrado. Isso garantiu que quando o limite veio (após um CRLF), seria no início do buffer. Eu tive que fazer um pouco de monkeying extra ao redor para garantir que eu não inclua que CRLF final no conteúdo real do corpo, porque de acordo com o RFC é necessário antes da fronteira e, portanto, não parte do conteúdo em si. Resposta Tente rever o RFC 2045. Normalmente, o conteúdo binário é convertido em BASE64 pela sua aplicação e incluído na mensagem de várias partes usando Content-Transfer-Encoding. Base64. Existem outros mecanismos para transferir dados binários, mas isso é bastante comum. Os dados binários são convertidos em octetos e fragmentados em cadeias de comprimento arbitrárias (dependendo da variante de codificação - veja o link BASE64 acima). O aplicativo receptor, em seguida, decodifica-lo para o conteúdo binário original. Eu não sou um programador python, mas eu ficaria surpreso que você realmente tinha que codificar qualquer um deste você mesmo. Eu suspeito que existem funções pré-construídas da biblioteca python para fazer isso por você. Respondeu Mar 27 13 at 17:43 Obrigado, eu estava olhando para um RFC diferente que não foi tão informativo. Eu também encontrei RFC 2046 que especificamente define multi-part mensagens na seção 5. Nota there39s um pouco de uma sutileza nestes RFCs que através de mim off: ele diz multipart mensagens não podem ter outras codificações de 7 bits, 8 bits e binário (Ie não Base-64). No entanto, ele continua a dizer que as partes individuais dentro da multi peça pode ter lá próprias codificações de conteúdo, então você está correto que Base-64 é possível. Ndash sh1ftst0rm Mar 28 13 às 13:20 Sua resposta 2016 Stack Exchange, IncGreetings todos. Estou esperando que alguém possa me derramar algumas luzes sobre o problema que estou tendo. Lendo o Javadoc de MimeMessages getInputStream (), ele diz Retorna um fluxo de entrada decodificado para este conteúdo de mensagens No entanto, isso não é o que estou experimentando. A saída não é decodificada. Por exemplo, se eu tiver uma mensagem a seguir Então, supondo que eu tenho um objeto chamado m construído com o conteúdo acima, em seguida, chamando m. getInputStream () e despejar a saída para a tela mostra os charsets 3D. O que eu fiz de errado Se eu usei QPDecoderStream para decodificar a saída de m. getInputStream (), então, claro, o resultado será correto. No entanto, ele derrotar a finalidade, porque o Javadoc diz getInputStream () retorna um fluxo de entrada decodificado. Perguntou Mar 30 11 at 23:36 Se um Content-Transfer-Encoding cabeçalho campo aparece como parte de um cabeçalho da mensagem, ele se aplica a todo o corpo da mensagem. Se um campo de cabeçalho Content-Transfer-Encoding aparece como parte de um cabeçalho entitys, ele se aplica somente ao corpo dessa entidade. Se uma entidade é do tipo multipart, o Content-Transfer-Encoding não tem permissão para ter qualquer valor diferente de 7bit, 8bit ou binário. Você provavelmente poderia obter o fluxo de conteúdo decodificado do MimeMessage s de nível superior e instanciar um MimeMultipart dele, mas isso é apenas hacking em torno do problema fundamental de uma mensagem quebrada. JavaMail Você pode enviar ou buscar e-mail através de seu aplicativo Java ou servlet usando o API do JavaMail. Você usa a API JavaMail onde, como provedores de implementação JavaMail implementar a API JavaMail para lhe dar um cliente JavaMail (Java JAR arquivo). A Sun fornece mail. jar que possui implementações de clientes Suns SMTP, POP3 e IMAP juntamente com a API JavaMail. Isso é suficiente para enviar e receber e-mails, mas não para ler ou publicar em newgroups que usam NNTP. Exemplo de código para enviar email Para compilar e executar, você deve ter mail. jar (do download do JavaMail) e activation. jar (do download do JavaBeans Activation Framework) no classpath Java. Você precisa substituir endereços de e-mail e servidor de e-mail com seus valores, onde indicado. O nome de usuário e a senha geralmente não são necessários para enviar e-mails, embora seu ISP ainda possa exigir que ele evite que o spam entre em seus sistemas. Este código de exemplo tem a depuração ativada (mail. debug) para ver o que está acontecendo nos bastidores do código JavaMail. Exemplo de código para enviar e-mail multipart, e-mail HTML e anexos de arquivo Para compilar e executar, você deve ter mail. jar (do download do JavaMail) e activation. jar (do download do JavaBeans Activation Framework) no classpath Java. Você precisa substituir endereços de e-mail e servidor de e-mail com seus valores, onde indicado. Este código de exemplo tem a depuração ativada (mail. debug) para ver o que está acontecendo nos bastidores do código JavaMail. Código de exemplo para buscar email Para compilar e executar, você deve ter mail. jar (do download do JavaMail) e activation. jar (do download do JavaBeans Activation Framework) no classpath Java. Você precisa substituir o servidor de e-mail, nome de usuário e senha com seus valores onde indicado. Este código de exemplo tem a depuração ativada (mail. debug) para ver o que está acontecendo nos bastidores do código JavaMail. Classes úteis e interfaces Um objeto Session autentica o usuário e controla o acesso aos servidores de email. A classe Session é uma classe concreta final. Não pode ser subclassed. Chamando o método de fábrica apropriado em um objeto Session, você pode obter objetos Transport e Store que suportam protocolos específicos para enviar ou buscar email respectivamente. Você converter cadeias de endereços de email como userdomain em um objeto InternetAddress para usá-lo com JavaMail. A classe InternetAddress estende a classe Address abstrata para criar um endereço de tipo rfc822. Você constrói uma mensagem de email como um objeto da classe MimeMessage. Todos os e-mails Java são do tipo Mensagem. Cada objeto de mensagem tem um conteúdo. O conteúdo pode ser um conteúdo multipart ou não. Um conteúdo simples é apenas um texto simples, por exemplo. Não há nenhuma classe especial para conteúdo simples (não-multipart). Você acabou de dizer msg. setText (textString). A classe MimeMultipart trata o conteúdo multipart que adere às especificações MIME. Você cria um novo objeto MimeMultipart invocando seu construtor padrão. Quando você obtém o conteúdo de um e-mail multipart. Ele sempre retorna um objeto desse tipo. O MimeMultipart funciona como um contêiner para várias partes a serem enviadas no e-mail. Cada parte é do tipo MimeBodyPart. O método getBodyPart (int index) MimeMultiparts retorna o objeto MimeBodyPart no índice especificado. O índice começa em 0. O método addBodyPart (.) Adiciona um novo objeto MimeBodyPart a ele como um passo para a construção de um novo MimeMessage multipart. Cada objeto de tipo Bodypart pode conter um objeto JAF DataHandler ou outro objeto de tipo multipart (aninhado). Portanto, verifique o conteúdo de cada BodyPart antes de usá-lo em seu código. Para extrair um objeto de tipo multipart aninhado de um MimePart contendo um atributo ContentType definido como multipart /, use o método getContent () do MimePart. Seu método getSubType retorna o subtipo Multipart mensagem MIME. O subtipo define a relação entre as partes do corpo individuais de uma mensagem de várias partes. Se o conteúdo de um objeto Message for uma instância da classe Multipart, significa que você precisa converter o conteúdo em um Multipart e procurar por objetos do tipo BodyPart dentro do objeto resultante para acessar cada parte individual. Outro objeto Message não pode ser contido diretamente em um objeto Multipart, ele deve ser incorporado em um BodyPart primeiro. Cada objeto de tipo Mensagem ou BodyPart também possui alguns atributos. Os atributos de uma Mensagem s podem ser De, Para, Assunto, Responder a etc. Você também pode adicionar atributos não-padrão como cabeçalhos. Um objeto de tipo BodyPart não possui atributos que definem From, To, Subject, ReplyTo ou outros campos de cabeçalho de endereço. As mensagens são armazenadas em objetos de Pasta que também podem conter subpastas. Todos os servidores de email têm a pasta chamada INBOX. A classe Folder declara métodos que buscar, anexar, copiar e excluir mensagens. Um objeto de Pasta também pode enviar eventos para componentes registrados como ouvintes de evento. Fldr. getType retorna se uma pasta pode conter subpastas, mensagens ou ambas. Store. getDefaultFolder retorna a pasta raiz. Fldr. list retorna todas as subpastas sob essa pasta. Fldr. getFolder (folderName) retorna a subpasta nomeada. Esta subpasta não precisa existir fisicamente na loja. Fldr. exists indica se esta pasta existe. Store. create cria uma pasta Um objeto de pasta fechado permite excluir e renomear a pasta, listar e criar subpastas e monitorar novas mensagens. Fldr. open abre um objeto Folder (somente se ele pode conter mensagens). Você não pode chamar open, delete e renameTo em uma pasta aberta. As pastas são armazenadas em um banco de dados acessado por uma classe Store que requer nome de usuário e senha para se conectar ao banco de dados. Como usuário, primeiro você se conectará ao servidor de email chamando um dos três métodos connect (.) Em uma classe Store. Especificando o servidor para acessar, nome de usuário e senha. As mensagens armazenadas dentro de um objeto de Pasta são numeradas seqüencialmente, começando em 1. Chamar msg. getMessageNumber () retorna seu número de seqüência. Você pode fazer referência a uma mensagem por seu número de seqüência ou pelo próprio objeto de Mensagem correspondente. Quando as mensagens marcadas como excluídas são realmente purgadas, as mensagens restantes são renumeradas. Portanto, não há garantia de que uma mensagem sempre terá o mesmo número de mensagem em uma pasta. Como um número de seqüência pode mudar dentro de uma sessão, use referências a objetos de mensagem em vez de números de seqüência como referências em cache para mensagens. Use FetchProfile para recuperar seletivamente os atributos de mensagem / conteúdo para eficiência: Passos para usar o JavaMail Primeiro, pegue o objeto de sessão: O arquivo de propriedades de adereços contém protocolos de correio a serem usados, host de e-mail e porta para se conectar a, nome de usuário etc. Conecte-se ao servidor de e-mail. Ele pode estar em branco, embora você queira definir mail. store. protocol. Mail. transport. protocol. Mail. host. Mail. user e mail. from propriedades. As senhas não podem ser especificadas usando propriedades. Aqui estão as várias propriedades que podem estar no objeto Properties eo que eles fazem: mail. store. protocol. Protocolo padrão para buscar mensagens. Mail. transport. protocol. Protocolo padrão para enviar mensagens. enviar. Protocolo. host. Servidor de email padrão específico do protocolo, como mail. smtp. hostsmtp2.yourisp. Padrões para o que está na propriedade mail. host (veja a seguir). Mail. host. Servidor de correio padrão para enviar e receber e-mails. Mail. user. Nome de usuário do servidor de email. Padrão para a propriedade do sistema JVM user. name. O método Connect () de objetos de armazenamento e transporte usa essa propriedade para enviar o nome de usuário para o servidor de email, se a propriedade de nome de usuário específico do protocolo estiver ausente (consulte a seguir). enviar. Protocolo. user. Nome de usuário padrão específico do protocolo para conexão com o servidor de email. O padrão é o que está na propriedade mail. user. Mail. from. Especifica o endereço de retorno do usuário atual. Usado pelo método InternetAddress. getLocalAddress para especificar o endereço de e-mail atual dos usuários. Padrão para o nome do usuário. Mail. debug. Se especificado como seqüência de caracteres verdadeira, imprime mensagens no System. out mostrando vários comandos de protocolo sendo emitidos nos bastidores. O padrão é false. Você pode substituí-lo mais tarde com o método Session. setDebug, mas, em seguida, as mensagens de depuração só serão ativadas a partir desse ponto em diante e você vai perder as mensagens de criação da sessão. Enviando E-mail Instanciar uma nova mensagem: Definir atributos de mensagens: Definir conteúdo de mensagens: Para criar conteúdo MIME multipart, instancie primeiro um objeto MimeMultipart. O subtipo padrão de um conteúdo multipart é misturado. Você pode especificar outros subtipos, como alternativa, relacionado, paralelo e assinado. Instanciar e definir o conteúdo dos objetos MimeBodyPart Adicionar objetos BodyPart ao objeto Multipart Finalmente, defina o objeto Multipart como o conteúdo das mensagens Envie a mensagem Automatic Procedure. Este é um método estático de conveniência. Ele não permite registrar ouvintes de evento com o objeto Transport. Dependendo do tipo de endereço de cada destinatário, ele instancia a subclasse Transport apropriada, chama msg. saveChanges () e chama transportObject. sendMessage (msg). Procedimento Manual. Certifique-se de que os cabeçalhos de mensagem adequados são atualizados: Obter um objeto de Transporte específico para o protocolo de envio (normalmente smtp) Registrar os listeners de eventos se você quiser: Fazer matriz de endereços de destinatário: Enviar a mensagem: Opcionalmente, escrever a mensagem para um bytestream Salvar como um rascunho no disco, por exemplo): Busca de e-mail Obter o objeto de armazenamento: Conectar-se ao armazenamento: Listar pastas na loja e exibir / exibir mensagens em uma pasta: Obter atributos de mensagens: Retorna o tipo MIME de um Mensagens de conteúdo: Obter um conteúdo de mensagens: O tipo de objeto retornado depende do tipo de conteúdo real. Um conteúdo text / plain geralmente retorna um objeto String. Um multipart / ltwhatever objeto heregt sempre retorna um objeto Multipart ou sua subclasse. Para tipos de conteúdo desconhecido, quaisquer codificações específicas de email são decodificadas e um objeto InputStream é retornado. Quando terminar, feche todas as pastas abertas e, em seguida, a loja. Classes de utilitário Você pode usar a classe MimeUtility para converter cabeçalhos e conteúdo não-US-ASCII para o formato de correio seguro. Lembre-se de fazê-lo antes de chamar os métodos setHeader (), addHeader () e addHeaderLine (). Além disso, esses campos de cabeçalho devem ser dobrados (envolvidos) antes de serem enviados se excederem a limitação de comprimento de linha para o transporte (1000 bytes para SMTP). Os cabeçalhos recebidos podem ter sido dobrados. Seu aplicativo é responsável por dobrar e desdobrar cabeçalhos, conforme apropriado. Todos os métodos na classe utilitário MimeUtility são métodos estáticos. GetEncoding () recebe um objeto JAF DataSource e retorna Content-Transfer-Encoding que deve ser aplicado aos dados nesse objeto DataSource para torná-lo seguro de email. Codode () envolve um codificador em torno do dado fluxo de saída com base no especificado Content-Transfer-Encoding. Decode () decodifica o dado fluxo de entrada, com base no Content-Transfer-Encoding especificado. Uma vez que RFC 822 proíbe caracteres não-US-ASCII em cabeçalhos. Você deve primeiro chamar o método MimeUtility. encodeText () nos nomes e valores de cabeçalho e, em seguida, chamar métodos setHeader (), addHeader () ou addHeaderLine () nas cadeias codificadas. Ele codifica valores de cabeçalho somente se eles contêm caracteres não-US-ASCII. Da mesma forma, chame o método MimeUtility. decodeText em valores de cabeçalho obtidos de um MimeMessage ou MimeBodyPart usando o conjunto de métodos getHeader. Este método toma um valor de cabeçalho, aplica padrões de descodificação RFC 2047 e retorna o valor decodificado como uma seqüência de caracteres Unicode. Você deve sempre executar valores de cabeçalho através do decodificador para ser seguro. A classe ContentType é uma classe de utilitário que pode analisar cabeçalhos de tipo de conteúdo MIME recebidos e também gerar novos cabeçalhos de tipo de conteúdo MIME. Sinalizadores de mensagem Se uma pasta suportar o sinalizador USER especial, você pode definir sinalizadores definidos pelo usuário em qualquer mensagem pertencente a essa pasta. Outras bandeiras são: RESPOSTA. A mensagem foi respondida. PROJETO: A mensagem é um rascunho. FLAGGED. Marcar uma mensagem como assinalada. RECENTE. Esta mensagem é recém-chegado nesta pasta. Este sinalizador é definido quando a mensagem é entregue pela primeira vez na pasta e desmarcada quando a pasta que contém é fechada. Os clientes não podem definir este sinalizador. VISTO: Marca uma mensagem que foi aberta. Ele é definido quando o conteúdo da mensagem é recuperado. DELETED. Permite a eliminação de mensagem anulável. Definir esse sinalizador para uma mensagem marca-lo excluído, mas não fisicamente remover a mensagem de sua pasta. O cliente chama o método expunge em uma pasta para remover todas as mensagens excluídas nessa pasta. Métodos para operar em sinalizadores de uma mensagem JavaMail Events O JavaMail usa o mecanismo de manipulação de eventos tipo JDK 1.1. Você pode registrar sua classe como ouvintes para subclasses da classe MailEvent. As classes Transport, Store e Folder geram tais eventos. Um objeto Transport gera ConnectionEvent e TransportEvent. Se o objeto de transporte se conectar com êxito, ele disparará o ConnectionEvent com o tipo definido como OPENED. Se a conexão expirar ou for fechado, ConnectionEvent com tipo CLOSED é gerado. O método sendMessage de um objeto Transport gera um TransportEvent que contém informações sobre o êxito ou falha dos métodos. O objeto de evento contém três matrizes de matrizes de endereço: validSent, validUnsent e inválido. MENSAGEM ENVIADA. Mensagem enviada a todos os destinatários com êxito. ValidSent contém todos os endereços. ValidUnsent e invalid são nulos. MESSAGENOTDELIVERED. Quando ValidSent é nulo, a mensagem não foi enviada com êxito para qualquer destinatários. ValidUnsent pode ter endereços que são válidos. Inválido pode conter endereços inválidos. MESSAGEPARTIALLYDELIVERED. A mensagem foi enviada com êxito para alguns destinatários, mas não para todos. ValidSent contém endereços de destinatários para quem a mensagem foi enviada. ValidUnsent mantém endereços válidos, mas a mensagem não foi enviada para eles. Inválido contém endereços inválidos. Um objeto Store gera ConnectionEvent (gerado em uma conexão ou fechamento bem-sucedido), StoreEvent (o método event. getMessageType retorna ALERT ou NOTICE), FolderEvent (após a criação, exclusão ou renomeação de uma pasta). Um objeto de pasta gera ConnectionEvent (uma pasta é aberta ou fechada), FolderEvent (esta pasta cria, exclui ou renomeia) e MessageCountEvent (contagem de mensagens foi alterada, expunged Objetos de mensagem estão no evento). Mais sobre JavaMails Funcionamentos internos O JavaMail suporta múltiplas sessões simultâneas e cada sessão pode acessar vários armazenamentos e transportes de mensagens. Em uma JVM, vários aplicativos podem compartilhar a mesma sessão de email padrão. Desta forma, apenas um aplicativo precisa ter as informações eo código necessários para se conectar a um servidor de e-mail e autenticar o usuário. Outras aplicações, em seguida, simplesmente chamar enviar ou buscar métodos. Objetos de sessão getInstance (.), Métodos getDefaultInstance (.), GetStore (.) E getTransport (.) Procuram suas implementações javaMail configuradas em dois arquivos de texto chamados javamail. providers e javamail. default. providers. Normalmente, você não precisa fazer nada porque os provedores padrão no arquivo mail. jar são suficientes. As linhas nesses arquivos especificam qual classe Java usar para qual protocolo. Exemplo de arquivo javamail. providers: Busca as implementações configuradas da seguinte forma: Primeiro, usando a propriedade do sistema java. home, procura a configuração dos protocolos desejados no arquivo java. home /lib/javamail. providers. Pode haver um tal arquivo por JVM. Se o arquivo acima não existir ou o protocolo desejado não for encontrado no arquivo acima, ele procurará a configuração de protocolos desejados no arquivo META-INF / javamail. providers no seu diretório de aplicativos ou arquivo JAR. Pode haver um tal arquivo por aplicativo. Se o arquivo acima não existir ou o protocolo desejado não for encontrado no arquivo acima, ele procurará a configuração dos protocolos desejados no arquivo META-INF / javamail. default. providers no arquivo mail. jar do JavaMails. Pode haver um tal arquivo por instalação do JavaMail. Para um protocolo específico, o primeiro provedor listado ganha e é usado por padrão. Você pode alterar o padrão configurando o e-mail. Protocol. class para o nome da classe que você deseja quando você cria o Session object. Or, você pode alterá-lo mais tarde usando Sessões getProviders (), getProvider () e setProvider () métodos. Um objeto Provider não pode ser criado explicitamente deve ser recuperado usando o método session. getProviders () e deve ser um daqueles configurados nos arquivos de recurso. Os provedores em seus arquivos são adicionados antes dos que vêm em arquivos padrão de mail. jar s. Todos estão disponíveis a partir do seu código através do método session. getProviders (). O JavaMail pode instanciar o objeto Transporte correto implementando o protocolo correto com base no endereço dos destinatários. Como ele faz isso Procura por mapeamento de tipo de endereço a protocolo em dois arquivos de texto chamados javamail. address. map e javamail. default. address. map. Geralmente, você não precisa fazer nada porque os mapeamentos padrão no arquivo mail. jar são suficientes. Cada linha desses arquivos mapeia um tipo de endereço para um protocolo de transporte. Para determinar um tipo de endereço, use o método javax. mail. Address. getType () para obter o tipo de endereço. Por exemplo, dois tipos de endereços comuns são rfc822 (classe InternetAddress) e notícias (classe NewsAddress). Exemplo javamail. address. map. Ele procura por mapeamentos configurados da seguinte maneira: Primeiro, usando a propriedade de sistema java. home, ele procura o mapeamento de tipos de endereços desejados no java. home / lib / javamail. Arquivo. Pode haver um tal arquivo por JVM. Se o arquivo acima não existir ou o tipo de endereço desejado não for encontrado no arquivo acima, ele procurará o mapeamento de tipos de endereços desejados no arquivo META-INF / javamail. address. map no diretório de aplicativos ou no arquivo JAR. Pode haver um tal arquivo por aplicativo. Se o arquivo acima não existir ou o tipo de endereço desejado não for encontrado no arquivo acima, ele procurará o mapeamento de tipos de endereço desejado no arquivo META-INF / javamail. default. address. map no arquivo mail. jar do JavaMails. Pode haver um tal arquivo por instalação do JavaMail. As pastas também podem ser acessadas usando URLNames que podem ser construídos a partir de strings especificando protocolo, host, porta, arquivo, nome de usuário e senha. RFC 1738 especifica a sintaxe URL para protocolos baseados em IP, como IMAP4 e POP3. Especifique -1 como número de porta para usar a porta padrão. Maneiras apropriadas de expunge uma pasta. Expunge a pasta, feche-a. Reabra e refetch mensagens a partir dessa pasta. Emita o método close com o parâmetro expunge definido como true. You can search a folder (and, recursively, the entire store database) for the messages you are looking for. The abstract SearchTerm class represents search terms. It has a single method: public boolean match(Message msg) There are concrete subclasses of this class to search on subject, from, to etc. and to specify AND and OR criteria. The Folder class supports searches on messages: The content of a message is a collection of bytes. There is no built-in knowledge in JavaMail of the data type or format of the message content. Instead, the Message class object interacts with its own content through an intermediate layer - the JavaBeans Activation Framework (JAF). So, JavaMail uses JAF to handle access to data based on data-type. The out-of-the-box JAF provides two very simple JAF-aware viewer beans: Text Viewer and Image Viewer . These beans handle data where content-type has been set to text/plain or image/gif. JavaMail implementation providers (not you) need to write additional viewers that support some of the basic content types seen on the Internet such as text/html, multipart/mixed and message/rfc822. How E-Mail Works The first e-mail message with an sign in the address was sent in 1971. An e-mail system consists of two different servers running on a server machine. You connect to the SMTP (Simple Mail Transfer Protocol) server on its well-known port number 25 to send e-mail to others. And, you connect to the POP3 (Post Office Protocol version 3) server on its well-known port number 110 to fetch the e-mail you may have received. The email program on your computer interacts with the two mail servers at your ISP (Internet Service Provider) to send and fetch email. The interaction is dead simple. You compose your email and submit it to your e-mail program. Your email program connects over the Internet to the mail server, asks you for a username and password (if necessary), and supplies that to the mail server to authenticate you. After successful authentication, your e-mail programs interaction with an SMTP server goes something like this (from HowStuffWorks ): Your e-mail program: helo test Mail server: 250 mx1.mindspring Hello abc. sample 220.57.69.37, pleased to meet you Your e-mail program: mail from: testsample Mail server: 250 2.1.0 testsample. Sender ok Your e-mail program: rcpt to: jsmithmindspring Mail server: 250 2.1.5 jsmith. Recipient ok Your e-mail program: data Mail server: 354 Enter mail, end with . on a line by itself Your e-mail program: from: testsample to:jsmithmindspring subject: testing John, I am testing. . Mail server: 250 2.0.0 e1NMajH24604 Message accepted for delivery Your e-mail program: quit Mail server: 221 2.0.0 mx1.mindspring closing connection Connection closed by foreign host. It is that simple Really All e-mail programs do this behind the scenes. If you have mail. debug property set to true, you can see the commands being issued by the Sun JavaMail implementation as they print out on your console. Fetching email from a POP3 server works the same way. See How E-mail Works for details. Notice that the sender and recipients e-mail addresses during interaction with the SMTP server are specified before the body of the message. They can be different from whats in the body of the message. RFC822 says that the MIME (Multipurpose Internet Mail Extensions) messages exchanged over the Internet must have header lines and content. All bytes in header and content must be 7-bit US ASCII. Most standard headers are name-value pairs of strings (no binary data). The header lines are separated from the content by a blank line. The RFC specifies standard header fields. RFC822 does not say what the content can contain as long as the content bytes are 7-bit US ASCII. Any non-US-ASCII headers and content need to be encoded into the 7-bit US-ASCII (mail-safe) format using base64 and quoted-printable schemes. The MIME RFCs 2045, 2046 and 2047 specify how to do this. Each MIME content will have a content type, structured body parts and a set of encoding schemes to encode data into mail-safe characters. copy Vipan Singla 2001Configure content transfer encoding Applies to: Exchange Online, Exchange Server 2013 Content transfer encoding defines encoding methods for transforming binary email message data into the US-ASCII plain text format. This transformation allows the message to travel through older SMTP messaging servers that only support messages in US-ASCII text. Content transfer encoding is defined in RFC 2045. The transfer encoding method is stored in the Content-Transfer-Encoding header field in the message. In Microsoft Exchange Server 2013, the following content transfer encoding methods are available: 7-bit This value indicates that the message body data is already in the US ASCII plain text format, and no message encoding has been done to the message. Quoted-printable (QP) This encoding method uses printable US-ASCII characters to encode the message body data. If the original message text is mostly US-ASCII text, QP encoding gives somewhat readable and compact results. By default, Exchange 2013 uses QP for encoding binary message data. Base64 This encoding method is based primarily on the privacy-enhanced mail (PEM) standard defined in RFC 1421. Base64 encoding uses the 64-character alphabet encoding method and output padding characters defined by PEM to encode the message body data. Base64 encoding creates a predictable increase in message size and is optimal for binary data and non-US-ASCII text. You configure the transfer encoding method using the ByteEncoderTypeFor7BitCharsets parameter on the Set-OrganizationConfig and Set-RemoteDomain cmdlets. The content transfer encoding settings you configure with Set-OrganizationConfig apply to all messages in the Exchange organization. The content transfer encoding settings you configure with Set-RemoteDomain apply only to message sent to external recipients in the remote domain. The following table lists the values that you can use to set the transfer encoding method. Parameter in Set-OrganizationConfig Parameter in Set-RemoteDomain

No comments:

Post a Comment