我正在尝试使用google java api服务发送基于Gmail REST API的邮件.我已通过Google Develover Console配置了应用程序客户端并下载了p12和json文件.
我使用过这个示例程序,https://developers.google.com/gmail/api/guides/sending#sending_messages ...
此示例有效,但这是基于GoogleAuthorizationCodeFlow.我只想从服务器到服务器工作,直接调用,而不是打开浏览器来获取访问令牌......我得到了它(访问令牌)但最后我收到了错误请求....为什么? ?我收到的信息不仅仅是"Bad Request"和"Precondition Failed"
基于此,我按照以下步骤操作:
第一步:根据我的客户帐户邮件和p12生成的文件创建GoogleCredential对象:
GoogleCredential credential = new GoogleCredential.Builder().setTransport(new NetHttpTransport())
.setJsonFactory(new JacksonFactory())
.setServiceAccountId(serviceAccountUserEmail)
.setServiceAccountScopes(scopes)
.setServiceAccountPrivateKeyFromP12File(
new java.io.File(SERVICE_ACCOUNT_PKCS12_FILE_PATH))
.build();
Run Code Online (Sandbox Code Playgroud)在这里,我必须指出,我有很多问题需要使用ClientID而不是ClientMail.它必须使用@ developer.gserviceaccount.com帐户而不是.apps.googleusercontent.com.如果你不发送这个参数确定,你得到一个"无效授予"错误.这在此处说明:https://developers.google.com/analytics/devguides/config/mgmt/v3/mgmtAuthorization
第二步:根据凭据创建Gmail服务:
Gmail gmailService = new Gmail.Builder(httpTransport,
jsonFactory,
credential)
.setApplicationName(APP_NAME)
.build();
Run Code Online (Sandbox Code Playgroud)第三步从MimmeMessage创建Google原始消息:
private static Message _createMessageWithEmail(final MimeMessage email) throws MessagingException, IOException {
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
email.writeTo(bytes);
String encodedEmail = Base64.encodeBase64URLSafeString(bytes.toByteArray());
Message message = new Message();
message.setRaw(encodedEmail);
return message;
Run Code Online (Sandbox Code Playgroud)
}
第四步调 …
我必须 在Weblogic 12c服务器(12.2.1)上使用两者(奇怪的是......)" prefer-web-inf-classes "和" web- to -application-packages"的weblogic.xml属性
它是基于Jersey 1.9的REST应用程序.*(Jersey 1.x JAX-RS RI)和Guice.
1.为什么要使用:prefer-web-inf-classes
如果你有多个WAR,你必须在war/lib的级别放置guice-jersey/guice的库,否则你会得到Multibindings Error.
它必须表明prefer-web-inf-classes为true. 这种方式正常!我试图以相同的方式使用prefer-application-packages和package(com.sun.jersey.guice.spi.container.servlet /com.google.inject.servlet等等),但没办法.
注意:无法在EAR级别排除此库.
2.为什么要使用:prefer-application-packages
要在Weblogic 12c(12.2.1)上使用Jersey 1.x JAX-RS RI,所以我必须指出以下包(Weblogic使用Jersey 2的其他方式,以及不同版本的Jackson库等)
如果以这种方式表示,它在Jersey 1.X上完美运行..我已分别探讨了两场战争,并且工作得很好......但是,请记住我的朋友我有两场战争......所以....
摘要
我不能同时使用这两个属性(在weblogic.xml上使用这两个属性部署错误..),但它需要:
问题:如何将两者结合使用其中之一?
是否可以在不使用模拟的情况下使用Google Credentials for GMAIL REST API?
在GMAIL REST API的许多示例中,我看到必须使用与域和Google APPS关联的模拟帐户.我只想使用GMAIL REST API api服务器到服务器:
FE:
GoogleCredential credential = new GoogleCredential.Builder().setTransport(httpTransport)
.setJsonFactory(jsonFactory)
.setServiceAccountId(serviceAccountUserEmail)
**.setServiceAccountUser("myuser@mydomain.com)**
.setServiceAccountScopes(SCOPES)
.setServiceAccountPrivateKeyFromP12File(
new java.io.File(SERVICE_ACCOUNT_PKCS12_FILE_PATH))
.build();
Run Code Online (Sandbox Code Playgroud)
问题是,我没有任何域名,我只使用GMAIL帐户...但我没有任何方式授权,例如:MyMainGmailAcccoun@gmail.com
servive acccount id 4xxxxxxxxxxxxxq@developer.gserviceaccount.com";是使用MyMainGmailAcccoun@gmail.com创建的" 客户帐户"
这没有任何意义,我不想冒充其他域名的其他帐户,我也没有任何办法来authozize MyMainGmailAcccoun@gmail.com.
只是有效,如果您有一个帐户来冒充与Google Apps相关的其他域名,并获得Google Apps ...您需要一个域名.
任何建议?
为了支持通过 Java 1.6 API 到使用 TLS 1.2 的远程主机的 HTTPS 连接,我们开发了一个基于 Bouncy Castle Libraries (v. 1.53) 的定制 TLS SocketConnection 工厂
它非常易于使用,只需:
String httpsURL = xxxxxxxxxx
URL myurl = new URL(httpsURL);
HttpsURLConnection con = (HttpsURLConnection )myurl.openConnection();
con.setSSLSocketFactory(new TSLSocketConnectionFactory());
InputStream ins = con.getInputStream();
Run Code Online (Sandbox Code Playgroud)
在测试期间,我连接了暴露在SSLabs 测试中的不同 Web 和远程主机
这在 90% 的情况下都能正常工作!但在某些情况下,我们会收到令人讨厌的错误:“内部 TLS 错误,这可能是一次攻击”。已经检查没有攻击。这是基于内部 BouncyCastle 异常处理的常见错误。我正在尝试为那些运气不佳的远程主机找到一个通用模式。
更新:
更新一些代码以获取额外信息,我们得到:
org.bouncycastle.crypto.tls.TlsFatalAlert: illegal_parameter(47)
at org.bouncycastle.crypto.tls.AbstractTlsClient.checkForUnexpectedServerExtension(AbstractTlsClient.java:56)
at org.bouncycastle.crypto.tls.AbstractTlsClient.processServerExtensions(AbstractTlsClient.java:207)
at org.bouncycastle.crypto.tls.TlsClientProtocol.receiveServerHelloMessage(TlsClientProtocol.java:773)
Run Code Online (Sandbox Code Playgroud)
我得到的扩展类型是这样的:
扩展类型:11 扩展数据:
根据 ExtensionType 类,“ec_point_formats”。这会导致“UnexpectedServerExtension”-->“UnexpectedServerExtension”导致--> TlsFatalAlert:非法参数,最后这是一个“内部TLS错误,这可能是一次攻击”
任何建议记录或跟踪这个奇怪的 TLS 错误....???? 正如我所说,这段代码可以工作 90%...但是对于一些远程主机,我得到了这个错误
诀窍在于覆盖 startHandShake …
我无法使用Hazelcast的REST API,总是接收:
ERR_EMPTY_RESPONSE通过浏览器或java.net.SocketException: Unexpected end of file from server通过Java测试程序.在hazelcast节点:
INFO: [myIP]:5701 [dev] [3.6] Established socket connection between /127.0.0.1:5701 and /127.0.0.1:62816
06-may-2016 13:04:20 com.hazelcast.nio.tcp.TcpIpConnection
INFO: [myIP]:5701 [dev] [3.6] Connection [/127.0.0.1:62816] lost. Reason: Socket explicitly closed
Run Code Online (Sandbox Code Playgroud)使用过的代码只是hazaelcast multimap示例: 和REST API uri http:// localhost:5701/hazelcast/rest/maps/my-distributed-map/key
我的问题很简单
有什么方法可以通过Manifest.yml * 设置环境变量,而无需 *运行vmc命令set-env [应用程序名称]键=值 ?
在Amazon上,可以使用.ebextension文件执行以下操作
* option_settings:-命名空间:aws:elasticbeanstalk:容器:tomcat:JVMOPTIONS
option_name:JVM选项
值:=值-DKEY *
我也想设置此变量,而不使用vmc从Eclipse部署应用程序
我的战争
src
清单文件
或类似的东西。
我设法通过set-env vmc命令来实现,但是在使用Eclipse插件时,当您删除或删除应用程序变量时,它会消失,这是非常不舒服的。
因此,理想的是在manifest.yml ....中设置这些变量,但我无法获取或不提供正确的语法。
谢谢。
java ×5
rest ×3
gmail-api ×2
bouncycastle ×1
email ×1
google-apps ×1
guice ×1
hazelcast ×1
jersey-1.0 ×1
ssl ×1
tls1.2 ×1
tomcat ×1
weblogic12c ×1