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.
Senden Sie E-Mails in Android mithilfe der JavaMail-API und der Google Mail-Authentifizierung.
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/
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);
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" />
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
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;
}
}
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
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.
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 .
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.
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.
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);
}
}
});
}
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.
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"/>
(Ich habe es selbst getestet)
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
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!
Diejenigen, die ClassDefNotFoundError
bekommen, versuchen, diese drei JAR-Dateien in den lib-Ordner Ihres Projekts zu verschieben, es hat bei mir funktioniert !!
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
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();}
}
}
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 /
Ohne Benutzereingriff können Sie wie folgt senden:
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.
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.)
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! :)
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.
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)
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;
}
}