Статьи

Java Mail API на Android Работа с Restful API в Интернете

Java Mail API на Android

JavaMail API считается добросовестным набором классов для построения полнофункциональной почтовой системы, которая не зависит ни от каких протоколов или платформ. Теперь API служат еще большей цели, когда они используются для веб-сервисов API RESTful. Но это приходит позже.

Давайте более подробно рассмотрим API Java Mail и поймем, почему он растет:

Предоставляя вам возможность создания авангардных интерфейсов, Java Mail API может усовершенствовать некоторые базовые приложения, интегрировав с ними функцию электронной почты.

Существует множество требований, которые он рассматривает по-своему:

  • Удобство для разработчиков достигается за счет дизайна, который является эффективным, но в то же время удобным.
  • Используемые здесь концепции программирования не чужды тем, кто разбирается в Java API, например, функция обработки ошибок не сильно отличается, как и модели программирования обработки событий JDK 1.1.
  • Вы можете добавить невероятно мощные и универсальные почтовые приложения, которые также могут обрабатывать сложные форматы почтовых сообщений.

Существует очевидное влияние таких технологий, как IMAP и MAPI, в Java Mail API, но в отличие от этих технологий, вам проще использовать его, потому что они не могут позволить себе интегрировать простые концепции языка программирования Java.

Архитектура

Архитектура

Java Mail имеет многоуровневую архитектуру, которая характеризуется набором атрибутов:

  • Он имеет абстрактный уровень, который определяет правила для пользовательского интерфейса, классов и других функций, которые способствуют эффективной обработке почты.
  • Затем у вас есть уровень реализации Интернета, который использует стандарты Интернета — RFC822 и MIME для реализации компонентов абстрактного уровня.
  • Кроме того, JavaBeans Activation Framework (JAF) начинает работать, когда необходимо выполнить инкапсуляцию данных сообщения. Это также оказывается изобретательным, когда вам нужно управлять некоторыми командами, которые облегчат взаимодействие с файлами данных.

Проникновение в ОТДЫХ

Теперь передача представительного состояния (REST) ​​- это архитектура, которой следуют многие клиенты и серверы. Это помогает клиентам либо извлекать, либо изменять состояние ресурса, и получает ответ от сервера, который отправляет желаемое представление ресурса. Когда мы говорим о ресурсе, мы обычно ссылаемся на свойства объекта. Вы можете принять объект за пользователя, который имеет определенные атрибуты, такие как имя, местоположение, положение и т. Д. Для пользователя также может быть уникальная цифровая идентификация. И этот ресурс затем может быть представлен REST API через что-то вроде JSON, XML, Binary и т. Д.

Создание REST Callouts в Android

Хотя для этого есть разные способы, одним из самых простых способов является использование шаблона проектирования, созданного Вирджилом Добянским. По этому шаблону разработчик рассматриваемого приложения использует службы, намерения (обратите внимание, что API также используют намерения) и базу данных для поддержки состояния данных, которое обрабатывается в приложении.

REST Callouts

Именно RESTMethod определяет URL-адрес HTTP и тело HTTP-запроса. Затем выполняется реализация транзакции HTTP перед обработкой ответа HTTP. Теперь есть вероятность, что этот процесс займет больше времени, чем требуется, и поэтому рекомендуется запускать его в рабочем потоке. И вместо URL-соединения JAVA рекомендуется использовать HTTP-клиент Apache для сборки в Android.

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

Давайте рассмотрим пример того, как весь процесс выполняется с помощью фрагмента кода.

GMail.java — Отправитель электронной почты GMail с использованием JavaMail

package com.ourimlementation.java.androidmail;

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;

import android.util.Log;

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 toEmailList;
	String emailSubject;
	String emailBody;

	Properties emailProperties;
	Session mailSession;
	MimeMessage emailMessage;

	public GMail() {

	}

	public GMail(String fromEmail, String fromPassword,
			List 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.");
	}
}

SendMailActivity.java — Android-активность для создания и отправки электронной почты

package com.ourimlementation.java.androidmail;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class SendMailActivity extends Activity implements OnClickListener
{
	private Button buttonSend;
	private TextView senderEmail, senderPassword, recipientEmail, emailSubject, emailBody;
	private List<String> recipientEmailList;
	private String strSenderEmail, strSenderPassword, strRecipientEmail, strEmailSubject, strEmailBody;
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_send_mail);
		initializeWidgets();
	}
	
	private void initializeWidgets()
	{
		buttonSend = (Button) this.findViewById(R.id.button1);
		senderEmail = (TextView) this.findViewById(R.id.editText1);
		senderPassword = (TextView) this.findViewById(R.id.editText2);
		recipientEmail = (TextView) this.findViewById(R.id.editText3);
		emailSubject = (TextView) this.findViewById(R.id.editText4);
		emailBody = (TextView) this.findViewById(R.id.editText5);
		recipientEmailList = new ArrayList<String>();
		buttonSend.setOnClickListener(this);
	}
	
	private void getValues()
	{
		strSenderEmail = senderEmail.getText().toString();
		strSenderPassword = senderPassword.getText().toString();
		strRecipientEmail = recipientEmail.getText().toString();
		recipientEmailList = Arrays.asList(strRecipientEmail.split("\\s*,\\s*"));
		strEmailSubject = emailSubject.getText().toString();
		strEmailBody = emailBody.getText().toString();
	}

	@Override
	public void onClick(View v)
	{
		// TODO Auto-generated method stub
		switch(v.getId())
		{
		case R.id.button1:
			getValues();
			new SendMailTask(SendMailActivity.this).execute(strSenderEmail, strSenderPassword, recipientEmailList, strEmailSubject, strEmailBody);
			break;
		}
	}
}

SendMailTask.java — Android AsyncTask для отправки электронной почты

package com.ourimlementation.java.androidmail;

import java.util.List;

import android.app.Activity;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.util.Log;

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();
	}
}

AndroidManifest.xml

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