Unable to send emails on Google App Engine - java

I have tried to use Javamail to send emails. However, I received the following message:
javax.mail.SendFailedException: Send failure (javax.mail.MessagingException: Illegal Arguments (java.lang.IllegalArgumentException: Bad Request: ))
I have tried to send emails from the admin account (that I use to upload the app), as well as the user account I login to the app as. (from UserService - getCurrentUser().getEmail()) both failed.
I'm wondering whether there's any special setting I have to setup?
Properties props = new Properties();
Session session = Session.getDefaultInstance(props, null);
Message msg = new MimeMessage(session);
UserService userService = UserServiceFactory.getUserService();
String email = userService.getCurrentUser().getEmail();
//Or
//String email = "my_admin_account#gmail.com";
msg.setFrom(new InternetAddress(email));
msg.addRecipient(Message.RecipientType.TO,
new InternetAddress("some_test_email#gmail.com"));
msg.setSubject("Test Email");
msg.setText("Nobody");
Transport.send(msg);

That is really very odd. I just wrote the following sample:
UserService userService = UserServiceFactory.getUserService();
String thisURL = request.getRequestURI();
if (request.getUserPrincipal() != null) {
response.getWriter().println("<p>Hello, " +
request.getUserPrincipal().getName() +
"! You can <a href=\"" +
userService.createLogoutURL(thisURL) +
"\">sign out</a>.</p>");
Properties props = new Properties();
Session mailSession = Session.getDefaultInstance(props, null);
Message msg = new MimeMessage(mailSession);
String email = userService.getCurrentUser().getEmail();
//Or
//String email = "my_admin_account#gmail.com";
msg.setFrom(new InternetAddress(email));
msg.addRecipient(Message.RecipientType.TO,
new InternetAddress("jesse.sightler#gmail.com"));
msg.setSubject("Test Email");
msg.setText("Nobody");
Transport.send(msg);
response.getWriter().println("<p>Sent email!</p>");
} else {
response.getWriter().println("<p>Please <a href=\"" +
userService.createLoginURL(thisURL) +
"\">sign in</a>.</p>");
}
There were no exceptions, and I did receive the email. Are you sure there isn't more going on in the actual application?

Just scanning the documentation on this I found the following:
For security purposes, the sender
address of a message must be the email
address of an administrator for the
application, or the Google Account
email address of the current user who
is signed in. The email address can
include a "reply to" address, which
must also meet these restrictions.
So 'email' should at the very least be set back to your admin emailaccount,
or a dedicated emailaccount added as an administrator to your project..
Other than that I see no problems with your code..

my two cents!! Check if the functionality is part of the server rather than the client classes..

Most probably because you are running your application locally.
Upload it to app-engine and it will work fine.
*your sender email should be the mail id with which you deploy the project to app-engine*
or an admin mail id.

Make sure you are using the message from an email address corresponding to the currently logged-in user or the email of the account where the applications is deployed.
The most important thing is that messages are not sent if the application is run locally. To actually send the messages, deploy it into Google App Engine and run it remotely.

Related

Failed sending mail from non existing address with spring boot: Requires password?

I try to send email from noreply#mydomain.com. And it gives following exception: javax.mail.AuthenticationFailedException: failed to connect, no password specified?
This is my spring-boot application.properties:
spring.mail.properties.mail.smtp.auth = true
spring.mail.host=xxx.xxx.xxx.xxx
spring.mail.port=x
server.ssl.enabled=false
spring.mail.default-encoding=utf-8
And this method to send email:
MimeMessage message = javaMailSender.createMimeMessage();
MimeMessageHelper helper;
helper = new MimeMessageHelper(message, true); // true indicates
helper.setSubject("This is subject");
helper.setFrom(new InternetAddress("Sender Name" + "<" + "noreply#mydomain.com"+ ">"));
helper.setTo("to#gmail.com");
Transport.send(message);
Thanks in advance!
How exactly did you expect this to work? Did you expect your mail server to allow you to send from any address as long as it's not a valid address? Nope, that's not how it works.
See this Gmail help page for how to send from a different address. It needs to be a real address. You can configure it to throw away eveything it receives.
If you want to do better, you'll need your own mail server that you can configure appropriately.
I solved it. My ip didn't have access to send email from given domain. After getting permission from network team email sent successfully.

javax.mail.AuthenticationException - Google cloud app Engine - Spring Boot

I'm currently working on a spring boot application when i'm required to send mail at specific moment, so i used the javax.mail api to do so, the program works fine on local machine but when i deploy the application in google cloud app engine, i keep getting the following error:
javax.mail.AuthenticationFailedException
i tried to follow google cloud documentation instructions when it comes to mailing requirement but i keep getting the same error.
following my code.*
public boolean sendMail(String indicator, String destination, String hotelName, String username, String password) {
Properties props = new Properties();
props.put("mail.smtp.host", "smtp.gmail.com");
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.port", "587");
Session session = Session.getDefaultInstance(props, new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(env.getProperty(IConstants.mailAddress),
env.getProperty(IConstants.mailPass));
}
});
String indic = null;
if(indicator.equals("R")){
indic = "RECEPTIONIST";
}
if(indicator.equals("M")){
indic = "ROOMMAID";
}
try {
Message message = new MimeMessage(session);
message.setFrom(new InternetAddress(env.getProperty(IConstants.mailAddress)));
message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(destination));
message.setSubject(indic + "Hotel " + hotelName + " - Credentials");
message.setText("Hello " + hotelName
+ " Employee, Down Below Your Credentials for a secure access to your workspace " + ".\n USERNAME: "
+ username + " PASSWORD: " + password + ".\n" + "Greetings.");
Transport.send(message);
return true;
} catch (MessagingException e) {
throw new RuntimeException(e);
}
}
The sender mail is on the authorized mail senders list, everything is correctly configured, the app responds to all the requests, but keeps failing at sending mail step.
I enabled the less security application authentication option on the sender gmail account but it keep rejecting the authentication attempts.
Thanks.
I kept trying multiple configurations to make it work but it didn't, so i switched to another option, i implemented the sendGrid solution, google cloud listed it as a possible alternative approach, it was so simple, so secure and it worked from first attempt.
SendGrid implementation
Thanks for ur suggestions
Were you using standard env or flexible env. In our case we used flexible env with google smtp mailing.
It is working fine for us. And I suspect the issue in your case is with the third party access check of google mail account.
Try the same smtp after enabling this option so that your application will be able to access the gmail smtp.
Turn on access from the settings shown in screenshot for the account which is being used from smtp
Although the sendgrid is a nice mailing service. But we prefered google smtp only.

send mail through java : multiple sender with different mail id

I want to send one mail to specified recipient but my sender can have different mail account like outlook or ymail or gmail.
Is it possible to send an email from different email id to same recipient? I'm using this code :
try
{final String from=request.getParameter("from");String smtpServ="",port="";final String pass=request.getParameter("pass");String to=request.getParameter("to");String subject=request.getParameter("subject");String body=request.getParameter("msg");if(from.contains("#gmail.com")){smtpServ="smtp.gmail.com";port="465";}else if(from.contains("#outlook.com") || from.contains("#hotmail.com")){smtpServ="smtp.live.com";port="587";}else if(from.contains("#ymail.com") || from.contains("#yahoo.com") || from.contains("#rocketmail.com") || from.contains("#yahoo.in")){smtpServ="smtp.mail.yahoo.com";port="465";}Properties props = System.getProperties();
// -- Attaching to default Session, or we could start a new one --
props.put("mail.transport.protocol", "smtp");
props.put("mail.smtp.starttls.enable","true");
props.put("mail.smtp.host",smtpServ);
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.port", port);
Session session1 = Session.getDefaultInstance(props,
new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(from,pass);
}
});Message message = new MimeMessage(session1);message.setFrom(new InternetAddress(from));
message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to, false));
message.setSubject(subject);
message.setText(body);
// -- Set some other header information --
message.setHeader("MyMail", "Java Mail Test");
message.setSentDate(new Date());Transport.send(message);System.out.println("Message sent to"+to+" OK."); }
catch (Exception ex)
{ ex.printStackTrace();System.out.println("Exception "+ex); }
Sending mails via Java (using Java Mail API) requires you to setup an SMTP host that would send your email to the recipient after proper log-in validation. I've used Java Mail with Gmail IDs and Gmail as SMTP host server. Some e-mail service providers do not allow sending emails from outside of their own web-services (making them incompatible with Java Mail).
But, in order to support multiple senders, you'll need to do the following:
Change the SMTP server to your correct host as per the email ID in use.
Run the Authenticator, with the new e-mail address and password, every time the sender ID is changed.
Then send your message.
My suggestion would be to store these sender email IDs and passwords (and SMTP hosts) when the program is initially run and then iterate the above steps with required changes, for each email id and password pair.
The Caveat:
In my opinion it's best to stick with a single sender else, multiple messages with similar content, by varied sender addresses, may be marked down as Spam by the recipients email service provider.
message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to, false));
replace this thing with,
message.setRecipients(Message.RecipientType.TO, Address[] addresses);
[N.B.- addresses are ur desired IDs.]

Sending email with google app engine

Im tring to send a simple email with this code using google app engine.
But nothing happens, is there something i have to configure in order to use the mail api?
This runs on localhost.
I am using gmail as mail host.
String host = "smtp.google.com";
String to = "example#yahoo.fr";
String from = "example#gmail.com";
String subject = "this is a test";
String messageText = "test";
boolean sessionDebug = false;
// Create some properties and get the default Session.
Properties props = System.getProperties();
props.put("mail.host", host);
props.put("mail.transport.protocol", "smtp");
Session mailSession = Session.getDefaultInstance(props, null);
// Set debug on the Session
// Passing false will not echo debug info, and passing True will.
mailSession.setDebug(sessionDebug);
// Instantiate a new MimeMessage and fill it with the
// required information.
Message msg = new MimeMessage(mailSession);
msg.setFrom(new InternetAddress(from));
InternetAddress[] address = { new InternetAddress(to) };
msg.setRecipients(Message.RecipientType.TO, address);
msg.setSubject(subject);
msg.setSentDate(new Date());
msg.setText(messageText);
// Hand the message to the default transport service
// for delivery.
Transport.send(msg);
When running the AppEngine development server locally, anything sent via the Mail service will not actually be sent - it will just be logged to the console
See here
When an application running in the development server calls the Mail service to send an email message, the message is printed to the log. The Java development server does not send the email message.
In addition, the from address must be (from here)
The email of an app administrator
The email of the currently logged in user who signed in using a Google Account
A valid email receiving address from the app
The sender should be your own Gmail email address instead of example#gmail.com
Reason is because the SMTP server needs to authenticate you.
Apparently, GAE doesn't allow the use of the admin accounts any more. you need to use the service account: project-id#appspot.gserviceaccount.com
My previous projects still work with admin accounts, but the recently created projects just don't allow me to use any of the admin accounts.
Other than email not working on localhost or due to the sender email not being the authenticated one, I have experienced that email does not work even when the version is not the default one. I could not find this documented anywhere.
For example:
nondefaultversion-dot-myapp.appspot.com (email does not work, no error logs)
myapp.appspot.com (email works)
Please confirm if others have also faced this issue.

How to send email from a java web app

I have a java web application sitting on Tomcat/Apache.
I have a form which has to send email. What is the best way to get this working.
I suppose these threads did appear when you posted your question:
Sending mail from java
How do I send an e-mail in Java?
How can I send an email by Java application using GMail, Yahoo, or Hotmail?
You should look at JavaMail API
Additionally, you may want to look at Fancymail, a small library to simplify usage of JavaMail API.
Short and dirty copy-and-paste for sending a simple plain text mail message using javamail here
Tiny example of sending a plain text msg, using custom smtp host:
Properties props = new Properties();
props.put("mail.smtp.host", "your.mailhost.com");
Session session = Session.getDefaultInstance(props, null);
session.setDebug(true);
Message msg = new MimeMessage(session);
msg.setFrom(new InternetAddress("mail#from.com"));
msg.setRecipients(Message.RecipientType.TO, new InternetAddress[]{new InternetAddress("mail#to.com")});
msg.setSubject("Subject Line");
msg.setText("Text Body");
Transport.send(msg);

Categories