Как отправить простую электронную почту программно? (существует простой способ сделать это?)

У меня есть текстовое поле в приложении и кнопка. Я только хочу, чтобы пользователь нажмите кнопку, мое приложение должно отправить электронное письмо с текстом "Привет" на направление в текстовом поле.

Есть ли простой способ сделать это?

4 ответа

Первый способ. Если вы не хотите связываться с собственной программой электронной почты или программой gmail (через намерение), чтобы отправить почту, но отправьте электронное письмо в фоновом режиме, см. Код ниже.

Вы можете использовать этот вспомогательный класс и настроить его на свои нужды.

package com.myapp.android.model.service;
import android.util.Log;
import com.myapp.android.MyApp;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.mail.Authenticator;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMultipart;
public class MailService { // public static final String MAIL_SERVER = "localhost"; private String toList; private String ccList; private String bccList; private String subject; final private static String SMTP_SERVER = DataService .getSetting(DataService.SETTING_SMTP_SERVER); private String from; private String txtBody; private String htmlBody; private String replyToList; private ArrayList<attachment> attachments; private boolean authenticationRequired = false; public MailService(String from, String toList, String subject, String txtBody, String htmlBody, Attachment attachment) { this.txtBody = txtBody; this.htmlBody = htmlBody; this.subject = subject; this.from = from; this.toList = toList; this.ccList = null; this.bccList = null; this.replyToList = null; this.authenticationRequired = true; this.attachments = new ArrayList<attachment>(); if (attachment != null) { this.attachments.add(attachment); } } public MailService(String from, String toList, String subject, String txtBody, String htmlBody, ArrayList<attachment> attachments) { this.txtBody = txtBody; this.htmlBody = htmlBody; this.subject = subject; this.from = from; this.toList = toList; this.ccList = null; this.bccList = null; this.replyToList = null; this.authenticationRequired = true; this.attachments = attachments == null ? new ArrayList<attachment>() : attachments; } public void sendAuthenticated() throws AddressException, MessagingException { authenticationRequired = true; send(); } /** * Send an e-mail * * @throws MessagingException * @throws AddressException */ public void send() throws AddressException, MessagingException { Properties props = new Properties(); // set the host smtp address props.put("mail.smtp.host", SMTP_SERVER); props.put("mail.user", from); props.put("mail.smtp.starttls.enable", "true"); // needed for gmail props.put("mail.smtp.auth", "true"); // needed for gmail props.put("mail.smtp.port", "587"); // gmail smtp port /*Authenticator auth = new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication("[removed_email]", "mypassword"); } };*/ Session session; if (authenticationRequired) { Authenticator auth = new SMTPAuthenticator(); props.put("mail.smtp.auth", "true"); session = Session.getDefaultInstance(props, auth); } else { session = Session.getDefaultInstance(props, null); } // get the default session session.setDebug(true); // create message Message msg = new javax.mail.internet.MimeMessage(session); // set from and to address try { msg.setFrom(new InternetAddress(from, from)); msg.setReplyTo(new InternetAddress[]{new InternetAddress(from,from)}); } catch (Exception e) { msg.setFrom(new InternetAddress(from)); msg.setReplyTo(new InternetAddress[]{new InternetAddress(from)}); } // set send date msg.setSentDate(Calendar.getInstance().getTime()); // parse the recipients TO address java.util.StringTokenizer st = new java.util.StringTokenizer(toList, ","); int numberOfRecipients = st.countTokens(); javax.mail.internet.InternetAddress[] addressTo = new javax.mail.internet.InternetAddress[numberOfRecipients]; int i = 0; while (st.hasMoreTokens()) { addressTo[i++] = new javax.mail.internet.InternetAddress(st .nextToken()); } msg.setRecipients(javax.mail.Message.RecipientType.TO, addressTo); // parse the replyTo addresses if (replyToList != null && !"".equals(replyToList)) { st = new java.util.StringTokenizer(replyToList, ","); int numberOfReplyTos = st.countTokens(); javax.mail.internet.InternetAddress[] addressReplyTo = new javax.mail.internet.InternetAddress[numberOfReplyTos]; i = 0; while (st.hasMoreTokens()) { addressReplyTo[i++] = new javax.mail.internet.InternetAddress( st.nextToken()); } msg.setReplyTo(addressReplyTo); } // parse the recipients CC address if (ccList != null && !"".equals(ccList)) { st = new java.util.StringTokenizer(ccList, ","); int numberOfCCRecipients = st.countTokens(); javax.mail.internet.InternetAddress[] addressCC = new javax.mail.internet.InternetAddress[numberOfCCRecipients]; i = 0; while (st.hasMoreTokens()) { addressCC[i++] = new javax.mail.internet.InternetAddress(st .nextToken()); } msg.setRecipients(javax.mail.Message.RecipientType.CC, addressCC); } // parse the recipients BCC address if (bccList != null && !"".equals(bccList)) { st = new java.util.StringTokenizer(bccList, ","); int numberOfBCCRecipients = st.countTokens(); javax.mail.internet.InternetAddress[] addressBCC = new javax.mail.internet.InternetAddress[numberOfBCCRecipients]; i = 0; while (st.hasMoreTokens()) { addressBCC[i++] = new javax.mail.internet.InternetAddress(st .nextToken()); } msg.setRecipients(javax.mail.Message.RecipientType.BCC, addressBCC); } // set header msg.addHeader("X-Mailer", "MyAppMailer"); msg.addHeader("Precedence", "bulk"); // setting the subject and content type msg.setSubject(subject); Multipart mp = new MimeMultipart("related"); // set body message MimeBodyPart bodyMsg = new MimeBodyPart(); bodyMsg.setText(txtBody, "iso-8859-1"); if (attachments.size()>0) htmlBody = htmlBody.replaceAll("#filename#",attachments.get(0).getFilename()); if (htmlBody.indexOf("#header#")>=0) htmlBody = htmlBody.replaceAll("#header#",attachments.get(1).getFilename()); if (htmlBody.indexOf("#footer#")>=0) htmlBody = htmlBody.replaceAll("#footer#",attachments.get(2).getFilename()); bodyMsg.setContent(htmlBody, "text/html"); mp.addBodyPart(bodyMsg); // set attachements if any if (attachments != null && attachments.size() > 0) { for (i = 0; i < attachments.size(); i++) { Attachment a = attachments.get(i); BodyPart att = new MimeBodyPart(); att.setDataHandler(new DataHandler(a.getDataSource())); att.setFileName( a.getFilename() ); att.setHeader("Content-ID", "<" + a.getFilename() + ">"); mp.addBodyPart(att); } } msg.setContent(mp); // send it try { javax.mail.Transport.send(msg); } catch (Exception e) { e.printStackTrace(); } } /** * SimpleAuthenticator is used to do simple authentication when the SMTP * server requires it. */ private static class SMTPAuthenticator extends javax.mail.Authenticator { @Override protected PasswordAuthentication getPasswordAuthentication() { String username = DataService .getSetting(DataService.SETTING_SMTP_USER); String password = DataService .getSetting(DataService.SETTING_SMTP_PASSWORD); return new PasswordAuthentication(username, password); } } public String getToList() { return toList; } public void setToList(String toList) { this.toList = toList; } public String getCcList() { return ccList; } public void setCcList(String ccList) { this.ccList = ccList; } public String getBccList() { return bccList; } public void setBccList(String bccList) { this.bccList = bccList; } public String getSubject() { return subject; } public void setSubject(String subject) { this.subject = subject; } public void setFrom(String from) { this.from = from; } public void setTxtBody(String body) { this.txtBody = body; } public void setHtmlBody(String body) { this.htmlBody = body; } public String getReplyToList() { return replyToList; } public void setReplyToList(String replyToList) { this.replyToList = replyToList; } public boolean isAuthenticationRequired() { return authenticationRequired; } public void setAuthenticationRequired(boolean authenticationRequired) { this.authenticationRequired = authenticationRequired; }
}
</attachment></attachment></attachment></attachment>

И используйте этот класс:

MailService mailer = new MailService("[removed_email]","[removed_email]","Subject","TextBody", "<b>HtmlBody</b>", (Attachment) null);
try { mailer.sendAuthenticated();
} catch (Exception e) { Log.e(AskTingTing.APP, "Failed sending email.", e);
}

Второй способ. Другой вариант, если вы не возражаете использовать собственный почтовый клиент или gmail на Android для отправки почты (но пользователю действительно нужно нажать кнопку отправки, наконец, в почтовом клиенте), вы можете сделать это:

startActivity(new Intent(Intent.ACTION_SENDTO, Uri.parse("mailto:[removed_email]")));


Добавить эту строку кода в кнопку отправки

final Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND); emailIntent.setType("text/plain"); emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new String\[\]{ "[removed_email]"}); emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "Hello There"); emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, "Add Message here"); emailIntent.setType("message/rfc822"); try { startActivity(Intent.createChooser(emailIntent, "Send email using...")); } catch (android.content.ActivityNotFoundException ex) { Toast.makeText(getActivity(), "No email clients installed.", Toast.LENGTH_SHORT).show(); } } });

Android автоматически выберет клиенты, доступные на вашем устройстве, и пользователь сможет выбрать любой клиент электронной почты, который хочет

Предположим, что пользователь выбрал gmail как почтовый клиент, он будет выглядеть так: -

Плюс к этому методу - вы не добавляете лишнюю банку в App и giveuser, чтобы выбрать действие.


public class MainActivity extends Activity { private static final String username = "emailaddress"; private static final String password = "password"; private EditText emailEdit; private EditText subjectEdit; private EditText messageEdit; private Multipart _multipart; @SuppressLint("SdCardPath") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); emailEdit = (EditText) findViewById(R.id.email); subjectEdit = (EditText) findViewById(R.id.subject); messageEdit = (EditText) findViewById(R.id.message); Button sendButton = (Button) findViewById(R.id.send); sendButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { String email = emailEdit.getText().toString(); String subject = subjectEdit.getText().toString(); String message = messageEdit.getText().toString(); sendMail(email, subject, message); } }); } private void sendMail(String email, String subject, String messageBody) { Session session = createSessionObject(); try { Message message = createMessage(email, subject, messageBody, session); new SendMailTask().execute(message); } catch (AddressException e) { e.printStackTrace(); } catch (MessagingException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } 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); } private Message createMessage(String email, String subject, String messageBody, Session session) throws MessagingException, UnsupportedEncodingException { Message message = new MimeMessage(session); message.setFrom(new InternetAddress("[removed_email]", "Tiemen Schut")); message.addRecipient(Message.RecipientType.TO, new InternetAddress(email, email)); message.setSubject(subject); message.setText(messageBody); return message; } private Session createSessionObject() { Properties properties = new Properties(); properties.put("mail.smtp.auth", "true"); properties.put("mail.smtp.starttls.enable", "true"); properties.put("mail.smtp.host", "smtp.gmail.com"); properties.put("mail.smtp.port", "587"); return Session.getInstance(properties, new javax.mail.Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(username, password); } }); } private class SendMailTask extends AsyncTask<message, void,="" void=""> { private ProgressDialog progressDialog; @Override protected void onPreExecute() { super.onPreExecute(); progressDialog = ProgressDialog.show(MainActivity.this, "Please wait", "Sending mail", true, false); } @Override protected void onPostExecute(Void aVoid) { super.onPostExecute(aVoid); progressDialog.dismiss(); } @Override protected Void doInBackground(Message... messages) { try { Transport.send(messages[0]); } catch (MessagingException e) { e.printStackTrace(); } return null; } } }
</message,>

добавьте три файла jar в папку libs и попробуйте это Mail.jar!

activation.jar!

additional.jar!

Запишите тему или текст тела напрямую и удалите edittext, и вы отправите прямое письмо из своего приложения.

И не забудьте дать РАЗРЕШЕНИЕ ИНТЕРНЕТА В вашем манифесте


Еще одна вещь, я использовал подходы, приведенные в различных ответах на этом сайте, но это просто не сработало. Первой проблемой был брандмауэр: Transport.send(message) выбрасывало следующее исключение:

javax.mail.MessagingException: Could not connect to SMTP host: smtp.gmail.com, port: 465; nested exception is: java.net.SocketTimeoutException: failed to connect to smtp.gmail.com/64.233.184.108 (port 465) after 90000ms

Если это произойдет, ваш брандмауэр заблокирует вас. Попробуйте использовать другую сеть.

После переключения сети я получил электронное письмо от Google, что попытка использовать менее защищенное приложение для использования моей учетной записи было сделано.

Решение заключалось в том, чтобы обеспечить доступ GMail для менее безопасных приложений. Это можно сделать по этой ссылке:

https://support.google.com/accounts/answer/6010255?hl=en

licensed under cc by-sa 3.0 with attribution.