Send Mail : Intent.EXTRA_EMAIL does not work - email

I get no error but the mail-to will not be showed ! it stays empty
public void Send_Mail(View view) {
String txt_context = "My comment about the App : \n The App is good but does not support v3";
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setData(Uri.parse("mailto:"));
intent.setType("message/rfc822"); //
intent.putExtra(Intent.EXTRA_EMAIL,"receiver#gmail.com"); // **this will not displayed** """
intent.putExtra(Intent.EXTRA_SUBJECT,"Comment about the APP");
intent.putExtra(Intent.EXTRA_TEXT,txt_context);
startActivity(intent);

I know this post is old but I encountered the same issue and I found the solution (in the official documentation):
As explained, Intent.EXTRA_EMAIL is:
A String[] holding e-mail addresses that should be delivered to.
So to fix your issue, instead of:
intent.putExtra(Intent.EXTRA_EMAIL,"receiver#gmail.com");
do:
intent.putExtra(Intent.EXTRA_EMAIL, new String[]{"receiver#gmail.com"});

This is how you correctly send an email via an intent. The URI arguments are required if not you will have problems getting Gmail to receive your emails.
Intent send = new Intent(Intent.ACTION_SENDTO);
String uriText = "mailto:" + Uri.encode("email#gmail.com") +
"?subject=" + Uri.encode("the subject") +
"&body=" + Uri.encode("the body of the message");
Uri uri = Uri.parse(uriText);
send.setData(uri);
startActivity(Intent.createChooser(send, "Send mail..."));

The disadvantage of doing it your way is that it gives gmail issues retrieving the address to send the mail to, and so many apps support message/rfc822so your user can get drowned in different clients. I advice you use
Intent sendMail = new Intent(Intent.ACTION_SENDTO);
String uriText = "mailto:" + Uri.encode("example#gmail.com") +
"?subject=" + Uri.encode("subject") +
"&body=" + Uri.encode("body);
Uri uri = Uri.parse(uriText);
sendMail.setData(uri);
startActivity(Intent.createChooser(sendMail, "Choose a client"));
as this is a bit more specific than specifying with intent.setType("message/rfc822"); and solves the issue with gmail. Good Luck.

For kotlin
The emial must be an arrayOf, nos just a string.
intent.putExtra(Intent.EXTRA_EMAIL, arrayOf("receiber#gmail.com"))

Related

How to insert an emoji into an email sent with GmailApp?

I have a GAS script that sends automated emails and would like to include a couple of emojis. I've tried using shortcodes and copying/pasting, but nothing so far seems to have worked. Just wanted to see if there was anything I was missing.
Edit: Here's the code:
var title = rowData.publicationTitle;
var journal = rowData.journalTitle;
var url = rowData.publicationUrl;
//Emoji goes here in the body:
var body = "Hi " + firstName + "!<br><br>I noticed your article <a href='" + url + "'>“" + title + "”</a> was recently published in <i>" + journal + "</i>. Congratulations! This is just a friendly reminder to please upload your original document and a PDF version to our publications app when you have time.<br><br>To upload your publication, you can <a href='http://support.cpes.vt.edu/publishing'>click here</a>.<br><br>Thanks!<br><br>🤖 CB<br><br><hr style='background-color: #d8d8d8; border: 0 none; color: #d8d8d8; height: 1px;'><span style='font-size:12px'><b>CPES Publications Reminders</b> | <a href='mailto:leshutt#vt.edu' style='text-decoration:none'>Feedback</a> | <a href='http://support.cpes.vt.edu/publishing' style='text-decoration:none;'>Publication uploads</a></span>";
var emailSubject = "Just a reminder to upload your article!";
var me = Session.getActiveUser().getEmail();
var aliases = GmailApp.getAliases();
if (emailStatus == "Pending" && emailData !== "No emails found") {
GmailApp.sendEmail(email, emailSubject, body, {
from: aliases[2],
name: "CPES Bot",
htmlBody: body
});
}
I've noticed that sending a star ("⭐") works, but the normal smiley ("😊") shows up as a black-and-white, Unicode-esque icon and everything else I've tried are question marks. Can you only use emojis up to a certain Unicode release?
You want to send an email with HTML body including the emoji. If my understanding is correct, how about this modification?
About GmailApp and MailApp :
Unfortunately, GmailApp cannot use the recent emoji characters. At GmailApp
emoji less than Unicode 5.2 can be used for this situation.
emoji more than Unicode 6.0 can NOT be used for this situation.
MailApp can use all versions of emoji.
"⭐" is Unicode 5.1. But "😊" is Unicode 6.0. By this, in your script using GmailApp, you can see the former, but you cannot see the latter. At a sample script of Michele Pisani, the latter is sent using MailApp. So the character is not broken. "🤖" is Unicode 8.0.
Modification points :
So in the case of your script, the modification points are as follows.
Use MailApp instead of GmailApp.
OR
Use Gmail API.
From your comments to Michele Pisani, I worry about that MailApp might not work for your situation. So I would like to also propose the method using Gmail API.
1. Modified your script
Please modify as follows.
From :
GmailApp.sendEmail(email, emailSubject, body, {
To :
MailApp.sendEmail(email, emailSubject, body, {
2. Using Gmail API
In order to use this, please enable Gmail API at Advanced Google Services and API console as follows.
Enable Gmail API v1 at Advanced Google Services
On script editor
Resources -> Advanced Google Services
Turn on Gmail API v1
Enable Gmail API at API console
On script editor
Resources -> Cloud Platform project
View API console
At Getting started, click Enable APIs and get credentials like keys.
At left side, click Library.
At Search for APIs & services, input "Gmail". And click Gmail API.
Click Enable button.
If API has already been enabled, please don't turn off.
If now you are opening the script editor with the script for using Gmail API, you can enable Gmail API for the project by accessing this URL https://console.cloud.google.com/apis/api/gmail.googleapis.com/overview
Sample script :
function convert(email, aliase, emailSubject, body) {
body = Utilities.base64Encode(body, Utilities.Charset.UTF_8);
var boundary = "boundaryboundary";
var mailData = [
"MIME-Version: 1.0",
"To: " + email,
"From: CPES Bot <" + aliase + ">",
"Subject: " + emailSubject,
"Content-Type: multipart/alternative; boundary=" + boundary,
"",
"--" + boundary,
"Content-Type: text/plain; charset=UTF-8",
"",
body,
"",
"--" + boundary,
"Content-Type: text/html; charset=UTF-8",
"Content-Transfer-Encoding: base64",
"",
body,
"",
"--" + boundary,
].join("\r\n");
return Utilities.base64EncodeWebSafe(mailData);
}
function myFunction() {
// Please declare email and firstName.
var title = rowData.publicationTitle;
var journal = rowData.journalTitle;
var url = rowData.publicationUrl;
//Emoji goes here in the body:
var body = "Hi " + firstName + "!<br><br>I noticed your article <a href='" + url + "'>“" + title + "”</a> was recently published in <i>" + journal + "</i>. Congratulations! This is just a friendly reminder to please upload your original document and a PDF version to our publications app when you have time.<br><br>To upload your publication, you can <a href='http://support.cpes.vt.edu/publishing'>click here</a>.<br><br>Thanks!<br><br>🤖 CB<br><br><hr style='background-color: #d8d8d8; border: 0 none; color: #d8d8d8; height: 1px;'><span style='font-size:12px'><b>CPES Publications Reminders</b> | <a href='mailto:leshutt#vt.edu' style='text-decoration:none'>Feedback</a> | <a href='http://support.cpes.vt.edu/publishing' style='text-decoration:none;'>Publication uploads</a></span>";
var emailSubject = "Just a reminder to upload your article!";
var me = Session.getActiveUser().getEmail();
var aliases = GmailApp.getAliases();
if (emailStatus == "Pending" && emailData !== "No emails found"){
// Added script
var raw = convert(email, aliases[2], emailSubject, body);
Gmail.Users.Messages.send({raw: raw}, "me");
}
}
Note :
When you use this sample, Please declare email and firstName.
Please run myFunction().
References :
Emojipedia
Advanced Google Services
Gmail API
If I misunderstand your question, I'm sorry.
I tried to copy the emoji (https://www.emojicopy.com/) and paste it directly into the script editor:
and after sending the email I received it in my mailbox:
Edit:
Be careful that some emoji are one character length (like the star) but other are 2 characters (like the smile) for those with 2 characters you can think of writing immediately after the smile but instead you are writing inside the smile so you break it therefore turns in question mark.
If you try to run this code, you will see that the first has length 2 and the second one has length 1:
If you try to move the pointer (in the apps script editor) on those 2 emoticons, from before to after the emoticon, you will see that in the case of the star just one step but for the smile you need 2 steps.
The easiest complete answer that also works with SMS recipients is this:
function testNewMail() {
MailApp.sendEmail({
to: "yourphonenumbergoeshere#mymetropcs.com",
subject: "Logos",
htmlBody: "😊 hi todd happy day"
});
}
Use code points (💎) in the value of your cell and send your message as HTML:
var sheet = SpreadsheetApp.getActiveSheet();
var value = sheet.getRange("A1").getValue();
GmailApp.sendEmail(
"recipient#example.com",
"subject",
"",
{
from: "sender#example.com",
htmlBody: value
}
);

Google Apps Script lost access rights

I have a Google Sheets script that emails a notification to a group of people when a form is submitted. It worked beautifully for months. Now it seems to have lost the access rights to send the emails. November 6, 2015 was the last time responses were submitted and successfully emailed. No more responses were submitted until yesterday (Sept 21, 2016) and it no longer has rights to send email. I verified that it is not listed in my Google account's security section under my "apps connected to your account".
I tried to re-authorize it by deleting all the triggers, saving and closing out the script. Then I reopened it and added the triggers back in. It didn't ask for a new authorization, but it still won't send emails.
Does anyone know why it might lose access rights? Does it get removed if it's not used periodically?
How do I force it to refresh/renew rights? Or do I just have to delete the script entirely and recreate a fresh copy?
This is just one of many similar scripts that I have so, I need to figure out how to make them work (and keep them working). Searching around I couldn't find anything except how to intentionally revoke access rights.
Here is my code so you can see what it's trying to do (I'm testing it with just my email address right now). I will admit I don't know a lot about programming scripts, so it may not be very pretty.
Thanks for any help!
function sendFormByEmail(e)
{
// Remember to replace this email address with your own email address
var email = "bjwarneke#gmail.com";
var quiz = "02.8-JLOT-D Drop-In";
var filename = "02-JLOT Exam Grading Instructions";
var s = SpreadsheetApp.getActiveSheet();
var headers = s.getRange(1,1,1,s.getLastColumn()).getValues()[0];
var message = "Time for someone to go grade a quiz from me!" + "<br>";
var replyto = e.namedValues[headers[1]].toString();
var subject = 'Quiz: ' + replyto;
//message += headers[1] + ': '+ e.namedValues[headers[1]].toString() + "\n";
//message += headers[0] + ': '+ e.namedValues[headers[0]].toString() + "\n";
message += headers[1] + ': '+ e.namedValues[headers[1]].toString() + "<br>";
message += headers[0] + ': '+ e.namedValues[headers[0]].toString() + "<br><br>";
message += quiz + "<br>";
message += ''+filename+'<br>';
// The variable e holds all the form values in an array.
// Loop through the array and append values to the body.
//for(var i in headers)
//message += headers[i] + ': '+ e.namedValues[headers[i]].toString() + "\n\n";
// Insert variables from the spreadsheet into the subject.
// In this case, I wanted the new hire's name and start date as part of the
// email subject. These are the 3rd and 16th columns in my form.
// This creates an email subject like "New Hire: Jane Doe - starts 4/23/2013"
//subject += e.namedValues[headers[2]].toString() + " - starts " + e.namedValues[headers[15]].toString();
// Send the email
MailApp.sendEmail(email, subject, message, {htmlBody:message, name:"Quiz", replyTo:replyto});
// Based off of a script originally posted by Amit Agarwal - www.labnol.org
// Credit to Henrique Abreu for fixing the sort order
}
Do you have a Gmail account associated with your Google Account? The MailApp service will only work if you have Gmail enabled for your account.

how to get url from link inside the notification email

I am looking to write a script with web driver where I need to wait for the notification email and then need to get the URL from link of that email.
Pattern for recognising a URL (based off RFC 3986)
private static final Pattern urlPattern = Pattern.compile(
"(?:^|[\\W])((ht|f)tp(s?):\\/\\/|www\\.)"
+ "(([\\w\\-]+\\.){1,}?([\\w\\-.~]+\\/?)*"
+ "[\\p{Alnum}.,%_=?&#\\-+()\\[\\]\\*$~#!:/{};']*)",
Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
//Usage: email content goes as input here..
Matcher matcher = urlPattern.matcher("foo bar http://example.com baz");
while (matcher.find()) {
int matchOffsetStart = matcher.start(1);
int matchOffsetEnd = matcher.end();
// now you have the offsets of a URL match
}
UPDATE:
If you want to read message header like FROM and so on, I would suggest to use Mime4J
Message msg = new Message(new FileInputStream("mime.msg"));
msg.getFrom() would give you from. Similarly you can extract whatever you want.
Refer for more details here

How to invoke mailto in AngularJS controller

I'm implementing a simple email feedback feature in angular app. The mail has predefined mail subject and content template. The angular controller need bring up client email client (like invoke "mailto:foo#bar.com") and fulfill predefined subject, content template. Any body know how to implement it?
Inject $window and use $window.open() method.
Inside controller define...
$scope.sendMail = function(emailId,subject,message){
$window.open("mailto:"+ emailId + "?subject=" + subject+"&body="+message,"_self");
};
and call it like...
$scope.sendMail("foo#bar.com","Mail Subject","Mail Body Message");
use $window.location:
$window.location = "mailto:..."
This should open new tab for Google mail or email client, depending on users settings.
In Angular JS: Concatenate string in controller like so:
$scope.mailLink = "mailto:" + $scope.emailId + "?subject=" + $scope.Subject + '&body=' + $scope.bodyText;
html
<a ng-href="{{mailLink}}" target="_blank">Send</a>
location.href works too!
$scope.email = function(item){
location.href= 'mailto:' + $scope.allemails (array) + '?subject=Subject you want';
}
Note: If you have an array in $scope.allemails, and you will use method .join(', ') - thunderbringer email client will not recognize this as a collection of emails and it will add a new line of 'To:' to every email from that array.

Update URL in Email body dynamically in mvc/c#

Working on sending the account verification email in mvc. I created a format for email body such as below and kept in html file inside solution called "EmailFormat.html".
<body>
Dear [Name],
<p>Thanks for registration.To activate your account please follow the link below:</p>
<p> click here for verification </p>
<p>if you are not Name or didn't register on abc.com you can ignore this email.</p>
<p>Regards,</p>
<p>www.abc.com</p>
</body>
I have a c# class handling email send.I get the above mentioned html file as email body and try to replace the [Name] and [url] with actual runtime paramaters.
string name = myclass.FirstName + " " + myclass.LastName;
using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("abc." + "EmailFormat.html"))
using (StreamReader reader = new StreamReader(stream))
{
body = reader.ReadToEnd();
}
body.Replace("[Name]", name);
string url = HttpUtility.HtmlEncode("http://localhost/Controller/Method/uniqueid")
body.Replace("[url]",url);
emailutility.send();//ignore this send code.
I receive email just fine but the problem is the on clicking "click here for verification", it takes me to %5Burl%5D instead of actual url.
Please help.
Thanks
My Bad. it was unable to update the body after body.Replace("[Name]", name);
I changed it to as follows :-
body = body.Replace("[Name]", name);
body = body.Replace("[url]",url);
Resolved!!!!