Detect E-Mail Conversation with Exchange Web Services - web-services

Is it possible to detect for incoming mails, if they belong a to preceding e-mail conversation?

If the message has been replied to using a Microsoft email client it should have the PidTagInReplyToId property set with the id of the message replied to. This will enable you to build up a message chain from each reply to the source email.
Otherwise you'll have to rely on the "Re:" prefix in subjects and common subject names. You could also do something clever regarding who has been sent an email (in case of common subjects) or utilising the previous message body in the new email - though that obviously cannot be relied upon.

Related

Django+Twilio: How can I display inside my django app the sms I sent/received using twilio? (Architecture question)

I have a high level architecture question:
I have a django app where users can send out sms to their contacts (telephone numbers, not users of my app). I am trying to implement a system where if someone replies to a specific text, such reply is forwarded to the user that started the thread.
I implemented an inbound webhooks to receive sms but I am now facing a problem: how do I know which text is a reply replying to? I can't seem to find any type of id in the sms inbound request and I am now starting to fear that this is just impossible.
Any idea? Should I try to use "Conversations"? Would that solve my problem and if so, how should I go about it?
Any suggestion?
Twilio developer evangelist here.
You cannot get the message that a user is replying to, because that doesn't exist in SMS. SMS messages are simply chronological. To test for yourself, open your SMS app and try to reply to the second to last message from someone.
You have a few options to try to tie a reply to a specific message:
Only ever send one message to be replied to at a time. Once you receive a reply to one message (or there's a timeout of some sort), send the next one.
Have the user enter a message identifier in their message. You can then parse the identifier out and associate the reply. This is not very user friendly and they may forget or get the wrong identifier in the message
Use multiple numbers to send the messages. So, if you have an active message you are waiting for a reply to, use a different number to send out the next message. You can then associate the reply based on the number the user replies to.
The last option is my preference since it doesn't affect the messages you can send at any time and doesn't require extra work on behalf of the user. It does require extra work to build a number pool and do the work to associate messages with sending numbers.

mailto: acknowledgement status

My windows C++ app has a HTML form in which I am generating a mailto link. Once the user clicks on it, goes to his/her email client and sends the message, is there a way for me to know in the app if the mailto succeeded?
My gut feeling on the answer is no. In any case checking with the smart folks here.
No. There is no way for you to know if an email reached its recipient - unless you get a mail (or other communication) back from the recipient saying they got it.

Choosing the right place to write logic in a client/api/server solution

I'm currently designing a solution with this pretty standard pattern:
1 web-app using Django (it hosts the one and only DB)
1 client mobile app using AngularJS
This client app uses a REST API (implemented on the Django Server with Tastypie) to get and set data.
As a beginner in these architectures, I'm just asking myself where the logic should go and I'd like to use a simple example case to answer my concerns:
On the mobile client App, a client is asked to subscribe by entering only an email address in a form.
a) If the address is unused, inscription is done (stuff is written on the DB).
b) If the address is used, an error is raised, and the user is asked to try again.
What is the workflow to perform these simple operations?
I'm asking for example how to compare the entered e-mail address in the mobile app with the existing e-mail adresses in my DB:
Should I GET the list of all email adresses from the server, then perform the logic in my client app to state if the entered address already exists ? This seems really a bad way to do because getting lots of elements isn't performant with web services, and client should not be able to see all email adresses.
Should I send the entered e-mail address to the server and let it make the comparison? But if yes, how am I supposed to send the data? As far as I know, PUT/POST are made to write in the DB, not to just send data to server to analyse it and proceed some logic.
I have the feeling I am clearly missing something here...
Thanks a lot for help.
PUT and POST are designed to be used to create and update resources. The server may or may not have a database behind it. It might use a local filesystem, or it might handle anything in memory. It's none of the client's business. It is certainly common to have business logic on most servers which provide APIs.
Use PUT/POST to send up the email address to the server. The server checks to see if the email address is (a) valid, and (b) allowed. If it fails either check, return a relevant response to the client as documented in the RFC. I would go with 403 Forbidden, which indicates a problem with the data being sent up to the server. Use the entity in the response to detail what the problem was with the request.
I had done similar thing in a angular web app,
I have disabled the submit button, and added a check availability button beside the email field.
I have send the email to server and checked if it already exist and got the result to client,
then asked the user to enter an alternate email if not valid or enable the form's submit button
Alternatively
when the user leaves the email field, You can send the email to a service that validates the email, and get the response, and show a message that this email already exist and disable the submit, or enable the submit button otherwise

How do I send email from a user's email address with Django?

I'd like to send email to third parties on behalf of users. The key is for the user's email to show up as the "from:" email.
I've tried using send_mail with the user's email as the from_email, but to no avail. When I used gmail's servers to send the message, the third party sees the EMAIL_HOST_USER as the "from:" email. And when I tried using namecheap's mail server, I got SMTPRecipientsRefused: {u'<to email>': (553, '5.7.1 <from email>: Sender address rejected: not owned by user <EMAIL_HOST_USER>')}.
If possible, I'd like to avoid asking for their password as well.
Short answer: You can't do that.
Back in the old days, mail servers used to be quite relaxed about posting mail whenever anyone asked them to, but then SPAM happened and people realised that it was actually quite important to check that the person sending an email is actually the person whose address appears in the From: header.
There are now several mechanisms in place that make it very difficult to spoof a sender email address. These include:
Sender Policy Framework (SPF): An email validation system that works by placing restrictions on the IP addresses authorised to send email from a particular email address. If you try sending email from an IP address not associated with the legitimate owner of an email address, your mail will be rejected.
DomainKeys Identified Mail (DKIM): A method for confirming that emails claiming to have originated from a particular mail server really did originate from that server.
Mail transfer agent restrictions: These days, most MTAs are configured to only accept emails from people who it already knows. (This is why you're seeing a Sender address rejected: not owned by user error message).
Instead, your best option — essentially your only option — is to put your own email address in the From: header, and send the email from your own mail server. If you want the reply to go to someone else, add a Reply-To: header containing their email address.
If you are using Exchange, you might be able to use a library such as Exchangelib, in which the author seems to have been inspired by some of Django's design decisions. Unfortunately, it does look like you will still need to ask for the user's password. I'm going to be looking into this further later on, and since I use LDAP authentication to the Django project, perhaps there is some way to use that to authenticate to the email server, but I have my skepticism.
See this question:
https://serverfault.com/questions/546255/sending-email-with-python-django-through-microsoft-exchange-imap

SMS gateway for (legally) spoofing SMS messages

I'm looking for an SMS gateway to send text messages over an HTTP interface.
However, some SMS gateways do not allow to set the sender ID, and those who allow it either require the user to prove that the sender ID is his own mobile phone number, or they manually check each sender ID to prevent SMS Spoofing.
For my application, however, I need to be able to set the sender ID as part of the HTTP request. Depending on the number of users, I might have thousands of different sender IDs, and I cannot authenticate or review them separately.
The purpose of my application is completely legal, as is the reason why I need to be able to send spoofed text messages.
Edit:
It seems that bulksms.com does allow what I need as soon as they trust the user to some extent. If you know of other gateways which allow setting the sender ID dynamically, please let me know.
It seems like the gateway you suggsted does let you set the sender ID. From their FAQ :
Is it possible to use the "sender id" parameter?
Setting of the Sender ID can be enabled after your initial credits
purchase. Sender Id requests are processed manually and thus we
suggest you request a sender Id change within office hours for a swift
response. Giving you full control of your sender ID, is only available
after you have been a regular and trusted user. Sender Id can also be
set via http request and email to SMS.
I finally settled with Routo Messaging, and the experience so far is very promising. They let you set the sender ID as soon as you have made your first payment, and if you describe them the reason you need it, they let you set the sender ID even on the free test messages you get when signing up on their website.
Disclaimer: I am not affiliated with Routo.
Fogmo offer an API for this very purpose.