rus*_*off 6 email jakarta-mail google-api-java-client google-oauth gmail-api
我在Openshift上部署了Web服务。目前,我正在开发一种使用我的Gmail帐户在特定时间发送自动电子邮件的方法。
因此,我已经记录了自己两到三天,得出的结论是我有两个选择:
1)使用JavaMail库。2)使用Gmail API。
对于第一个选项,我使用了以下类:
public class EmailSenderService {
private final Properties properties = new Properties();
private String password = "*******";
private Session session;
private void init() {
//ssl
properties.put("mail.smtp.host", "smtp.gmail.com");
properties.put("mail.smtp.socketFactory.port", "465");
properties.put("mail.smtp.socketFactory.class",
"javax.net.ssl.SSLSocketFactory");
properties.put("mail.smtp.auth", "true");
properties.put("mail.smtp.port", "465");
session = Session.getDefaultInstance(properties,
new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("eu***@gmail.com",password);
}
});
}
public void sendEmail(){
init();
//ssl
try {
Message message = new MimeMessage(session);
message.setFrom(new InternetAddress("eu***@gmail.com"));
message.setRecipients(Message.RecipientType.TO,
InternetAddress.parse("c***6@gmail.com"));
message.setSubject("Testing Subject");
message.setText("Dear Mail Crawler," +
"\n\n No spam to my email, please!");
Transport t = session.getTransport("smtp");
t.connect("smtp.gmail.com", "eu***@gmail.com", password);
t.sendMessage(message, message.getAllRecipients());
System.out.println("Done");
} catch (MessagingException e) {
e.printStackTrace();
}
}
}
Run Code Online (Sandbox Code Playgroud)
并使用以下命令呼叫他们:
EmailSenderService ess = new EmailSenderService();
ess.sendEmail();
Run Code Online (Sandbox Code Playgroud)
2)我正在使用的第二个选项如下:
public class EmailSenderGmailApi {
/*
* Atributos
*/
// Check https://developers.google.com/gmail/api/auth/scopes for all available scopes
private static final String SCOPE = "https://www.googleapis.com/auth/gmail.compose";
private static final String APP_NAME = "eu***l";
// Email address of the user, or "me" can be used to represent the currently authorized user.
private static final String USER = "eu***@gmail.com";
// Path to the client_secret.json file downloaded from the Developer Console
private static final String CLIENT_SECRET_PATH = "../app-root/data/eu***.json";
private static GoogleClientSecrets clientSecrets;
/*
* Metodos
*/
public static Gmail init() throws IOException{
System.out.println("***Working Directory = " + System.getProperty("user.dir"));
HttpTransport httpTransport = new NetHttpTransport();
JsonFactory jsonFactory = new JacksonFactory();
clientSecrets = GoogleClientSecrets.load(jsonFactory, new FileReader(CLIENT_SECRET_PATH));
// Allow user to authorize via url.
GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
httpTransport, jsonFactory, clientSecrets, Arrays.asList(SCOPE))
.setAccessType("online")
.setApprovalPrompt("auto").build();
String code = "***";
// Generate Credential using retrieved code.
GoogleTokenResponse response = flow.newTokenRequest(code)
.setRedirectUri(GoogleOAuthConstants.OOB_REDIRECT_URI).execute();
GoogleCredential credential = new GoogleCredential()
.setFromTokenResponse(response);
// Create a new authorized Gmail API client
return new Gmail.Builder(httpTransport, jsonFactory, credential)
.setApplicationName(APP_NAME).build();
}
/**
* Create a MimeMessage using the parameters provided.
*
* @param to Email address of the receiver.
* @param from Email address of the sender, the mailbox account.
* @param subject Subject of the email.
* @param bodyText Body text of the email.
* @return MimeMessage to be used to send email.
* @throws MessagingException
*/
public static MimeMessage createEmail(String to, String from, String subject,
String bodyText) throws MessagingException {
System.out.println("***Empezando a enviar email...");
Properties props = new Properties();
Session session = Session.getDefaultInstance(props, null);
MimeMessage email = new MimeMessage(session);
InternetAddress tAddress = new InternetAddress(to);
InternetAddress fAddress = new InternetAddress(from);
email.setFrom(new InternetAddress(from));
email.addRecipient(javax.mail.Message.RecipientType.TO,
new InternetAddress(to));
email.setSubject(subject);
email.setText(bodyText);
return email;
}
/**
* Create a Message from an email
*
* @param email Email to be set to raw of message
* @return Message containing base64 encoded email.
* @throws IOException
* @throws MessagingException
*/
public static Message createMessageWithEmail(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;
}
/**
* Send an email from the user's mailbox to its recipient.
*
* @param service Authorized Gmail API instance.
* @param userId User's email address. The special value "me"
* can be used to indicate the authenticated user.
* @param email Email to be sent.
* @throws MessagingException
* @throws IOException
*/
public static void sendMessage(Gmail service, String userId, MimeMessage email)
throws MessagingException, IOException {
Message message = createMessageWithEmail(email);
message = service.users().messages().send(userId, message).execute();
System.out.println("Message id: " + message.getId());
System.out.println(message.toPrettyString());
}
Run Code Online (Sandbox Code Playgroud)
}
第一个选项,当调用它时,Openshift COnsole中显示的消息如下:
javax.mail.AuthenticationFailedException
at javax.mail.Service.connect(Service.java:306)
at javax.mail.Service.connect(Service.java:156)
at main.java.model.EmailSenderService.sendEmail(EmailSenderService.java:86)
at main.java.model.AccessManager.renewPassStepOne(AccessManager.java:234)
at main.java.webService.UsuarioService.renewPassStepOne(UsuarioService.java:192)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.sun.jersey.spi.container.JavaMethodInvokerFactory$1.invoke(JavaMethodInvokerFactory.java:60)
at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$TypeOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:185)
at com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75)
at com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:302)
...
Run Code Online (Sandbox Code Playgroud)
我一直在尝试自己修复它,查看google,stackoverflow ...但是,每次引入的更改,都会得到相同的消息。
在选项2中,我不知道如何使用它。我正在尝试这样的事情:
MimeMessage msg = EmailSenderGmailApi.createEmail("ca***@gmail.com", "eu***@gmail.com", "test", "holaaaaa");
EmailSenderGmailApi.sendMessage(
EmailSenderGmailApi.init(),
"cap***@gmail.com",
msg);
Run Code Online (Sandbox Code Playgroud)
无论如何,老实说,我已经研究了很多Java Mail,希望有人可以帮助我解决我可能遇到的任何错误。
关于Gmail Api,根据官方文档,我还无法弄清楚如何发送电子邮件。互联网上也没有太多的文档。
有人可以帮我吗?
Gmail API公共文档提供了有关发送电子邮件的指南,甚至提供了Java示例代码:
https://developers.google.com/gmail/api/guides/sending
上面的代码似乎相去不远。首先,我要通过做一些简单的事情(例如labels.list())来确保Oauth2正常工作,如果可行,那么请继续进行更复杂的事情,例如发送电子邮件。(构建,转换为字符串,使用base64url编码然后再发送,这是您的正确想法。)尝试使用Gmail API发送消息时,您遇到的确切问题是什么?收到一些错误输出或代码中缺少某些内容?
| 归档时间: |
|
| 查看次数: |
18596 次 |
| 最近记录: |