SendGrid SMTP categories as Custom headers in phpmailer - phpmailer

How do you add SendGrid categories as customer headers using phpmailer's SMTP class?
Iv done some research and I thought this would work - but it doesn't. I'm not at all familiar with email headers and need to be pointed in the right direction.
$mail->addCustomHeader('category', "site #1");
All other mail is working fine - this method of declaring a category isn't being recognised in SendGrid. Maybe it's not even possible?

For anyone else wondering how to do this, I recently had to solve this issue. I did this by adding in the custom header as a complete string:
$mail->addCustomHeader("X-SMTPAPI: " . $sgheaders);
And I used json_encode on an array of my chosen custom headers:
$sgheaders = json_encode(
array(
"category" => array("Customer: Chosen Quote")
));
I believe you can add in as many headers as you want, so long as you do it as an associative array.

Related

Docusign API: Searching for a given Envelope/Envelopes using Custom Field

How do we compose a get url to get an envelope or envelopes that contain a given custom field. I tried to compose a get url as one shown below but not getting the desired results (i tried to follow the documentation here -> https://developers.docusign.com/esign-rest-api/reference/Envelopes/Envelopes/listStatusChanges but I think i am not passing the custom field to the query string correctly
https://demo.docusign.net/restapi/v2.1/accounts/ACCOUNT_ID_NUMBER/envelopes?from_date=2019-12-05&folder_types=sentitems&status=completed&custom_field=[SignerEmail=john.doe#email.com]
You're using the right API call. Try it without the square brackets and encode the value.
Eg
... &custom_field=SignerEmail%3Djohn.doe%40email.com
The above is untested. If it doesn't work, we'll dig into it further
Important: are you trying to find envelopes that have a custm_envelop_field (metadata) that you created and you named "SignerEmail"?? If so, the the above is the way to go.
If you're looking for envelopes where a signing recipient's email is john#doe.com, try the general search as Inbar suggests. If it doesn't work, you may need another tactic.
Suggest you read here:
https://developers.docusign.com/esign-rest-api/guides/concepts/envelopes/search
the parameter is called search_text and would search everything including custom fields. There's no need to separately specify custom fields.
Something like this:
https://demo.docusign.net/restapi/v2.1/accounts/ACCOUNT_ID_NUMBER/envelopes?search_text=[SignerEmail=john.doe#email.com]

What is the signature of the brand callback urls?

I can't find any documentation on what the signature of the brand callback urls (for a PowerForm) are. For example, is it just a GET request to the url, or is it maybe a POST with information included in the body as well?
Update:
From testing using their sandbox environment, the callbacks aren't callbacks, they are redirects, so GETs with query params. The query params are:
{
env: <Envelope ID>,
pf: <PowerForm ID>,
r: <someUUID>,
}
env seems to be the Envelope ID from the PowerForm, and pf matched the id of the PowerForm, so that's some progress. Not sure what r is, though I imagine it's the UUID of the completed form (revision maybe). Still would love to see some documentation actually explaining the signature in detail.
With some additional research through the app and sandbox, and looking at the data my server has been getting, this is the base signature (assuming you haven't added additional query params when you define the url:
GET <specifiedBrandUrl>?env=<uuid>&pf=<uuid>&r=<uuid>
Where:
env is the Envelope ID of the PowerForm
pf is the PowerForm ID
r is the Recipient ID
I was able to determine env by looking at the "Form Data" option in the template. I was able to determine pf since that matches the PowerFormId query param in the link to the PowerForm. I was able to determine r by downloading the CSV of the PowerForm and noticed that the id I was getting matched the RecipientId in the CSV.
#DocuSign. Please add the above to your docs. It took me days to figure that out. It should have taken 30 seconds.

How does a Gmail message Id or ThreadId map to the new Gmail UI?

Edit: addressing the first comment below and for clarity, this isn't a code question. The question is simply:
What do I put into the URI querystring of the new Gmail UI to view a draft message created by the Gmail API?
Despite this not really being a code question, I'm asking on Stack Overflow as it's Google's preferred platform for Gmail API questions.
--
If I view a draft message in the new Gmail UI, the URI is something like this:
https://mail.google.com/mail/u/1/?zx=iij9apqgzdf4#drafts?compose=jrjtXSqXwlFGnSGCQgDCdnHGVFdlpFMgzsCNgpQstQLxdLCMkjKstBmWZkCmjhWTQnpsZCJF
I can't see any way to create such a link from the Id or ThreadId of a message created via the Gmail API.
Previously, one could do this:
https://mail.google.com/mail/u/1/?zx=ov61dxfbrcga#drafts?compose=1631caae9dbb074d
where the value of "compose" is the Id.
How can the same thing be accomplished in the new UI?
I've been encountering the same problem and have had some success in this problem, as well as some issues I still can't get past.
Good news: The new compose parameter format is some kind of "base40" encoding. I searched the Gmail source for a restricted alphabet string, and found and deobfuscated the bit of code doing this encoding/decoding: https://gist.github.com/danrouse/52212f0de2fbfe33cfc56583f20ccb74
This code includes an encode and decode function which should work for Gmail-format query parameters.
Bad news: The values that it is encoding to open draft emails do not appear to be available using the Gmail API. Specifically, they look like this:
thread-f:NEW_THREAD_ID+msg-a:DRAFT_ID -- while the draft ID is the same as it was before, the Thread ID does not appear to match any of the IDs that the Gmail API returns.
Interestingly, if you inspect the subject row in the Gmail UI, it has dataset attributes including all of both the old format and new format IDs - but it's still unclear how to get the new ones programatically.
Thanks to #frank-szilinski - he pointed out that the old format is now translated. I.e. this now works again:
https://mail.google.com/mail/ca/u/1/#drafts/1661237c4db71ace
It doesn't seem to work when the Gmail tab isn't already open, however.
Building on #kremonte gist, and #chris-wood comments, I made a rails gem that correctly creates the open-the-draft-inside-gmail URL.
It's here - https://github.com/GoodMeasuresLLC/gmail_compose_encoder
It's for the use case of "my code created a draft (prepopulated with some text, of course) and now I want to open the draft in compose mode so that my user can review it before hitting "send".
How to get the URL for a draft
If, for example you use a list request from which you get your draft objects:
{
"id": string,
"message": {
object (Message)
}
}
You can take this id and put it into a URL in this format:
mail.google.com/mail/#inbox?compose=[id]
Eg.
mail.google.com/mail/#inbox?compose=3doinm3d08932d
This will open up GMail with the relevant draft open.
I was struggling because I wanted it to work with multiple accounts. However the authuser parameter did not help.
Inserting the email address instead of the integer after the u/ component solved the problem.
https://mail.google.com/mail/u/{email_address}/#drafts?compose={message_id}
The message id is the one provided by the API.

How to extract the url from an embedded link in an email

I've got an email processing agent. It copies the body of the email into a document's rich text field. If there are any embedded links in the email I want to process that embedded link and extract the url. I started playing around with MIMEEntity but nothing came of it. Any ideas?
thanks
clem
================
Hi Rich,
Well here's a more robust explanation of what's going on. I have several Notes apps which deal with email correspondence. An email comes in, a Notes document is created with some meta data (system generated ID, user's email, name, company, status, etc). The email body is added to a 'correspondence' rich text field of the created Notes doc. The app allows for someone on our side to follow up on the email (ask a question, provide some feedback, etc). That response from us is pre-pended to the original email. If the original sender responds with some further information, THAT email is also pre-pended. To do this pre-pending, I do
bodyText = EmailDoc.GetFirstItem("Body").text
textFromNotesDoc = CTdoc.GetFirstItem("Issue").text
newTextFromNotesDoc = bodyText + <some stuff> + textFromNotesDoc
I then do a replace.
This worked perfectly fine for years. However, recently users have been sending in emails containing embedded links. Of course anything like that is lost when I do the NotesDocument.GetFirstItem().Text. So I've been trying to think of a way to capture the embedded link. The other day it occurred to me that if I could read the html, I could find and extract the url and simply add it to text. I thought maybe using NotesMIMEEntity would allow me to read through the body field and find the url but that's not working.
Clem
The solution is to NOT NotesDocument.GetFirstItem().Text. Just simply take the email coming in and prepend the body field to the discussion RT field. I add tags to the email going out so that I know if the person responding included the previous conversation. That took a little work to figure out but by using NotesRichTextNavigator and related classes, I'm able to deal with that.
clem

Force emails not to be grouped into conversations

My website sends emails to me with the same subject and they are being grouped into conversations even if I delete old ones (Mail, Gmail). I know I can change the subject to prevent this, but is there a header or something else that can be added to do this without forcing unique subject lines?
On the top of my head, there are two methods to avoid threading:
set the SMTP header X-Entity-Ref-ID with any value. This is what Google+ notifications do.
change the sender email (you can use From: info+randomstring#example.com). This is what Facebook notifications do.
The threading will be made if you force it with Reference or Reply-To.
The situation has changed since 2019.
I found a solution in https://workspaceupdates.googleblog.com/2019/03/threading-changes-in-gmail-conversation-view.html.
Setting a header of the form References: <---uuid---#youremailproviderhere.com>, with a unique UUID for each email is enough to solve this.
Tested a few times today and I confirm it works.

Resources