如何以编程方式发送简单的电子邮件? (存在一个简单的方法来做到这一点?)

我在我的应用程序和一个button上有一个文本框。 我只希望当用户按下button,我的应用程序必须发送一个电子邮件与文本“你好”的方向在文本字段。

有没有简单的方法来做到这一点?

第一种方式 。 如果您不希望链接到本地​​电子邮件程序或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("mobile@mydomain.com", "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; } } 

并使用这个类:

 MailService mailer = new MailService("from@mydomain.com","to@domain.com","Subject","TextBody", "<b>HtmlBody</b>", (Attachment) null); try { mailer.sendAuthenticated(); } catch (Exception e) { Log.e(AskTingTing.APP, "Failed sending email.", e); } 

第二种方式 。 另一种select是,如果您不介意在Android上使用本地电子邮件客户端或Gmail发送邮件(但用户实际上必须在电子邮件客户端中最终点击发送button),则可以这样做:

 startActivity(new Intent(Intent.ACTION_SENDTO, Uri.parse("mailto:to@gmail.com"))); 

在你的提交button中添加这行代码

  final Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND); emailIntent.setType("text/plain"); emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new String\[\]{ "serveroverloadofficial@gmail.com"}); 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会自动select你的设备上的客户端,用户可以自由select他想要的任何电子邮件客户端

意图应用程序选择器

假设用户selectgmail作为邮件客户端,它看起来像这样:

简单地发送邮件

此方法的另外一点是,您不会在应用程序中添加任何额外的jar,并允许用户自由select操作。

  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("tutorials@tiemenschut.com", "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; } } } 

在你的libs文件夹中添加三个jar文件,然后试试这个Mail.jar!

的activation.jar!

additional.jar!

直接写主题或正文,并删除edittext,你会直接从您的应用程序发送电子邮件。

并且不要忘记在你的清单中给INTERNET许可

还有一件事,我使用了本网站的各种答案给出的方法,但它根本无法工作。 第一个问题是防火墙: Transport.send(message)抛出以下exception:

  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 

如果发生这种情况,那么防火墙阻止了你。 尝试不同的networking。

在切换networking之后,我收到一封来自Google的电子邮件,其中一个不太安全的应用程序尝试使用我的帐户。

解决scheme是启用GMail访问安全性较低的应用程序。 这可以在这个链接上完成:

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