Emailversand über Intent - gesendet oder nicht gesendet?

  • Antworten:5
MaCo
  • Forum-Beiträge: 5

21.12.2010, 17:28:06 via Website

mit folgendem code verschicke ich eine mail mit anhang:

1Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
2
3emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, recipients);
4 emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, model.getEmailBetreff());
5 emailIntent.putExtra(Intent.EXTRA_CC, cc);
6 emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, model.getEmailBodyText());
7 emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://"+path));
8 emailIntent.setType("text/plain");
9 sw.startActivity(Intent.createChooser(emailIntent, "E-Mail senden..."));


nachdem versenden bzw. nicht versenden einer email-nachricht gelange ich wieder in meine App.

jetzt stellt sich für mich folgende frage: wie kann meine App erfahren, ob ich aus dem email-client meine mail versendet habe oder nicht (z.B. durch manuellen abbruch)?

diese ist wichtig für meine app. je nachdem ob eine mail versendet worden ist oder nicht, sollen gewisse operationen durchgeführt werden.
bei anwendung der acitivity-methode startActivityForResult(...) erhalte ich immer über onActivityResult den Wert RESULT_CANCELED.

kann mir jemand da weiterhelfen?

Antworten
pramkies
  • Forum-Beiträge: 25

10.01.2012, 14:38:14 via Website

hi sorry ich kann die leider nicht helfen ! Aber vielleicht kannst du mir helfen.

ich arbeite an meiner Bachelorarbeit, ich programmiere einen App. Eine Funktion soll sich auf Abrufen von E-Mails befassen.
E-Mails versenden schaffe ich schon ! Aber wie kann ich die E Mails empfangen und eventuell den Inhalt angezeigt bekommen.

Gruß

Antworten
Markus Gu
  • Forum-Beiträge: 2.644

10.01.2012, 15:28:28 via Website

hmm kannst deine email app vielleicht per
startactivityforresult starten und dann das result in onactivityresult abprüfen. könnte mir vorstellen, das funktioniert.

wenn RESULT_OK, dann hat der user ne mail verschickt, wenn RESULT_CANCELLED dann hat der user abgebrochen.

check das mal

swordiApps Blog - Website

Antworten
Felix
  • Forum-Beiträge: 259

10.01.2012, 15:58:35 via Website

Tach!

MaCo
wie kann meine App erfahren, ob ich aus dem email-client meine mail versendet habe oder nicht (z.B. durch manuellen abbruch)?

Ich habe keine Lösung parat, gebe aber zu Bedenken, dass das Senden ein komplexer Vorgang ist. Deine Anwendung liefert die Mail ja nicht direkt beim Empfänger ab sondern übergibt sie einem SMTP-Server, zum Beispiel bei deinem Provider. Wann und mit welchem Ergebnis dieser die Mail weiterleitet, siehst du nicht. Und du siehst auch nicht, ob der empfangende Mailserver die Mail in die Mailbox des Empfängers legen konnte und ob diese überhaupt abgefragt wurde. Das ist wie bei der Post, da kannst du nur wissen, dass der Brief in den Briefkasten geworfen wurde und dann hoffen, dass ihn die Post wie gewünscht zustellen kann. „Gesendet“ kann also nur aussagen, ob der erste Schritt in der Kette erfolgt ist oder nicht. Das kannst du nur dann abkürzen, wenn du selbst die Mail beim zuständigen Empfangs-SMTP-Server ablieferst. Das macht man üblicherweise nicht, weil man sich dann auch selbst um Wiederholungen im Fehlerfall kümmern muss.

Und dann kommt da noch das Android-System ins Spiel. Da schickst du ja die Mail nicht selbst los, sondern beauftragst per Intent jemanden, das zu tun. Wer das ist, kann von deiner Anwendung nicht gesteuert werden. Das ist also irgendein Programm, das irgendwie arbeitet. Wenn man sich dann noch die Beschreibung vom Intent ACTION_SEND ansieht, dann steht dort „Output: Nothing“ – ich denke nicht, dass man da irgendeine verlässliche Information zum Sendestatus erwarten darf.

pramkies
Aber wie kann ich die E Mails empfangen und eventuell den Inhalt angezeigt bekommen.

Mails landen üblicherweise in einer Mailbox. Standard ist, dass der Besitzer der Mailbox sie abfragt, um an neue Post zu gelangen. Und dann gibt es noch diverse nicht standardisierte Push-Verfahren, da weiß der Postfach-Server, wie er ein bestimmtes Gerät vom Besitzer erreichen kann, wenn neue Post eintrudelt. Um dein Ziel zu erreichen, musst du entweder regelmäßig oder nach Benutzeraktion die Mailbox abfragen oder dich in das Push-Verfahren einklinken – welches auch immer das ist.


Felix.

Antworten
pramkies
  • Forum-Beiträge: 25

16.01.2012, 11:56:53 via Website

Felix

Danke !

komme leider mit meiner App ( Bachelorarbeit) nicht weiter.
Ziel: eine Mail und eine SMS empfangen und mit dem Text-Inhalt weiter arbeiten !

SMS empfangen habe ich schon umgesetzt hier einmal der Code:

package com.xxx.doku.pedramramfar;

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.widget.Toast;


public class SMSReceived extends Activity {

protected static final String SMS_EMPFANGEN =
"android.provider.Telephony.SMS_RECEIVED";
protected static final Context SMSReceived = null;
private BroadcastReceiver mReceiver = new BroadcastReceiver() {

@Override
public void onReceive(Context context, Intent intent) {

if (intent.getAction().equals(SMS_EMPFANGEN)) {
// SMS verarbeiten
Bundle extras = intent.getExtras();
if (extras != null) {
Object[] pdus = (Object[]) extras.get("pdus");
SmsMessage[] messages = new SmsMessage[pdus.length];
for (int i = pdus.length; --i >= 0;) {
messages[i] = SmsMessage.createFromPdu(
(byte[]) pdus[i]);
}
for (SmsMessage message : messages) {

if (message.getDisplayMessageBody().equals("Meldung_1")){ // SMS-TEXTinhalt abfragen ob "Meldung_1"

// zum testen !!! Toast ...

Toast.makeText(
SMSReceived.this,
getResources().getString(
R.string.meldung_1
) + "(" + message.getOriginatingAddress() + ")\n"
+ message.getMessageBody(),
Toast.LENGTH_LONG
)
.show();

}

if (message.getDisplayMessageBody().equals("Meldung_2")){ // SMS-TEXTinhalt abfragen ob "Meldung_2"


// zum testen !!! Toast ...

Toast.makeText(
SMSReceived.this,
getResources().getString(
R.string.meldung_2
) + "(" + message.getOriginatingAddress() + ")\n"
+ message.getMessageBody(),
Toast.LENGTH_LONG
)
.show();
}}}}}};

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.sms);
}



@Override
protected void onPause() {
getApplicationContext().unregisterReceiver(mReceiver);
super.onPause();
}

@Override
protected void onResume() {
super.onResume();
getApplicationContext().registerReceiver(
mReceiver,
new IntentFilter(SMS_EMPFANGEN)
);
}
}


Das gleiche möchte ich mit der Mail machen. Mail empfangen und mit dem Testinhalt weiterarbeiten ?
Kann ich mit Cloud to Device Messaging (C2DM) was machen ?

— geändert am 16.01.2012, 11:58:02

Antworten
Felix
  • Forum-Beiträge: 259

16.01.2012, 12:39:56 via Website

Tach!
pramkies
Ziel: eine Mail und eine SMS empfangen und mit dem Text-Inhalt weiter arbeiten !
SMS empfangen habe ich schon umgesetzt …

Bei einer SMS ist das Gerät mit der eingelegten SIM-Karte der direkte Empfänger. Bei E-Mail ist der Empfänger zunächst der für die Domain zuständige SMTP-Server, der die Nachricht üblicherweise in ein Postfach legt. An dieser Stelle fehlt dir jetzt ein Bindeglied, das dein mobiles Gerät von der Nachricht unterrichtet.

Das gleiche möchte ich mit der Mail machen. Mail empfangen und mit dem Testinhalt weiterarbeiten ?
Kann ich mit Cloud to Device Messaging (C2DM) was machen ?

Wenn du dir ein bisschen Einleitung vom C2DM anschaust, wirst du feststellen, dass der C2DM Server von einem Third-Party Application Server benachrichtigt werden muss. Letzterer ist logischerweise der empfangende SMTP-Server. Wenn du Einfluss auf den nehmen kannst, dann steht dem Vorhaben mit C2DM nicht viel im Weg.

Antworten