Send Email Without Password - android

I am developing an android app. In my android app I am having feed back form. and I take a email id from user as input. and i want when a user clicks on submit button the email should send.
I dont want that user should add his/her password for that.
I have checked the default method by Intent and the second method in the below link ..
Second Method

If you want the email to be sent from the account of the user of the app, a proper authentication would be required.
As a result, either you could send an intent to email app (as you mentioned) or you could do it yourself (as in second method mentioned by you).
But the second method obviously requires password since you are sending an email on behalf of the user (from their account). Gmail (or any mail service provider as a matter of fact) won't allow that without a password.
So to answer your question in a nutshell, no. You can not do it without a password.
In stead, you could use a work around. You can send all emails sent through your apps from a single mail id (which is created by you so you know the password). Now in the content of the email, you can store the email id of the user from whom you are asking for the feedback.
This way, you just have to ask for the mail id (no password) and you also get their contact information if you want to contact them back.
Hope this helps.
Good luck.

I had the same question and found a solution that I modified to work for me. You can do a search in stack overflow but solution I used was from sending email without using defaut my token was being retrieved after the email was sent out. Anyway here is snippet of a working sample I created.
I imported the following jars:
compile files('libs/activation.jar')
compile files('libs/additionnal.jar')
compile files('libs/mail.jar')
I had the following permission requests
<uses-permission android:name="android.permission.GET_ACCOUNTS">
</uses-permission>
<uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS"> </uses-permission>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.USE_CREDENTIALS"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
Also for my scenario I asked the user for their user account. If you know it then you can skip this step. the snippet I have for this can be done another way using helper methods provided by studio libs however I just did it via a dialog.
public Account[] getGoogleAccounts(){
return accounts = acctManager.getAccountsByType("com.google"); }
public void getGoogleAccountsDialog(){
if( getGoogleAccounts().length>1) {
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setTitle("Select Google Account:")
.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
})
.setItems(convertAccountTo(getGoogleAccounts()), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
setSelectedAcct(accounts[which]);
initToken(activity);
dialog.dismiss();
}
});
builder.create();
builder.show();
}
else if(getGoogleAccounts().length==1){
setSelectedAcct(getGoogleAccounts()[0]);
}
else{
Toast.makeText(context,"No google account(s) exists on this device.",Toast.LENGTH_LONG);
}
}'
because this is a working sample i just have dummy text setup to fire the email immediately after the name is selected. However you will modify this code for you suiting.
Was the token is obtained I send the email request which is the getAndUseAuthTokenInAsynTask()
public void initToken(Activity ctx) {
acctManager.getAuthToken(getSelectedAcct(), "oauth2:https://mail.google.com/", null, activity, new AccountManagerCallback<Bundle>(){
#Override
public void run(AccountManagerFuture<Bundle> result){
try{
Bundle bundle = result.getResult();
token = bundle.getString(AccountManager.KEY_AUTHTOKEN);
getAndUseAuthTokenInAsyncTask();
Log.d("initToken callback", "token="+token);
} catch (Exception e){
Log.d("test", e.getMessage());
}
}
}, null);
}
lastly the remainder of the calls
public synchronized void sendMail
(String subject, String body, String user,
String oauthToken, String recipients)
{ try {
SMTPTransport smtpTransport = connectToSmtp("smtp.gmail.com", 587,
user, oauthToken, true);
MimeMessage message = new MimeMessage(session);
DataHandler handler = new DataHandler(new ByteArrayDataSource(
body.getBytes(), "text/plain"));
message.setSender(new InternetAddress(user));
message.setSubject(subject);
message.setDataHandler(handler);
if (recipients.indexOf(',') > 0)
message.setRecipients(Message.RecipientType.TO,
InternetAddress.parse(recipients));
else
message.setRecipient(Message.RecipientType.TO,
new InternetAddress(recipients));
smtpTransport.sendMessage(message, message.getAllRecipients());
} catch (Exception e) {
Log.d("test", e.getMessage(), e);
}
}
public SMTPTransport connectToSmtp(String host, int port, String userEmail,
String oauthToken, boolean debug) throws Exception {
Properties props = new Properties();
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.starttls.required", "true");
props.put("mail.smtp.sasl.enable", "false");
session = Session.getInstance(props);
session.setDebug(debug);
final URLName unusedUrlName = null;
SMTPTransport transport = new SMTPTransport(session, unusedUrlName);
// If the password is non-null, SMTP tries to do AUTH LOGIN.
final String emptyPassword = null;
transport.connect(host, port, userEmail, emptyPassword);
byte[] response = String.format("user=%s\1auth=Bearer %s\1\1",
userEmail, token).getBytes();
response = BASE64EncoderStream.encode(response);
transport.issueCommand("AUTH XOAUTH2 " + new String(response), 235);
return transport;
}
Hope this helps someone else. Keep in mind that the sending of the mail should not be done on the main thread.

Not sure if useful to you, but have you considered also using the built-in email functionality? This wouldn't even require the user to enter their user id nor password, but of course they'll leave your app to the email client to send the email.
Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
String[] recipients = new String[]{"recipient#email.com", "",};
emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, recipients);
emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "Sample mail");
emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, "This is a sample mail..");
emailIntent.setType("text/plain");
startActivity(Intent.createChooser(emailIntent, "Send mail client :"));
(Btw: This would show many other apps along the email clients. If you're interested in such a solution, I can post some code to filter out all apps but email clients)

Related

Failure to generate Uber oauth Token UnauthorizedException

I'm using the oauth2-essentials library because it was one of the recommended oauth libraries on the uber developers site, and it has been recently updated.
My code looks like this:
executor = new HttpUrlConnectionExecutor();
OAuth2AuthorizationProvider provider = new BasicOAuth2AuthorizationProvider(
URI.create("https://login.uber.com/oauth/v2/authorize"),
URI.create("https://login.uber.com/oauth/v2/token"),
new Duration(1,0,3600) /* default expiration time in case the server doesn't return any */);
OAuth2ClientCredentials credentials = new BasicOAuth2ClientCredentials(
getString(R.string.uberClientId), getString(R.string.uberSecret));
uberOAuthClient = new BasicOAuth2Client(
provider,
credentials,
new LazyUri(new Precoded("my redirect url")) /* Redirect URL */);
generateUberOAuthToken("my phone number", "my password");
}
public void generateUberOAuthToken(final String uName, final String password){
new Thread() {
public void run() {
try {
uberOAuthToken = new ResourceOwnerPasswordGrant(
uberOAuthClient, new BasicScope("profile"), uName, password).accessToken(executor);
}
catch (Exception e){
e.printStackTrace();
}
}
}.start();
}
The exception: org.dmfs.httpessentials.exceptions.UnauthorizedException: Authentication at 'https://login.uber.com/oauth/v2/token' failed. is always thrown. I've tried removing the redirect url so it should use the default from my dashboard, and I've tried added 1 and/or dashes to the phone number. The exception is always thrown when I request an access token. I know my account is setup correctly because this works fine in iOS. I feel like I must be missing something obvious. Anyone else run into this issue?
The token api did not recognize my phone number as a valid login parameter. It worked when I used my email instead.

JavaMail API android application cannot be able to show sender's name

I've been working on feedback form. It consists of name,email and feedback EditTexts.
I'm making the android application for the user to send the feedback using JavaMail API. Now My android is working fine as the user inputs the details in the fore mentioned space and sends the feedback to the mail which is given as Recipients address(i.e., My gmail account).
Problem : I have tried my level best to get the data(the mail id of the user)from the EditText input for email id of the user and to show it on the gmail account account as sent by USER_NAME but after numerous efforts it is giving me same data i.e., The mail is sent by me only no user id is shown
I'm providing you the screen shot of my mail account
My gmail inbox where I received the mail from the user
As you can see there are two mails right now, the one which is unread it doesn't show the email id of the user rather shows me because the mail comes from the username provided in the recipient's address
I've done researches on it:
Used setFrom(new InternetAddress(email)) here email is the edittext input of the email by the sender.
went to many searches but none of the ideas are working here (couldn't provide the links as I don't have much reputations to post more than two links. I've two photos which is also in a link form as stackoverflow is not allowing me to uplaod it directly.)
Did this also setFrom(new InternetAddress("Sender"+"<"+email+">")) result is showing Sender
What I ended up doing is : setFrom(new InternetAddress(Config.EMAIL,email));
and got succeeded somehow in showing the email in the email address in the section. The picture will give you better idea
Mail when opened
but still result is same the inbox is repeatedly showing me the sender's email as mine.
Here's mycode:
1. SendMail.java
public class SendMail extends AsyncTask<Void,Void,Void> {
//Declaring Variables
private Context context;
private Session session;
//Information to send email
private String name;
private String email;
private String subject;
private String feedback;
private ProgressDialog progressDialog;
public SendMail(Context context,String name, String email,String subject, String feedback) {
this.context = context;
this.name = name;
this.email = email;
this.subject = subject;
this.feedback = feedback;
}
#Override
protected void onPreExecute() {
super.onPreExecute();
//Showing progress dialog while sending email
progressDialog = ProgressDialog.show(context,"Sending feedback","Please wait...",false,false);
}
#Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
//Dismissing the progress dialog
progressDialog.dismiss();
//Showing a success message
Toast.makeText(context,"Feedback Sent", Toast.LENGTH_LONG).show();
}
#Override
protected Void doInBackground(Void... voids) {
//creating properties
Properties properties = new Properties();
//Configuring properties for gmail
//If you are not using gmail you may need to change the values
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");
//creating new session
session = Session.getDefaultInstance(properties, new Authenticator() {
#Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(Config.EMAIL, Config.PASSWORD);
}
});
InternetAddress fromAddress = null;
try {
fromAddress = new InternetAddress(Config.EMAIL,email);
}catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
try {
//Creating MimeMessage object
MimeMessage mimeMessage = new MimeMessage(session);
//Setting sender address
mimeMessage.setFrom(fromAddress);
//Adding receiver
mimeMessage.addRecipient(Message.RecipientType.TO, new InternetAddress(Config.EMAIL));
//Adding subject
mimeMessage.setSubject(subject);
//Adding Message
mimeMessage.setText("Name:"+ " "+ name + "\n" + "Email:" + " " + email + "\n" +
"Feedback" + " " + feedback);
//Sending email
Transport.send(mimeMessage);
} catch (MessagingException e) {
Log.e("SendMail", e.getMessage(), e);
}
return null;
}
}
2.Config.java
public class Config {
public static final String EMAIL = "recipient_email#gmail.com";
public static final String PASSWORD ="password";
}
3. Feedback.java
private void sendEmail() {
//getting content from email
String subject = string.toString();
String email = inputEmail.getText().toString().trim();
String name = inputName.getText().toString().trim();
String feedback = inputFeedback.getText().toString().trim();
//Creating SendMail object
SendMail sendMail = new SendMail(getContext(),name,email,subject,feedback);
//Executing sendmail to send email
sendMail.execute();
}
Please suggest me some way so that I can reach up to my destination. Thanking you in advance.
If your application is using your credentials to login to Gmail, Gmail is not going to let you "fake" the From address to be some other user.
Also, you really don't want to embed your Gmail password in the application.
A much better approach is to create a web application that accepts the input for the feedback form and sends the email. The Android application can post the form data to the web application, which will compose the message and send it, adding the user's email address as another header field or as data in the body of the message. That makes sure your Gmail password is safe on your server, not in the application that users can access.

Make Mail screen Text Field Editable false in android

Hello Friends i wan to make editable false in all edittext when i send mail by my application
programmatically
Intent emailIntent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts("mailto","test#mymail.com, null));
emailIntent.putExtra(Intent.EXTRA_SUBJECT, "My Subject");
emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, Message);
startActivity(Intent.createChooser(emailIntent, "Send email..."));
finish();
friends my question is i want Text Subject Feild and Text/Body feild Read Only user can not edited it's value so how can i make it any idae?
your passing a intent to android device to handle mailing function specifying to handle it once intent is passed it will be handle by gmail or any other email client installed in your phone once they handle and get your data that is subject and message your application will be in paused state i mean to say you don't have control over other applications that handles your data.
create your mail handling and sending mail instead of passing it as intent
set editable false works only when you have those edit fields inside your application not in other activities that are started by your intent
You can create you own email sending activity without passing intent to any native email client app.There you can easily disable the editText for message and subject. The code for sending email is:
public class SendMail{
public static void main(String[] args) {
final String username = "username#gmail.com";
final String password = "password";
Properties props = new Properties();
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.host", "smtp.gmail.com");
props.put("mail.smtp.port", "587");
Session session = Session.getInstance(props,
new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
});
try {
Message message = new MimeMessage(session);
message.setFrom(new InternetAddress("from-email#gmail.com"));
message.setRecipients(Message.RecipientType.TO,
InternetAddress.parse("to-email#gmail.com"));
message.setSubject("Testing Subject");
message.setText("Dear Mail Crawler,"
+ "\n\n No spam to my email, please!");
Transport.send(message);
System.out.println("Done");
} catch (MessagingException e) {
throw new RuntimeException(e);
}
}
}
taken from here
Basically if you choose email chooser of android to send an email you lost all the control over this intent. So overriding these behaviour is very hard and might be not possible. So overcoming on this issue you can follow this link Sending Email in Android using JavaMail API without using the default/built-in app.
You can find how to use the javamail Api as in the above link.
Now you can make your own layout for mail activity. And you can use
youreditetxtWhichyouwanttodisable.setEditable(false);
This might be useful.

How to keep javamail connection in android?

I used javamail api in my android project and parse String in "mail subject" and "mail content". In my gmail there are many mail boxes such as travel, job, photo.... I need go through all mail boxes and search mails in my conditions. But I found when call getData() it will login gmail and make connection again.
My question are
1.How can it Keep connection in android?
2.How can I search all the mail boxes in the same time?
Thanks for help.
private String downloadUrl () throws IOException {
receiveMail("username", "password");
return null;
}
receiveMail part
private static List<Message> receiveMail(String username, String Password) {
try {
Properties props = System.getProperties();
props.setProperty("mail.store.protocol", IMAPS_PROTOCOL);
Session session = Session.getDefaultInstance(props, null );
session.setDebug(false);
final Store store = session.getStore(IMAPS_PROTOCOL);
store.connect(IMAPS_MAIL_HOTS , username, Password);
getData(store, "travel");
getData(store, "job");
getData(store, "photo");
} catch(Exception ex) {
ex.printStackTrace();
}
return null;
}
If you want to reuse a single connection for each folder, you need to be sure to close the folder before opening the next folder.

how to send email without user intervation and without using javamail by default gmail id in android?

Hi I am creating an app(consider it as a security app) in which on clicking on button the contact list should open and by selecting a contact the mail should directly get sent to selected contact's mail address without showing pop up for asking "choose email client". i.e. I want to send mail in background.
for example If you are aware of Pandora Radio app. In that you can share the station by selecting email id from contact which sends email to selected contact in background by using default email id of adnroid phone and shows a toast "station shared" after success.
I don't want to ask user for its gmail password or anything else .
I managed to get even android phone default email id and by selecting contact I can get email id of selected contact
I dont't want to use JavaMail beacuse it needs hardcoded email id and password.
I did a lot of search but did not found solution as I want.
please suggest any solution.
Sorry, that's not supported in android SDK.
Try this on android 4+
public synchronized void sendMail(final String subject, final String body,
final String sender, final String recipients) throws Exception {
try {
Thread mailThread = new Thread() {
#Override
public void run() {
try {
MimeMessage message = new MimeMessage(session);
DataHandler handler = new DataHandler(
new ByteArrayDataSource(body.getBytes(),
"text/plain"));
message.setSender(new InternetAddress(sender));
message.setSubject(subject);
message.setDataHandler(handler);
if (recipients.indexOf(',') > 0)
message.setRecipients(Message.RecipientType.TO,
InternetAddress.parse(recipients));
else
message.setRecipient(Message.RecipientType.TO,
new InternetAddress(recipients));
Transport.send(message);
} catch (Exception e) {
}
}
};
mailThread.start();
} catch (Exception ex) {
}
}

Categories

Resources