wake-up-neo.com

Senden von E-Mails in Android mithilfe der JavaMail-API ohne Verwendung der Standard- / integrierten App

Ich versuche, eine Anwendung zum Versenden von E-Mails in Android zu erstellen.

Wenn ich benutze:

Intent emailIntent = new Intent(Android.content.Intent.ACTION_SEND);

Dadurch wird die integrierte Anwendung Android gestartet. Ich versuche, die E-Mail auf Knopfdruck direkt zu senden ohne mit dieser Anwendung.

631

Senden Sie E-Mails in Android mithilfe der JavaMail-API und der Google Mail-Authentifizierung.

Schritte zum Erstellen eines Beispielprojekts:

MailSenderActivity.Java:

public class MailSenderActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        final Button send = (Button) this.findViewById(R.id.send);
        send.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {
                try {   
                    GMailSender sender = new GMailSender("[email protected]", "password");
                    sender.sendMail("This is Subject",   
                            "This is Body",   
                            "[email protected]",   
                            "[email protected]");   
                } catch (Exception e) {   
                    Log.e("SendMail", e.getMessage(), e);   
                } 

            }
        });

    }
}

GMailSender.Java:

public class GMailSender extends javax.mail.Authenticator {   
    private String mailhost = "smtp.gmail.com";   
    private String user;   
    private String password;   
    private Session session;   

    static {   
        Security.addProvider(new com.provider.JSSEProvider());   
    }  

    public GMailSender(String user, String password) {   
        this.user = user;   
        this.password = password;   

        Properties props = new Properties();   
        props.setProperty("mail.transport.protocol", "smtp");   
        props.setProperty("mail.Host", mailhost);   
        props.put("mail.smtp.auth", "true");   
        props.put("mail.smtp.port", "465");   
        props.put("mail.smtp.socketFactory.port", "465");   
        props.put("mail.smtp.socketFactory.class",   
                "javax.net.ssl.SSLSocketFactory");   
        props.put("mail.smtp.socketFactory.fallback", "false");   
        props.setProperty("mail.smtp.quitwait", "false");   

        session = Session.getDefaultInstance(props, this);   
    }   

    protected PasswordAuthentication getPasswordAuthentication() {   
        return new PasswordAuthentication(user, password);   
    }   

    public synchronized void sendMail(String subject, String body, String sender, String recipients) throws Exception {   
        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){

        }
    }   

    public class ByteArrayDataSource implements DataSource {   
        private byte[] data;   
        private String type;   

        public ByteArrayDataSource(byte[] data, String type) {   
            super();   
            this.data = data;   
            this.type = type;   
        }   

        public ByteArrayDataSource(byte[] data) {   
            super();   
            this.data = data;   
        }   

        public void setType(String type) {   
            this.type = type;   
        }   

        public String getContentType() {   
            if (type == null)   
                return "application/octet-stream";   
            else  
                return type;   
        }   

        public InputStream getInputStream() throws IOException {   
            return new ByteArrayInputStream(data);   
        }   

        public String getName() {   
            return "ByteArrayDataSource";   
        }   

        public OutputStream getOutputStream() throws IOException {   
            throw new IOException("Not Supported");   
        }   
    }   
}  

JSSEProvider.Java:

/*
 *  Licensed to the Apache Software Foundation (ASF) under one or more
 *  contributor license agreements.  See the NOTICE file distributed with
 *  this work for additional information regarding copyright ownership.
 *  The ASF licenses this file to You under the Apache License, Version 2.0
 *  (the "License"); you may not use this file except in compliance with
 *  the License.  You may obtain a copy of the License at
 *
 *     http://www.Apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

/**
 * @author Alexander Y. Kleymenov
 * @version $Revision$
 */


import Java.security.AccessController;
import Java.security.Provider;

public final class JSSEProvider extends Provider {

    public JSSEProvider() {
        super("HarmonyJSSE", 1.0, "Harmony JSSE Provider");
        AccessController.doPrivileged(new Java.security.PrivilegedAction<Void>() {
            public Void run() {
                put("SSLContext.TLS",
                        "org.Apache.harmony.xnet.provider.jsse.SSLContextImpl");
                put("Alg.Alias.SSLContext.TLSv1", "TLS");
                put("KeyManagerFactory.X509",
                        "org.Apache.harmony.xnet.provider.jsse.KeyManagerFactoryImpl");
                put("TrustManagerFactory.X509",
                        "org.Apache.harmony.xnet.provider.jsse.TrustManagerFactoryImpl");
                return null;
            }
        });
    }
}

FÜGEN Sie 3 Gläser hinzu, die Sie unter folgendem Link zu Ihrem Projekt Android finden

Klicken Sie hier - So fügen Sie externe Gläser hinz

Und vergessen Sie nicht, diese Zeile in Ihr Manifest aufzunehmen:

<uses-permission Android:name="Android.permission.INTERNET" />

Klicken Sie einfach auf den folgenden Link, um den Kontozugriff für weniger sichere Apps zu ändern https://www.google.com/settings/security/lesssecureapps

Führen Sie das Projekt aus, und überprüfen Sie Ihr Empfänger-E-Mail-Konto für die E-Mail. Prost!

P.S. Und vergessen Sie nicht, dass Sie keinen Netzwerkbetrieb von einer Aktivität in Android aus ausführen können. Aus diesem Grund wird empfohlen, AsyncTask oder IntentService zu verwenden, um Ausnahmen für das Netzwerk im Hauptthread zu vermeiden.

Jar-Dateien: https://code.google.com/archive/p/javamail-Android/

743

Vielen Dank für Ihre wertvollen Informationen. Code funktioniert gut. Ich kann den Anhang auch durch Hinzufügen des folgenden Codes hinzufügen.

private Multipart _multipart; 
_multipart = new MimeMultipart(); 

public void addAttachment(String filename,String subject) throws Exception { 
    BodyPart messageBodyPart = new MimeBodyPart(); 
    DataSource source = new FileDataSource(filename); 
    messageBodyPart.setDataHandler(new DataHandler(source)); 
    messageBodyPart.setFileName(filename); 
    _multipart.addBodyPart(messageBodyPart);

    BodyPart messageBodyPart2 = new MimeBodyPart(); 
    messageBodyPart2.setText(subject); 

    _multipart.addBodyPart(messageBodyPart2); 
} 



message.setContent(_multipart);
69
ashok reddy

Verbindung zum SMTP-Host konnte nicht hergestellt werden: smtp.gmail.com, Port: 465

Fügen Sie diese Zeile in Ihr Manifest ein:

<uses-permission Android:name="Android.permission.INTERNET" />
54
ManuV

Mit der JavaMail-API können Sie Ihre E-Mail-Aufgaben erledigen. Die JavaMail-API ist im JavaEE-Paket verfügbar und die zugehörige JAR-Datei kann heruntergeladen werden. Leider kann es nicht direkt in einer Android -Anwendung verwendet werden, da AWT-Komponenten verwendet werden, die in Android vollständig inkompatibel sind.

Den Android -Port für JavaMail finden Sie an folgendem Speicherort: http://code.google.com/p/javamail-Android/

Fügen Sie die Gläser Ihrer Anwendung hinzu und verwenden Sie die SMTP-Methode

39

Um denjenigen zu helfen, die mit einem SDK-Ziel> 9 eine Netzwerk-Ausnahmebedingung für den Haupt-Thread erhalten. Dies verwendet den obigen Code von droopie, funktioniert aber für alle ähnlich.

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();

StrictMode.setThreadPolicy(policy); 

Android.os.NetworkOnMainThreadException

Sie können AsyncTask wie folgt verwenden

public void onClickMail(View view) {
    new SendEmailAsyncTask().execute();
}

class SendEmailAsyncTask extends AsyncTask <Void, Void, Boolean> {
    Mail m = new Mail("[email protected]", "my password");

    public SendEmailAsyncTask() {
        if (BuildConfig.DEBUG) Log.v(SendEmailAsyncTask.class.getName(), "SendEmailAsyncTask()");
        String[] toArr = { "to [email protected]"};
        m.setTo(toArr);
        m.setFrom("from [email protected]");
        m.setSubject("Email from Android");
        m.setBody("body.");
    }

    @Override
    protected Boolean doInBackground(Void... params) {
        if (BuildConfig.DEBUG) Log.v(SendEmailAsyncTask.class.getName(), "doInBackground()");
        try {
            m.send();
            return true;
        } catch (AuthenticationFailedException e) {
            Log.e(SendEmailAsyncTask.class.getName(), "Bad account details");
            e.printStackTrace();
            return false;
        } catch (MessagingException e) {
            Log.e(SendEmailAsyncTask.class.getName(), m.getTo(null) + "failed");
            e.printStackTrace();
            return false;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
28
Ryan Heitner

100% Arbeitscode mit Demo Mit dieser Antwort können Sie auch mehrere E-Mails senden.

Projekt herunterladen HIER

Schritt 1: Mail, Aktivierung, zusätzliche JAR-Dateien herunterladen und in den Projekt-Bibliotheksordner in Android einfügen Studio. Ich habe einen Screenshot hinzugefügt, siehe unten Download-Link

libs add

Melden Sie sich mit Google Mail ( an, indem Sie Ihre E-Mail ) und EINSCHALTEN -Taste LINK verwenden

Die meisten Leute vergessen diesen Schritt, ich hoffe du wirst es nicht.

Schritt 2: Nach Abschluss dieses Vorgangs. Kopieren Sie diese Klassen und fügen Sie sie in Ihr Projekt ein.

GMail.Java

_import Android.util.Log;

import Java.io.UnsupportedEncodingException;
import Java.util.List;
import Java.util.Properties;

import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class GMail {

    final String emailPort = "587";// gmail's smtp port
    final String smtpAuth = "true";
    final String starttls = "true";
    final String emailHost = "smtp.gmail.com";


    String fromEmail;
    String fromPassword;
    List<String> toEmailList;
    String emailSubject;
    String emailBody;

    Properties emailProperties;
    Session mailSession;
    MimeMessage emailMessage;

    public GMail() {

    }

    public GMail(String fromEmail, String fromPassword,
            List<String> toEmailList, String emailSubject, String emailBody) {
        this.fromEmail = fromEmail;
        this.fromPassword = fromPassword;
        this.toEmailList = toEmailList;
        this.emailSubject = emailSubject;
        this.emailBody = emailBody;

        emailProperties = System.getProperties();
        emailProperties.put("mail.smtp.port", emailPort);
        emailProperties.put("mail.smtp.auth", smtpAuth);
        emailProperties.put("mail.smtp.starttls.enable", starttls);
        Log.i("GMail", "Mail server properties set.");
    }

    public MimeMessage createEmailMessage() throws AddressException,
            MessagingException, UnsupportedEncodingException {

        mailSession = Session.getDefaultInstance(emailProperties, null);
        emailMessage = new MimeMessage(mailSession);

        emailMessage.setFrom(new InternetAddress(fromEmail, fromEmail));
        for (String toEmail : toEmailList) {
            Log.i("GMail", "toEmail: " + toEmail);
            emailMessage.addRecipient(Message.RecipientType.TO,
                    new InternetAddress(toEmail));
        }

        emailMessage.setSubject(emailSubject);
        emailMessage.setContent(emailBody, "text/html");// for a html email
        // emailMessage.setText(emailBody);// for a text email
        Log.i("GMail", "Email Message created.");
        return emailMessage;
    }

    public void sendEmail() throws AddressException, MessagingException {

        Transport transport = mailSession.getTransport("smtp");
        transport.connect(emailHost, fromEmail, fromPassword);
        Log.i("GMail", "allrecipients: " + emailMessage.getAllRecipients());
        transport.sendMessage(emailMessage, emailMessage.getAllRecipients());
        transport.close();
        Log.i("GMail", "Email sent successfully.");
    }

}
_

SendMailTask.Java

_import Android.app.Activity;
import Android.app.ProgressDialog;
import Android.os.AsyncTask;
import Android.util.Log;

import Java.util.List;

public class SendMailTask extends AsyncTask {

    private ProgressDialog statusDialog;
    private Activity sendMailActivity;

    public SendMailTask(Activity activity) {
        sendMailActivity = activity;

    }

    protected void onPreExecute() {
        statusDialog = new ProgressDialog(sendMailActivity);
        statusDialog.setMessage("Getting ready...");
        statusDialog.setIndeterminate(false);
        statusDialog.setCancelable(false);
        statusDialog.show();
    }

    @Override
    protected Object doInBackground(Object... args) {
        try {
            Log.i("SendMailTask", "About to instantiate GMail...");
            publishProgress("Processing input....");
            GMail androidEmail = new GMail(args[0].toString(),
                    args[1].toString(), (List) args[2], args[3].toString(),
                    args[4].toString());
            publishProgress("Preparing mail message....");
            androidEmail.createEmailMessage();
            publishProgress("Sending email....");
            androidEmail.sendEmail();
            publishProgress("Email Sent.");
            Log.i("SendMailTask", "Mail Sent.");
        } catch (Exception e) {
            publishProgress(e.getMessage());
            Log.e("SendMailTask", e.getMessage(), e);
        }
        return null;
    }

    @Override
    public void onProgressUpdate(Object... values) {
        statusDialog.setMessage(values[0].toString());

    }

    @Override
    public void onPostExecute(Object result) {
        statusDialog.dismiss();
    }

}
_

Schritt 3: Jetzt können Sie diese Klasse nach Ihren Wünschen ändern und mit dieser Klasse mehrere E-Mails senden. ich stelle xml und Java Akte beide zur Verfügung.

activity_mail.xml

_<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:orientation="vertical"
    Android:paddingLeft="20dp"
    Android:paddingRight="20dp"
    Android:paddingTop="30dp">

    <TextView
        Android:id="@+id/textView1"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:paddingTop="10dp"
        Android:text="From Email" />

    <EditText
        Android:id="@+id/editText1"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:background="#FFFFFF"
        Android:cursorVisible="true"
        Android:editable="true"
        Android:ems="10"
        Android:enabled="true"
        Android:inputType="textEmailAddress"
        Android:padding="5dp"
        Android:textColor="#000000">

        <requestFocus />
    </EditText>

    <TextView
        Android:id="@+id/textView2"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:paddingTop="10dp"
        Android:text="Password (For from email)" />

    <EditText
        Android:id="@+id/editText2"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:background="#FFFFFF"
        Android:ems="10"
        Android:inputType="textPassword"
        Android:padding="5dp"
        Android:textColor="#000000" />

    <TextView
        Android:id="@+id/textView3"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:paddingTop="10dp"
        Android:text="To Email" />

    <EditText
        Android:id="@+id/editText3"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:background="#ffffff"
        Android:ems="10"
        Android:inputType="textEmailAddress"
        Android:padding="5dp"
        Android:textColor="#000000" />

    <TextView
        Android:id="@+id/textView4"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:paddingTop="10dp"
        Android:text="Subject" />

    <EditText
        Android:id="@+id/editText4"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:background="#ffffff"
        Android:ems="10"
        Android:padding="5dp"
        Android:textColor="#000000" />

    <TextView
        Android:id="@+id/textView5"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:paddingTop="10dp"
        Android:text="Body" />

    <EditText
        Android:id="@+id/editText5"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:background="#ffffff"
        Android:ems="10"
        Android:inputType="textMultiLine"
        Android:padding="35dp"
        Android:textColor="#000000" />

    <Button
        Android:id="@+id/button1"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="Send Email" />

</LinearLayout>
_

SendMailActivity.Java

_import Android.app.Activity;
import Android.os.Bundle;
import Android.util.Log;
import Android.view.View;
import Android.widget.Button;
import Android.widget.TextView;

import Java.util.Arrays;
import Java.util.List;

public class SendMailActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final Button send = (Button) this.findViewById(R.id.button1);

        send.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {
                Log.i("SendMailActivity", "Send Button Clicked.");

                String fromEmail = ((TextView) findViewById(R.id.editText1))
                        .getText().toString();
                String fromPassword = ((TextView) findViewById(R.id.editText2))
                        .getText().toString();
                String toEmails = ((TextView) findViewById(R.id.editText3))
                        .getText().toString();
                List<String> toEmailList = Arrays.asList(toEmails
                        .split("\\s*,\\s*"));
                Log.i("SendMailActivity", "To List: " + toEmailList);
                String emailSubject = ((TextView) findViewById(R.id.editText4))
                        .getText().toString();
                String emailBody = ((TextView) findViewById(R.id.editText5))
                        .getText().toString();
                new SendMailTask(SendMailActivity.this).execute(fromEmail,
                        fromPassword, toEmailList, emailSubject, emailBody);
            }
        });
    }
}
_

Hinweis Vergessen Sie nicht, die Berechtigung internet in Ihre AndroidManifest.xml-Datei aufzunehmen

<uses-permission Android:name="Android.permission.INTERNET"/>

Hoffe es klappt wenn es dann nicht einfach weiter unten kommentiert wird.

23
Arpit Patel

SMTP

Die Verwendung von SMTP ist eine Möglichkeit, und die anderen haben bereits darauf hingewiesen, wie dies zu tun ist. Beachten Sie, dass Sie dabei die integrierte Mail-App vollständig umgehen und die Adresse des SMTP-Servers, den Benutzernamen und das Kennwort für diesen Server entweder statisch in Ihrem Code angeben oder vom Benutzer abfragen müssen .

HTTP

Eine andere Möglichkeit wäre ein einfaches serverseitiges Skript wie PHP, das einige URL-Parameter verwendet und zum Senden einer E-Mail verwendet. Auf diese Weise müssen Sie nur eine HTTP-Anfrage vom Gerät stellen (mit den integrierten Bibliotheken problemlos möglich) und müssen die SMTP-Anmeldedaten nicht auf dem Gerät speichern. Dies ist eine weitere Indirektion im Vergleich zur direkten SMTP-Nutzung. Da es jedoch so einfach ist, HTTP-Anfragen zu stellen und E-Mails von PHP aus zu senden, ist dies möglicherweise sogar einfacher als der direkte Weg.

Mail-Anwendung

Wenn die E-Mail von dem Standard-E-Mail-Konto des Benutzers gesendet werden soll, das er bereits mit dem Telefon registriert hat, müssen Sie einen anderen Ansatz wählen. Wenn Sie über genügend Zeit und Erfahrung verfügen, sollten Sie den Quellcode der E-Mail-Anwendung Android überprüfen, um festzustellen, ob er einen Einstiegspunkt zum Senden einer E-Mail ohne Benutzerinteraktion bietet (ich weiß es nicht, aber) vielleicht gibt es einen).

Vielleicht finden Sie sogar eine Möglichkeit, die Kontodetails der Benutzer abzufragen (damit Sie sie für SMTP verwenden können), obwohl ich sehr bezweifle, dass dies möglich ist, da dies ein großes Sicherheitsrisiko darstellt und Android eher erstellt wird sicher.

23
Lena Schimmel

hier ist eine alternative Version, die auch für mich funktioniert und Anhänge hat (bereits oben gepostete, aber vollständige Version im Gegensatz zum Quelllink, den die Leute gepostet haben, können sie nicht zum Laufen bringen, da die Daten fehlen).

import Java.util.Date; 
import Java.util.Properties; 
import javax.activation.CommandMap; 
import javax.activation.DataHandler; 
import javax.activation.DataSource; 
import javax.activation.FileDataSource; 
import javax.activation.MailcapCommandMap; 
import javax.mail.BodyPart; 
import javax.mail.Multipart; 
import javax.mail.PasswordAuthentication; 
import javax.mail.Session; 
import javax.mail.Transport; 
import javax.mail.internet.InternetAddress; 
import javax.mail.internet.MimeBodyPart; 
import javax.mail.internet.MimeMessage; 
import javax.mail.internet.MimeMultipart; 


public class Mail extends javax.mail.Authenticator { 
  private String _user; 
  private String _pass; 

  private String[] _to; 
  private String _from; 

  private String _port; 
  private String _sport; 

  private String _Host; 

  private String _subject; 
  private String _body; 

  private boolean _auth; 

  private boolean _debuggable; 

  private Multipart _multipart; 


  public Mail() { 
    _Host = "smtp.gmail.com"; // default smtp server 
    _port = "465"; // default smtp port 
    _sport = "465"; // default socketfactory port 

    _user = ""; // username 
    _pass = ""; // password 
    _from = ""; // email sent from 
    _subject = ""; // email subject 
    _body = ""; // email body 

    _debuggable = false; // debug mode on or off - default off 
    _auth = true; // smtp authentication - default on 

    _multipart = new MimeMultipart(); 

    // There is something wrong with MailCap, javamail can not find a handler for the multipart/mixed part, so this bit needs to be added. 
    MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap(); 
    mc.addMailcap("text/html;; x-Java-content-handler=com.Sun.mail.handlers.text_html"); 
    mc.addMailcap("text/xml;; x-Java-content-handler=com.Sun.mail.handlers.text_xml"); 
    mc.addMailcap("text/plain;; x-Java-content-handler=com.Sun.mail.handlers.text_plain"); 
    mc.addMailcap("multipart/*;; x-Java-content-handler=com.Sun.mail.handlers.multipart_mixed"); 
    mc.addMailcap("message/rfc822;; x-Java-content-handler=com.Sun.mail.handlers.message_rfc822"); 
    CommandMap.setDefaultCommandMap(mc); 
  } 

  public Mail(String user, String pass) { 
    this(); 

    _user = user; 
    _pass = pass; 
  } 

  public boolean send() throws Exception { 
    Properties props = _setProperties(); 

    if(!_user.equals("") && !_pass.equals("") && _to.length > 0 && !_from.equals("") && !_subject.equals("") && !_body.equals("")) { 
      Session session = Session.getInstance(props, this); 

      MimeMessage msg = new MimeMessage(session); 

      msg.setFrom(new InternetAddress(_from)); 

      InternetAddress[] addressTo = new InternetAddress[_to.length]; 
      for (int i = 0; i < _to.length; i++) { 
        addressTo[i] = new InternetAddress(_to[i]); 
      } 
        msg.setRecipients(MimeMessage.RecipientType.TO, addressTo); 

      msg.setSubject(_subject); 
      msg.setSentDate(new Date()); 

      // setup message body 
      BodyPart messageBodyPart = new MimeBodyPart(); 
      messageBodyPart.setText(_body); 
      _multipart.addBodyPart(messageBodyPart); 

      // Put parts in message 
      msg.setContent(_multipart); 

      // send email 
      Transport.send(msg); 

      return true; 
    } else { 
      return false; 
    } 
  } 

  public void addAttachment(String filename) throws Exception { 
    BodyPart messageBodyPart = new MimeBodyPart(); 
    DataSource source = new FileDataSource(filename); 
    messageBodyPart.setDataHandler(new DataHandler(source)); 
    messageBodyPart.setFileName(filename); 

    _multipart.addBodyPart(messageBodyPart); 
  } 

  @Override 
  public PasswordAuthentication getPasswordAuthentication() { 
    return new PasswordAuthentication(_user, _pass); 
  } 

  private Properties _setProperties() { 
    Properties props = new Properties(); 

    props.put("mail.smtp.Host", _Host); 

    if(_debuggable) { 
      props.put("mail.debug", "true"); 
    } 

    if(_auth) { 
      props.put("mail.smtp.auth", "true"); 
    } 

    props.put("mail.smtp.port", _port); 
    props.put("mail.smtp.socketFactory.port", _sport); 
    props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); 
    props.put("mail.smtp.socketFactory.fallback", "false"); 

    return props; 
  } 

  // the getters and setters 
  public String getBody() { 
    return _body; 
  } 

  public void setBody(String _body) { 
    this._body = _body; 
  }

  public void setTo(String[] toArr) {
      // TODO Auto-generated method stub
      this._to=toArr;
  }

  public void setFrom(String string) {
      // TODO Auto-generated method stub
      this._from=string;
  }

  public void setSubject(String string) {
      // TODO Auto-generated method stub
      this._subject=string;
  }  

  // more of the getters and setters ….. 
}

und es in einer Aktivität zu nennen ...

@Override 
public void onCreate(Bundle icicle) { 
  super.onCreate(icicle); 
  setContentView(R.layout.main); 

  Button addImage = (Button) findViewById(R.id.send_email); 
  addImage.setOnClickListener(new View.OnClickListener() { 
    public void onClick(View view) { 
      Mail m = new Mail("[email protected]", "password"); 

      String[] toArr = {"[email protected]", "[email protected]"}; 
      m.setTo(toArr); 
      m.setFrom("[email protected]"); 
      m.setSubject("This is an email sent using my Mail JavaMail wrapper from an Android device."); 
      m.setBody("Email body."); 

      try { 
        m.addAttachment("/sdcard/filelocation"); 

        if(m.send()) { 
          Toast.makeText(MailApp.this, "Email was sent successfully.", Toast.LENGTH_LONG).show(); 
        } else { 
          Toast.makeText(MailApp.this, "Email was not sent.", Toast.LENGTH_LONG).show(); 
        } 
      } catch(Exception e) { 
        //Toast.makeText(MailApp.this, "There was a problem sending the email.", Toast.LENGTH_LONG).show(); 
        Log.e("MailApp", "Could not send email", e); 
      } 
    } 
  }); 
} 
22
droopie

Warnung, wenn "smtp.gmail.com" als Standard-SMTP-Server verwendet wird.

Google wird Sie dazu zwingen, das Passwort Ihres verknüpften E-Mail-Kontos häufig zu ändern, da die Richtlinien zu übermäßigen "verdächtigen Aktivitäten" führen. Im Wesentlichen werden wiederholte SMTP-Anfragen aus verschiedenen Ländern innerhalb kurzer Zeit als "verdächtige Aktivitäten" behandelt. Wie sie annehmen, können Sie (der E-Mail-Kontoinhaber) immer nur in einem Land sein.

Wenn Google-Systeme "verdächtige Aktivitäten" erkennen, werden weitere E-Mails verhindert, bis Sie das Passwort ändern. Da Sie das Kennwort in der App fest codiert haben, müssen Sie die App jedes Mal neu freigeben, was nicht ideal ist. Dies geschah dreimal in der Woche. Ich habe das Passwort sogar auf einem anderen Server gespeichert und es jedes Mal dynamisch abgerufen, wenn Google mich dazu zwang, es zu ändern.

Ich empfehle daher, einen der vielen kostenlosen SMTP-Anbieter anstelle von "smtp.gmail.com" zu verwenden, um dieses Sicherheitsproblem zu vermeiden. Verwenden Sie denselben Code, aber ändern Sie "smtp.gmail.com" in Ihren neuen smtp-Weiterleitungshost.

13
Mark

GmailBackground ist eine kleine Bibliothek zum Senden einer E-Mail im Hintergrund ohne Benutzerinteraktion:

Verwendungszweck:

    BackgroundMail.newBuilder(this)
            .withUsername("[email protected]")
            .withPassword("password12345")
            .withMailto("[email protected]")
            .withType(BackgroundMail.TYPE_PLAIN)
            .withSubject("this is the subject")
            .withBody("this is the body")
            .withOnSuccessCallback(new BackgroundMail.OnSuccessCallback() {
                @Override
                public void onSuccess() {
                    //do some magic
                }
            })
            .withOnFailCallback(new BackgroundMail.OnFailCallback() {
                @Override
                public void onFail() {
                    //do some magic
                }
            })
            .send();

Aufbau:

repositories {
    // ...
    maven { url "https://jitpack.io" }
 }
 dependencies {
            compile 'com.github.yesidlazaro:GmailBackground:1.2.0'
    }

Berechtigungen:

<uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission Android:name="Android.permission.INTERNET"/>

Auch für Anhänge müssen Sie die READ_EXTERNAL_STORAGE-Berechtigung festlegen:

<uses-permission Android:name="Android.permission.READ_EXTERNAL_STORAGE"/>

Quelle

(Ich habe es selbst getestet)

11
S.R

Edit: JavaMail 1.5.5 behauptet, Android zu unterstützen , also sollten Sie nichts anderes brauchen.

Ich habe die neueste JavaMail (1.5.4) auf Android portiert. Es ist in Maven Central verfügbar. Fügen Sie einfach Folgendes zu build.gradle ~~ hinzu

compile 'eu.ocathain.com.Sun.mail:javax.mail:1.5.4'

Sie können dann dem offiziellen Tutorial folgen.

Der Quellcode ist hier verfügbar: https://bitbucket.org/artbristol/javamail-forked-Android

7
artbristol

Ich habe eine kürzere Alternative für andere gefunden, die Hilfe brauchen. Der Code lautet:

package com.example.mail;

import Java.util.Properties;

import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class SendMailTLS {

    public static void main(String[] args) {

        final String username = "[email protected]";
        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("[email protected]"));
            message.setRecipients(Message.RecipientType.TO,
                InternetAddress.parse("[email protected]"));
            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);
        }
    }
}

Quelle: Senden von E-Mails über die JavaMail-API

Hoffe das hilft! Viel Glück!

6

Diejenigen, die ClassDefNotFoundError bekommen, versuchen, diese drei JAR-Dateien in den lib-Ordner Ihres Projekts zu verschieben, es hat bei mir funktioniert !!

5
Omkar Gokhale

Ich kann den Code von Vinayak B nicht ausführen. Schließlich löste ich dieses Problem wie folgt:

1.Mit diesem

2.Anwenden von AsyncTask.

3.Änderung der Sicherheitslücke des Absender-Google Mail-Kontos. (Wechseln Sie zu "EIN") in this

4
Patriotic

Zum Versenden einer Mail mit Anhang.

public class SendAttachment{
                    public static void main(String [] args){ 
             //to address
                    String to="[email protected]";//change accordingly
                    //from address
                    final String user="[email protected]";//change accordingly
                    final String password="password";//change accordingly 
                     MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap();
                   mc.addMailcap("text/html;; x-Java-content-handler=com.Sun.mail.handlers.text_html");
                  mc.addMailcap("text/xml;; x-Java-content-handler=com.Sun.mail.handlers.text_xml");
                  mc.addMailcap("text/plain;; x-Java-content-handler=com.Sun.mail.handlers.text_plain");
                  mc.addMailcap("multipart/*;; x-Java-content-handler=com.Sun.mail.handlers.multipart_mixed");
                  mc.addMailcap("message/rfc822;; x-Java-content-handler=com.Sun.mail.handlers.message_rfc822");
                  CommandMap.setDefaultCommandMap(mc); 
                  //1) get the session object   
                  Properties properties = System.getProperties();
                  properties.put("mail.smtp.port", "465"); 
                  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");

                  Session session = Session.getDefaultInstance(properties,
                   new javax.mail.Authenticator() {
                   protected PasswordAuthentication getPasswordAuthentication() {
                   return new PasswordAuthentication(user,password);
                   }
                  });

                  //2) compose message   
                  try{ 
                    MimeMessage message = new MimeMessage(session);
                    message.setFrom(new InternetAddress(user));
                    message.addRecipient(Message.RecipientType.TO,new InternetAddress(to));
                    message.setSubject("Hii"); 
                    //3) create MimeBodyPart object and set your message content    
                    BodyPart messageBodyPart1 = new MimeBodyPart();
                    messageBodyPart1.setText("How is This"); 
                    //4) create new MimeBodyPart object and set DataHandler object to this object    
                    MimeBodyPart messageBodyPart2 = new MimeBodyPart();
                //Location of file to be attached
                    String filename = Environment.getExternalStorageDirectory().getPath()+"/R2832.Zip";//change accordingly
                    DataSource source = new FileDataSource(filename);
                    messageBodyPart2.setDataHandler(new DataHandler(source));
                    messageBodyPart2.setFileName("Hello"); 
                    //5) create Multipart object and add MimeBodyPart objects to this object    
                    Multipart multipart = new MimeMultipart();
                    multipart.addBodyPart(messageBodyPart1);
                    multipart.addBodyPart(messageBodyPart2); 
                    //6) set the multiplart object to the message object
                    message.setContent(multipart ); 
                    //7) send message 
                    Transport.send(message); 
                   System.out.println("MESSAGE SENT....");
                   }catch (MessagingException ex) {ex.printStackTrace();}
                  }
                }
4
Rashid

Haben Sie darüber nachgedacht, Apache Commons Net zu verwenden? Seit 3.3, nur ein Glas (und Sie können sich mit gradle oder maven darauf verlassen) und fertig: http://blog.dahanne.net/2013/06/17/sending-a-mail- in-Java-und-Android-mit-Apache-commons-net /

3
Anthony Dahanne

Ohne Benutzereingriff können Sie wie folgt senden:

  1. Senden Sie eine E-Mail von Client apk. Hier ist mail.jar, activation.jar erforderlich, um Java E-Mails zu senden. Wenn diese Gläser hinzugefügt werden, kann dies die APK-Größe erhöhen.

  2. Alternativ können Sie einen Webservice auf der Serverseite verwenden, der dieselbe mail.jar- und activation.jar-Datei zum Senden von E-Mails verwendet. Sie können den Webdienst über asynctask anrufen und eine E-Mail senden. Verweisen Sie auf den gleichen Link.

(Sie müssen jedoch die Anmeldeinformationen des E-Mail-Kontos kennen.)

3

Der gesamte Code, der in den anderen Antworten bereitgestellt wird, ist korrekt und funktioniert einwandfrei, aber ein bisschen chaotisch. Daher habe ich beschlossen, eine Bibliothek zu veröffentlichen (die sich noch in der Entwicklung befindet), um die Verwendung zu vereinfachen: AndroidMail.

Sie müssen lediglich einen MailSender erstellen, eine Mail erstellen und senden (bereits im Hintergrund mit einer AsyncTask behandelt).

MailSender mailSender = new MailSender(email, password);

Mail.MailBuilder builder = new Mail.MailBuilder();
Mail mail = builder
    .setSender(senderMail)
    .addRecipient(new Recipient(recipient))
    .setText("Hello")
    .build();

mailSender.sendMail(mail);

Sie können eine Benachrichtigung für die gesendete E-Mail erhalten und es werden auch verschiedene Empfängertypen (TO, CC und BCC), Anhänge und HTML unterstützt:

MailSender mailSender = new MailSender(email, password);

Mail.MailBuilder builder = new Mail.MailBuilder();
Mail mail = builder
    .setSender(senderMail)
    .addRecipient(new Recipient(recipient))
    .addRecipient(new Recipient(Recipient.TYPE.CC, recipientCC))
    .setText("Hello")
    .setHtml("<h1 style=\"color:red;\">Hello</h1>")
    .addAttachment(new Attachment(filePath, fileName))
    .build();

mailSender.sendMail(mail, new MailSender.OnMailSentListener() {

    @Override
    public void onSuccess() {
        // mail sent!
    }

    @Override
    public void onError(Exception error) {
        // something bad happened :(
    }
});

Sie können es über Gradle oder Maven bekommen:

compile 'it.enricocandino:androidmail:1.0.0-SNAPSHOT'

Bitte lassen Sie mich wissen, wenn Sie irgendwelche Probleme damit haben! :)

2
Enrichman

Ich habe versucht, den von @ Vinayak B übermittelten Code zu verwenden. Allerdings erhalte ich eine Fehlermeldung: Kein Provider für SMTP

Ich habe dazu eine neue Frage mit mehr Informationen erstellt HIER

Ich konnte es doch selbst reparieren. Ich musste ein anderes mail.jar verwenden und sicherstellen, dass mein " Zugriff für weniger sichere Apps " aktiviert war.

Ich hoffe das hilft jedem, der das gleiche Problem hat. Damit funktioniert dieser Code auch auf Google Glass.

2
NoSixties

Falls Sie aufgefordert werden, die JAR-Bibliothek so klein wie möglich zu halten, können Sie die SMTP/POP3/IMAP-Funktion separat einbinden, um das Problem "zu viele Methoden im Dex" zu vermeiden.

Sie können die gewünschten JAR-Bibliotheken aus der JAVANET-Webseite auswählen. Beispielsweise können Sie mit mailapi.jar + imap.jar auf den icloud-Hotmail-Mailserver im IMAP-Protokoll zugreifen. (mit Hilfe von additional.jar und activation.jar)

2
Zephyr
 Add jar files mail.jar,activation.jar,additionnal.jar

 String sub="Thank you for your online registration" ; 
 Mail m = new Mail("emailid", "password"); 

 String[] toArr = {"[email protected]",sEmailId};
 m.setFrom("[email protected]"); 

     m.setTo(toArr);
     m.setSubject(sub);
    m.setBody(msg);



                     try{


                            if(m.send()) { 

                            } else { 

                            } 
                          } catch(Exception e) { 

                            Log.e("MailApp", "Could not send email", e); 
                          } 

  package com.example.ekktra;

   import Java.util.Date;
   import Java.util.Properties;

   import javax.activation.CommandMap;
   import javax.activation.DataHandler;
   import javax.activation.DataSource;
   import javax.activation.FileDataSource;
   import javax.activation.MailcapCommandMap;
   import javax.mail.BodyPart;
   import javax.mail.Multipart;
   import javax.mail.PasswordAuthentication;
   import javax.mail.Session;
   import javax.mail.Transport;
   import javax.mail.internet.InternetAddress;
   import javax.mail.internet.MimeBodyPart;
   import javax.mail.internet.MimeMessage;
   import javax.mail.internet.MimeMultipart;

   public class Mail extends javax.mail.Authenticator { 
     private String _user; 
     private String _pass; 

     private String[] _to; 

     private String _from; 

     private String _port; 
     private String _sport; 

     private String _Host; 

     private String _subject; 
     private String _body; 

     private boolean _auth; 

     private boolean _debuggable; 

     private Multipart _multipart; 


   public Mail() { 
      _Host = "smtp.gmail.com"; // default smtp server 
      _port = "465"; // default smtp port 
      _sport = "465"; // default socketfactory port 

      _user = ""; // username 
      _pass = ""; // password 
      _from = ""; // email sent from 
      _subject = ""; // email subject 
      _body = ""; // email body 

      _debuggable = false; // debug mode on or off - default off 
      _auth = true; // smtp authentication - default on 

      _multipart = new MimeMultipart(); 

      // There is something wrong with MailCap, javamail can not find a handler for the        multipart/mixed part, so this bit needs to be added. 
      MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap(); 
   mc.addMailcap("text/html;; x-Java-content-handler=com.Sun.mail.handlers.text_html"); 
   mc.addMailcap("text/xml;; x-Java-content-handler=com.Sun.mail.handlers.text_xml"); 
   mc.addMailcap("text/plain;; x-Java-content-  handler=com.Sun.mail.handlers.text_plain"); 
   mc.addMailcap("multipart/*;; x-Java-content-handler=com.Sun.mail.handlers.multipart_mixed"); 
   mc.addMailcap("message/rfc822;; x-Java-content- handler=com.Sun.mail.handlers.message_rfc822"); 
    CommandMap.setDefaultCommandMap(mc); 
   } 

 public Mail(String user, String pass) { 
  this(); 

  _user = user; 
   _pass = pass; 
 } 

public boolean send() throws Exception { 
   Properties props = _setProperties(); 

  if(!_user.equals("") && !_pass.equals("") && _to.length > 0 && !_from.equals("") &&   !_subject.equals("") /*&& !_body.equals("")*/) { 
    Session session = Session.getInstance(props, this); 

    MimeMessage msg = new MimeMessage(session); 

     msg.setFrom(new InternetAddress(_from)); 

    InternetAddress[] addressTo = new InternetAddress[_to.length]; 
     for (int i = 0; i < _to.length; i++) { 
      addressTo[i] = new InternetAddress(_to[i]); 
    } 
      msg.setRecipients(MimeMessage.RecipientType.TO, addressTo); 

    msg.setSubject(_subject); 
    msg.setSentDate(new Date()); 

  // setup message body 
  BodyPart messageBodyPart = new MimeBodyPart(); 
    messageBodyPart.setText(_body); 
    _multipart.addBodyPart(messageBodyPart); 

     // Put parts in message 
    msg.setContent(_multipart); 

    // send email 
    Transport.send(msg); 

    return true; 
   } else { 
     return false; 
   } 
  } 

   public void addAttachment(String filename) throws Exception { 
    BodyPart messageBodyPart = new MimeBodyPart(); 
    DataSource source = new FileDataSource(filename); 
      messageBodyPart.setDataHandler(new DataHandler(source)); 
    messageBodyPart.setFileName(filename); 

   _multipart.addBodyPart(messageBodyPart); 
 } 

  @Override 
  public PasswordAuthentication getPasswordAuthentication() { 
     return new PasswordAuthentication(_user, _pass); 
  } 

   private Properties _setProperties() { 
   Properties props = new Properties(); 

    props.put("mail.smtp.Host", _Host); 

  if(_debuggable) { 
    props.put("mail.debug", "true"); 
  } 

  if(_auth) { 
    props.put("mail.smtp.auth", "true"); 
   } 

    props.put("mail.smtp.port", _port); 
    props.put("mail.smtp.socketFactory.port", _sport); 
    props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); 
    props.put("mail.smtp.socketFactory.fallback", "false"); 

    return props; 
   } 

   // the getters and setters 
  public String getBody() { 
   return _body; 
 } 

 public void setBody(String _body) { 
  this._body = _body; 
 }

  public void setTo(String[] toArr) {
     // TODO Auto-generated method stub
    this._to=toArr;
 }

public void setFrom(String string) {
    // TODO Auto-generated method stub
    this._from=string;
}

 public void setSubject(String string) {
    // TODO Auto-generated method stub
    this._subject=string;
  }  


   }
0
dhiraj kakran