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

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

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

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.