как отправить письмо из джава приложения? [закрыт]
Закрыт. Этот вопрос необходимо уточнить или дополнить подробностями. Ответы на него в данный момент не принимаются.
Хотите улучшить этот вопрос? Добавьте больше подробностей и уточните проблему, отредактировав это сообщение.
Закрыт 1 год назад .
Подскажите пожалуйста, как отправить письмо из джава приложения? отправлять нужно с моей почты (gmail.com)
Отслеживать
задан 8 апр 2022 в 21:20
LsdLucifer LsdLucifer
11 1 1 серебряный знак 6 6 бронзовых знаков
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
нашел подробную инструкцию вот тут:
//1. Gmail SMTP через TLS SMTP = smtp.gmail.com Port = 587 SendEmailTLS.java import javax.mail.*; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import java.util.Properties; public class SendEmailTLS < public static void main(String[] args) < final String username = "[email protected]"; final String password = "password"; Properties prop = new Properties(); prop.put("mail.smtp.host", "smtp.gmail.com"); prop.put("mail.smtp.port", "587"); prop.put("mail.smtp.auth", "true"); prop.put("mail.smtp.starttls.enable", "true"); //TLS Session session = Session.getInstance(prop, 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], [email protected]") ); message.setSubject("Testing Gmail TLS"); message.setText("Dear Mail Crawler," + "\n\n Please do not spam my email!"); Transport.send(message); System.out.println("Done"); > catch (MessagingException e) < e.printStackTrace(); >> >
Отправка писем java – примеры
Для отправки электронной почты с использованием Java-приложения достаточно просто, но для начала на вашем компьютере должны быть установлены JavaMail API и Java Activation Framework (JAF). Вы можете загрузить последнюю версию JavaMail и JAF со стандартного веб-сайта Java.
Загрузите и разархивируйте эти файлы, во вновь созданных каталогах верхнего уровня вы найдете несколько jar-файлов для обоих приложений. Необходимо добавить файлы mail.jar и activation.jar в ваш CLASSPATH.
Отправить простое электронное письмо
Вот пример отправки простого электронного письма с вашего компьютера с помощью Java. Предполагается, что ваш локальный хост подключен к Интернету и достаточно способен отправлять электронную почту.
Пример
// File Name SendEmail.java import java.util.*; import javax.mail.*; import javax.mail.internet.*; import javax.activation.*; public class SendEmail < public static void main(String [] args) < // Recipient's email ID needs to be mentioned. String to = "abcd@gmail.com"; // Sender's email ID needs to be mentioned String from = "web@gmail.com"; // Assuming you are sending email from localhost String host = "localhost"; // Get system properties Properties properties = System.getProperties(); // Setup mail server properties.setProperty("mail.smtp.host", host); // Get the default Session object. Session session = Session.getDefaultInstance(properties); try < // Create a default MimeMessage object. MimeMessage message = new MimeMessage(session); // Set From: header field of the header. message.setFrom(new InternetAddress(from)); // Set To: header field of the header. message.addRecipient(Message.RecipientType.TO, new InternetAddress(to)); // Set Subject: header field message.setSubject("This is the Subject Line!"); // Now set the actual message message.setText("This is actual message"); // Send message Transport.send(message); System.out.println("Sent message successfully. "); >catch (MessagingException mex) < mex.printStackTrace(); >> >
Скомпилируйте и запустите эту программу, чтобы отправить простое электронное письмо –
Итог
$ java SendEmail Sent message successfully.
Если вы хотите отправить электронное письмо нескольким получателям, то для указания нескольких идентификаторов электронной почты будут использованы следующие методы:
void addRecipients(Message.RecipientType type, Address[] addresses) throws MessagingException
Вот описание параметров –
- type – Это будет установлено в TO, CC или BCC. Здесь CC представляет Carbon Copy, а BCC представляет Black Carbon Copy. Пример:
Message.RecipientType.TO
- addresses – это массив адресов электронной почты. Вам нужно будет использовать метод InternetAddress() при указании идентификаторов электронной почты.
Отправить HTML письмо
Вот пример отправки электронной почты в формате HTML с вашего компьютера. Здесь предполагается, что ваш локальный хост подключен к Интернету и достаточно способен отправлять электронную почту. Этот пример очень похож на предыдущий, за исключением того, что здесь мы используем метод setContent() для установки содержимого, вторым аргументом которого является «text / html», чтобы указать, что содержимое HTML включено в сообщение.
Используя этот пример, вы можете отправить настолько большой, насколько вам нравится, контент HTML.
Пример
// File Name SendHTMLEmail.java import java.util.*; import javax.mail.*; import javax.mail.internet.*; import javax.activation.*; public class SendHTMLEmail < public static void main(String [] args) < // Recipient's email ID needs to be mentioned. String to = "abcd@gmail.com"; // Sender's email ID needs to be mentioned String from = "web@gmail.com"; // Assuming you are sending email from localhost String host = "localhost"; // Get system properties Properties properties = System.getProperties(); // Setup mail server properties.setProperty("mail.smtp.host", host); // Get the default Session object. Session session = Session.getDefaultInstance(properties); try < // Create a default MimeMessage object. MimeMessage message = new MimeMessage(session); // Set From: header field of the header. message.setFrom(new InternetAddress(from)); // Set To: header field of the header. message.addRecipient(Message.RecipientType.TO, new InternetAddress(to)); // Set Subject: header field message.setSubject("This is the Subject Line!"); // Send the actual HTML message, as big as you like message.setContent("This is actual message
", "text/html"); // Send message Transport.send(message); System.out.println("Sent message successfully. "); > catch (MessagingException mex) < mex.printStackTrace(); >> >
Скомпилируйте и запустите эту программу для отправки электронного письма в формате HTML –
Итог
$ java SendHTMLEmail Sent message successfully.
Отправить вложение в E-mail
Вот пример, чтобы отправить электронное письмо с вложением с вашего компьютера. Здесь предполагается, что ваш локальный хост подключен к Интернету и достаточно способен отправлять электронную почту.
Пример
// File Name SendFileEmail.java import java.util.*; import javax.mail.*; import javax.mail.internet.*; import javax.activation.*; public class SendFileEmail < public static void main(String [] args) < // Recipient's email ID needs to be mentioned. String to = "abcd@gmail.com"; // Sender's email ID needs to be mentioned String from = "web@gmail.com"; // Assuming you are sending email from localhost String host = "localhost"; // Get system properties Properties properties = System.getProperties(); // Setup mail server properties.setProperty("mail.smtp.host", host); // Get the default Session object. Session session = Session.getDefaultInstance(properties); try < // Create a default MimeMessage object. MimeMessage message = new MimeMessage(session); // Set From: header field of the header. message.setFrom(new InternetAddress(from)); // Set To: header field of the header. message.addRecipient(Message.RecipientType.TO,new InternetAddress(to)); // Set Subject: header field message.setSubject("This is the Subject Line!"); // Create the message part BodyPart messageBodyPart = new MimeBodyPart(); // Fill the message messageBodyPart.setText("This is message body"); // Create a multipar message Multipart multipart = new MimeMultipart(); // Set text message part multipart.addBodyPart(messageBodyPart); // Part two is attachment messageBodyPart = new MimeBodyPart(); String filename = "file.txt"; DataSource source = new FileDataSource(filename); messageBodyPart.setDataHandler(new DataHandler(source)); messageBodyPart.setFileName(filename); multipart.addBodyPart(messageBodyPart); // Send the complete message parts message.setContent(multipart ); // Send message Transport.send(message); System.out.println("Sent message successfully. "); >catch (MessagingException mex) < mex.printStackTrace(); >> >
Скомпилируйте и запустите эту программу для отправки электронного письма в формате HTML –
Итог
$ java SendFileEmail Sent message successfully.
Часть аутентификации пользователя
Если для аутентификации требуется предоставить идентификатор пользователя и пароль для сервера электронной почты, вы можете установить эти свойства следующим образом:
props.setProperty("mail.user", "myuser"); props.setProperty("mail.password", "mypwd");
Остальная часть механизма отправки электронной почты останется такой, как описано выше.
Средняя оценка 5 / 5. Количество голосов: 1
Спасибо, помогите другим — напишите комментарий, добавьте информации к статье.
Или поделись статьей
Видим, что вы не нашли ответ на свой вопрос.
Помогите улучшить статью.
Напишите комментарий, что можно добавить к статье, какой информации не хватает.
Программируем вместе
JavaMail API – это свободно распространяемая библиотека, с помощью которой приложение может получать доступ к почтовым серверам, позволяя создавать, отправлять и получать электронные письма, в том числе и с вложениями, а также удалять письма с сервера.
Данная библиотека поддерживает следующие протоколы:
- SMTP, сокращение от Simple Mail Transfer Protocol, протокол, который определяет механизм для доставки электронной почты. Любой клиент электронной почты, при передаче почты, соединяется с сервером SMTP, который, в свою очередь, доставляет сообщение на сервер SMTP получателя. А затем получатель извлекает сообщение с помощью POP или IMAP.
- POP, сокращение от Post Office Protocol. В настоящее время его третья версия известна как POP3. Большинство почтовых серверов используют этот протокол, чтобы обеспечить получение сообщений пользователем. В действительности POP3 гарантирует лишь, что каждый пользователь имеет свой собственный почтовый ящик.
- IMAP, сокращение от Internet Message Access Protocol. Представляет собой более продвинутый протокол для получения сообщений. При использовании IMAP, почтовый сервер должен поддерживать этот протокол. IMAP предоставляет клиентскому приложению доступ к удаленным хранилищам сообщений, как если бы они были локальные. По сравнению с POP, IMAP значительно сильнее нагружает сервер.
Для понимания принципов использования библиотеки JavaMail API необходимо определить несколько ключевых понятий:
Message — абстрактный класс, который представляет собой сообщения электронной почты. JavaMail реализует RFC822 и MIME стандарты обмена сообщениями. MimeMessage класс расширяет Message для работы с сообщениями, имеющими MIME-тип.
Структура сообщения:
- Простое сообщение имеет один объект контента:
- Multipart сообщение представляет собой контейнер объектов BodyPart. Структура BodyPart объекта похожа на структуру Message объекта. Каждый объект BodyPart содержит атрибуты и содержимое, но атрибуты Bodypart объекта ограничиваются теми, которые определены в интерфейсе Part. Содержимое BodyPart объекта – это DataHandler, который содержит либо данные или другой Multipart объект.
Store — абстрактный класс, который представляет собой хранилище сообщений поддерживаемых почтовым сервером и сгруппированных по владельцу. Store использует отдельный протокол доступа.
Folder — абстрактный класс, который предоставляет возможность иерархически организовывать сообщения. Папки могут содержать сообщения и другие папки. Почтовый сервер по умолчанию предоставляет каждому пользователю папку, а пользователи обычно, создают и заполняют вложенные подпапки.
Transport — абстрактный класс, который представляет собой спецификацию протокола передачи. Transport использует объект конкретного протокола передачи, чтобы отправить сообщение.
Session — класс, который определяет основные сессии почты. Чтобы передать значения в объект сессии, могут быть использованы Properties.
Authenticator – класс, который обеспечивает доступ к защищенным ресурсам с помощью имени пользователя и пароля. Ресурсами, может быть что угодно, начиная от простых файлов на серверах. Для JavaMail, ресурс – это сервер. Приложения используют этот класс при получении сессии. Когда требуется авторизация, система будет вызывать метод подкласса (например, getPasswordAuthentication). Этот метод подкласса может делать запросы аутентификации.
Ну а теперь пришло время посмотреть, как все это работает.
Скачиваем библиотеку тут и импортируем ее в проект:
http://www.oracle.com/technetwork/java/index-138643.html
Теперь посмотрим, как с помощью JavaMail API можно отправлять простые сообщения:
package ru.quizful; import javax.mail.*; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import java.io.UnsupportedEncodingException; import java.util.Properties; public class TestMail < static final String ENCODING = "UTF-8"; public static void main(String args[]) throws MessagingException, UnsupportedEncodingException < String subject = "Subject"; String content = "Test"; String smtpHost="smtp.rambler.ru"; String address="test@rambler.ru"; String login="test"; String password="test"; String smtpPort="25"; sendSimpleMessage (login, password, address, address, content, subject, smtpPort, smtpHost); > public static void sendSimpleMessage(String login, String password, String from, String to, String content, String subject, String smtpPort, String smtpHost) throws MessagingException, UnsupportedEncodingException < Authenticator auth = new MyAuthenticator(login, password); Properties props = System.getProperties(); props.put("mail.smtp.port", smtpPort); props.put("mail.smtp.host", smtpHost); props.put("mail.smtp.auth", "true"); props.put("mail.mime.charset", ENCODING); Session session = Session.getDefaultInstance(props, auth); Message msg = new MimeMessage(session); msg.setFrom(new InternetAddress(from)); msg.setRecipient(Message.RecipientType.TO, new InternetAddress(to)); msg.setSubject(subject); msg.setText(content); Transport.send(msg); > > class MyAuthenticator extends Authenticator < private String user; private String password; MyAuthenticator(String user, String password) < this.user = user; this.password = password; > public PasswordAuthentication getPasswordAuthentication() < String user = this.user; String password = this.password; return new PasswordAuthentication(user, password); > >
Итак, сначала нам необходимо узнать параметры почтового сервера с которого мы будем отправлять письмо, а именно надо узнать хост SMTP протокола и его порт (обычно это 25 порт). Далее указываем свои существующие данные для авторизации на сервере, а также адрес получателя (в моем примере я для простоты отправлял письмо самому себе).
Для отправки письма нам необходимо:
- получить текущую сессию
- создать новое сообщение
- установить поля сообщения
- отправить его
Для получения сессии используется метод Session.getDefaultInstance(Properties props, Authenticator authenticator) который возвращает объект сессии по умолчанию. Если по умолчанию он до сих пор не установлен, то новый объект сессии будет создан и установлен как объект по умолчанию.
Параметр props – атрибуты новой сессии
Параметр authenticator – объект Authenticator, который используется для того, чтобы проверить права доступа пользователя.
После получения сессии можно создать новое сообщение и задать его поля. Далее все просто – отправляем наше сообщение с помощью статического метода класса Transport.
Теперь попробуем отправить Multipart сообщение, а именно письмо с вложением. Вот вариант реализации:
package ru.quizful; import javax.activation.DataHandler; import javax.activation.DataSource; import javax.activation.FileDataSource; import javax.mail.*; import javax.mail.internet.*; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.Properties; public class TestMail < static final String ENCODING = "UTF-8"; public static void main(String args[]) throws MessagingException, UnsupportedEncodingException < String subject = "Subject"; String content = "Test"; String smtpHost="smtp.rambler.ru"; String address="test@rambler.ru"; String login="test"; String password="test"; String smtpPort="25"; String attachment = "c:/attach.jpg"; sendMultiMessage(login, password, address, address, content, subject, attachment, smtpPort, smtpHost); > public static void sendSimpleMessage(String login, String password, String from, String to, String content, String subject, String smtpPort, String smtpHost) throws MessagingException, UnsupportedEncodingException < Properties props = System.getProperties(); props.put("mail.smtp.port", smtpPort); props.put("mail.smtp.host", smtpHost); props.put("mail.smtp.auth", "true"); props.put("mail.mime.charset", ENCODING); Authenticator auth = new MyAuthenticator(login, password); Session session = Session.getDefaultInstance(props, auth); Message msg = new MimeMessage(session); msg.setFrom(new InternetAddress(from)); msg.setRecipient(Message.RecipientType.TO, new InternetAddress(to)); msg.setSubject(subject); msg.setText(content); Transport.send(msg); > public static void sendMultiMessage(String login, String password, String from, String to, String content, String subject, String attachment, String smtpPort, String smtpHost) throws MessagingException, UnsupportedEncodingException < Properties props = System.getProperties(); props.put("mail.smtp.port", smtpPort); props.put("mail.smtp.host", smtpHost); props.put("mail.smtp.auth", "true"); props.put("mail.mime.charset", ENCODING); Authenticator auth = new MyAuthenticator(login, password); Session session = Session.getDefaultInstance(props, auth); MimeMessage msg = new MimeMessage(session); msg.setFrom(new InternetAddress(from)); msg.setRecipient(Message.RecipientType.TO, new InternetAddress(to)); msg.setSubject(subject, ENCODING); BodyPart messageBodyPart = new MimeBodyPart(); messageBodyPart.setContent(content, "text/plain; charset java__string" style="box-sizing: border-box; color: teal;">""); Multipart multipart = new MimeMultipart(); multipart.addBodyPart(messageBodyPart); MimeBodyPart attachmentBodyPart = new MimeBodyPart(); DataSource source = new FileDataSource(attachment); attachmentBodyPart.setDataHandler(new DataHandler(source)); attachmentBodyPart.setFileName(MimeUtility.encodeText(source.getName())); multipart.addBodyPart(attachmentBodyPart); msg.setContent(multipart); Transport.send(msg); > > class MyAuthenticator extends Authenticator < private String user; private String password; MyAuthenticator(String user, String password) < this.user = user; this.password = password; > public PasswordAuthentication getPasswordAuthentication() < String user = this.user; String password = this.password; return new PasswordAuthentication(user, password); > >
Для отправки письма с вложением необходимо:
- получить текущую сессию
- создать новое сообщение
- установить основные поля сообщения
- добавить в сообщение часть с текстом письма
- добавить в сообщение часть с вложением
- отправить сообщение
Итак, ищем отличия. Во-первых, в методе main появился еще один параметр – attachment, содержащий путь к файлу который будет во вложении. Во-вторых, изменилось формирование письма, изучим его подробнее.
Также как и в предыдущем примере сначала мы получаем текущую сессию и создаем экземпляр MimeMessage, затем указываем основные параметры письма. Но теперь письмо состоит из двух частей:
- Первая часть содержит в себе контент – т.е содержимое письма (его текст). При этом для правильного отображения необходимо указать тип контента и его кодировку во избежание получения непонятных кракозябр в письме. Первая часть добавляется к сообщению.
- Вторая часть должна содержать в себе вложение. Для этого мы получаем источник данных (DataSource) нужного файла и устанавливаем его в качестве DataHandler, также указываем имя файла. MimeUtility использована для ликвидации все тех же проблем с кодировкой. Добавляем вторую часть к сообщению.
Отправляем готовое сообщение все тем же незамысловатым методом.
Теперь давайте получим письма которые мы сами себе отправили!
Тут все немного сложнее…
package ru.quizful; import javax.activation.DataHandler; import javax.activation.DataSource; import javax.activation.FileDataSource; import javax.mail.*; import javax.mail.internet.*; import javax.mail.search.FlagTerm; import java.io.*; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.LinkedList; import java.util.Properties; public class TestMail < static final String ENCODING = "UTF-8"; public static void main(String args[]) throws MessagingException, IOException < String subject = "Subject"; String content = "Test"; String smtpHost="smtp.rambler.ru"; String address="test@rambler.ru"; String login="test"; String password="test"; String smtpPort="25"; String pop3Host="pop3.rambler.ru"; receiveMessage(login, password, pop3Host); > public static void receiveMessage(String user, String password, String host) throws MessagingException, IOException < Authenticator auth = new MyAuthenticator(user, password); Properties props = System.getProperties(); props.put("mail.user", user); props.put("mail.host", host); props.put("mail.debug", "false"); props.put("mail.store.protocol", "pop3"); props.put("mail.transport.protocol", "smtp"); Session session = Session.getDefaultInstance(props, auth); Store store = session.getStore(); store.connect(); Folder inbox = store.getFolder("INBOX"); inbox.open(Folder.READ_WRITE); Message[] messages = inbox.search(new FlagTerm(new Flags(Flags.Flag.SEEN), false)); ArrayList attachments = new ArrayList(); LinkedList listMessages = getPart(messages, attachments); inbox.setFlags(messages, new Flags(Flags.Flag.SEEN), true); inbox.close(false); store.close(); > private static LinkedList getPart(Message[] messages, ArrayList attachments) throws MessagingException, IOException < LinkedListlistMessages = new LinkedList(); SimpleDateFormat f = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss"); for (Message inMessage : messages) < attachments.clear(); if (inMessage.isMimeType("text/plain")) < MessageBean message = new MessageBean(inMessage.getMessageNumber(), MimeUtility.decodeText(inMessage.getSubject()), inMessage.getFrom()[0].toString(), null, f.format(inMessage.getSentDate()), (String) inMessage.getContent(), false, null); listMessages.add(message); > else if (inMessage.isMimeType("multipart/*")) < Multipart mp = (Multipart) inMessage.getContent(); MessageBean message = null; for (int i = 0; i < mp.getCount(); i++) < Part part = mp.getBodyPart(i); if ((part.getFileName() == null || part.getFileName() == "") && part.isMimeType("text/plain")) < message = new MessageBean(inMessage.getMessageNumber(), inMessage.getSubject(), inMessage.getFrom()[0].toString(), null, f.format(inMessage.getSentDate()), (String) part.getContent(), false, null); > else if (part.getFileName() != null || part.getFileName() != "")< if ((part.getDisposition() != null) && (part.getDisposition().equals(Part.ATTACHMENT))) < attachments.add(saveFile(MimeUtility.decodeText(part.getFileName()), part.getInputStream())); if (message != null) message.setAttachments(attachments); > > > listMessages.add(message); > > return listMessages; > private static String saveFile(String filename, InputStream input) < String path = "attachments\\"+filename; try < byte[] attachment = new byte[input.available()]; input.read(attachment); File file = new File(path); FileOutputStream out = new FileOutputStream(file); out.write(attachment); input.close(); out.close(); return path; > catch (IOException e) < e.printStackTrace(); >return path; > > class MyAuthenticator extends Authenticator < private String user; private String password; MyAuthenticator(String user, String password) < this.user = user; this.password = password; > public PasswordAuthentication getPasswordAuthentication() < String user = this.user; String password = this.password; return new PasswordAuthentication(user, password); > > И еще один класс: package ru.quizful; import java.io.Serializable; import java.util.ArrayList; public class MessageBean implements Serializable < private String subject; private String from; private String to; private String dateSent; private String content; private boolean isNew; private int msgId; private ArrayList attachments; public MessageBean(int msgId, String subject, String from, String to, String dateSent, String content, boolean isNew, ArrayList attachments) < this.subject = subject; this.from = from; this.to = to; this.dateSent = dateSent; this.content = content; this.isNew = isNew; this.msgId = msgId; this.attachments = attachments; > public String getSubject() < return subject; > public void setSubject(String subject) < this.subject = subject; > public String getFrom() < return from; > public void setFrom(String from) < this.from = from; > public String getDateSent() < return dateSent; > public void setDateSent(String dateSent) < this.dateSent = dateSent; > public String getContent() < return content; > public void setContent(String content) < this.content = content; > public String getTo() < return to; > public void setTo(String to) < this.to = to; > public boolean isNew() < return isNew; > public void setNew(boolean aNew) < isNew = aNew; >public int getMsgId() < return msgId; > public void setMsgId(int msgId) < this.msgId = msgId; > public ArrayList getAttachments() < return attachments; > public void setAttachments(ArrayList attachments) < this.attachments = new ArrayList(attachments); > >
Итак, о том, что тут делается. Для начала определим общую идею как все должно работать в теории и что для этого необходимо:
- получаем текущую сессию
- получаем доступ к хранилищу сообщений
- получаем доступ к папке входящих сообщений в этом хранилище
- извлекаем из папки все сообщения и начинаем их обработку, т.е извлечение полей сообщений
- закрываем за собой папку и хранилище
Что нового в коде:
- Появился класс MessageBean – это бин в который мы будем сохранять данные из сообщения. Это сделано для удобства ибо в результате выполнения данного метода вы получите аккуратную коллекцию входящих сообщений с которыми можете потом делать что хотите.
- Появился метод getPart, в котором собственно выполняется обработка полученных сообщений, а именно: проверка типа сообщения, в соответствии с которым потом извлекается его содержимое, также данный метод формирует список экземпляров бина сообщения, который собственно и возвращается главному методу.
- Появился метод saveFile который сохраняет вложения из писем в каталог attachments. Тут все просто, так что описывать в подробностях не буду.
- Появился новый параметр pop3Host который содержит хост POP3 протокола, для входящей почты.
Приступим к более детальному осмотру кода.
Сначала как всегда мы получаем текущую сессию (обратите внимание что свойства, которые мы передаем внутрь метода getDefaultInstance, изменились). После этого из сессии мы получаем хранилище и подключаемся к нему используя метод connect класса Service. Далее мы можем получить из хранилища папку с входящими сообщениями используя метод getFolder, в данном случае мы получаем папку по ее имени. Этот метод по умолчанию возвращает нам закрытую папку, поэтому мы открываем ее на чтение и запись.
Теперь у нас есть доступ к папке. В данном примере, для того чтобы получить письма из папки я использовал поиск внутри каталога, критерием поиска был флаг письма, показывающий, что оно новое и еще не было прочитано, но на серверах POP3 эта функция не поддерживается (возвращаются вообще все письма), так что для получения писем можно использовать простой метод inbox.getMessages(); Оба этих метода возвращают массив сообщений, который передается внутрь метода getPart(), в котором, как уже было сказано выше выполняется проверка типа сообщения:
— Если это простое сообщение, то создается экземпляр бина, поля которого инициализируется содержимым сообщения
— Если это Multipart сообщение, то мы получаем содержимое письма как Multipart и начинаем просматривать части сообщений:
- Если часть содержит простой контент, то он сохраняется в полях бина
- Если часть содержит вложение, то выполняется метод saveFile(), который сохраняет вложение, а путь к нему сохраняет в бине.
Ну что ж, осталось только удалить за собой письма с сервера…
public class TestMail < static final String ENCODING = "UTF-8"; public static void main(String args[]) throws MessagingException, IOException < String subject = "Subject"; String content = "Test"; String smtpHost="smtp.rambler.ru"; String address="test@rambler.ru"; String login="test"; String password="test"; String smtpPort="25"; String pop3Host="pop3.rambler.ru"; deleteMessage(login, password, pop3Host, 1); > public static void deleteMessage(String user, String password, String host, int n) throws MessagingException, IOException < Authenticator auth = new MyAuthenticator(user, password); Properties props = System.getProperties(); props.put("mail.user", user); props.put("mail.host", host); props.put("mail.debug", "false"); props.put("mail.store.protocol", "pop3"); props.put("mail.transport.protocol", "smtp"); Session session = Session.getDefaultInstance(props, auth); Store store = session.getStore(); store.connect(); Folder inbox = store.getFolder("INBOX"); inbox.open(Folder.READ_WRITE); inbox.setFlags(n, n, new Flags(Flags.Flag.DELETED), true); inbox.close(true); store.close(); > >
Что надо сделать для удаления письма:
- получаем текущую сессию
- получаем доступ к хранилищу сообщений
- получаем доступ к папке входящих сообщений в этом хранилище
- устанавливаем флаг сообщения DELETED = true
- обязательно закрываем за собой папку и хранилище
В общем, то расписывать тут нечего, единственное могу поругаться на неудобную установку флага. Потому что он устанавливается, в данном случае по номеру сообщения, а чтобы его узнать надо снова получить все письма с сервера и посмотреть текущий номер нужного нам сообщения. Эту часть я опустил, так как она вся была описана выше. Номер сообщения можно получить с помощью метода getMessageNumber(). Итак зная номер сообщения мы устанавливаем у него флаг и все…теперь главное не забыть закрыть папку и хранилище, ибо именно в этот момент происходит удаление.
На этом я заканчиваю. Поэкспериментировать с протоколом IMAP увы не получилось, так как негде было тестировать код. Да и подустал я что-то, так что оставляю это вам.
Пользуясь всем этим великолепием мне удалось смастерить некое подобие почтового клиента, изготовленного во славу этого замечательного сайта. И клиент этот даже работает. по крайней мере у меня. Вот как он выглядит:
Как отправить Email в Java?
Давайте разберемся, как отправить email в Java используя почтовый сервер Google Gmail.
Как я уже говорил отправлять мы будем через почтовый сервер Gmail.
Для этого нам нужны данные Outgoing Mail (SMTP) Server:
Host: smtp.gmail.com Use Authentication: Yes Port for TLS/STARTTLS: 587 Port for SSL: 465
И уже с их помощью мы можем обращаться к серверу Gmail.
Немного теории Wiki
TLS (Transport Layer Security) — криптографические протоколы, обеспечивающие защищённую передачу данных между узлами в сети Интернет, TLS и SSL используют асимметричную криптографию для обмена ключами, симметричное шифрование для конфиденциальности и коды аутентичности сообщений для сохранения целостности сообщений.
SSL (Secure Sockets Layer — уровень защищённых сокетов) — криптографический протокол, который обеспечивает безопасность связи. Он использует асимметричную криптографию для аутентификации ключей обмена, симметричное шифрование для сохранения конфиденциальности, коды аутентификации сообщений для целостности сообщений. Протокол широко используются для обмена мгновенными сообщениями и передачи голоса через IP, в таких приложениях, как электронная почта, Интернет-факс и др.
Мы попробуем отправить сообщение оба способами.
Шаг 1
Создаем maven проект и называем его SendMail.
И добавляем в него зависимость библиотеки JavaMail API:
javax.mail 1.4
Шаг 2
После создаем в нем пакет com.devcolibri.tls и тут создадим класс Sender.java:
package com.devcolibri.tls; import java.util.Properties; import javax.mail.*; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; public class Sender < private String username; private String password; private Properties props; public Sender(String username, String password) < this.username = username; this.password = password; 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"); >public void send(String subject, String text, String fromEmail, String toEmail) < Session session = Session.getInstance(props, new Authenticator() < protected PasswordAuthentication getPasswordAuthentication() < return new PasswordAuthentication(username, password); >>); try < Message message = new MimeMessage(session); //от кого message.setFrom(new InternetAddress(username)); //кому message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(toEmail)); //Заголовок письма message.setSubject(subject); //Содержимое message.setText(text); //Отправляем сообщение Transport.send(message); >catch (MessagingException e) < throw new RuntimeException(e); >> >
В строке 21 мы активируем протокол TLS.
Шаг 3
Теперь попробуем написать отправку по протоколу SSL.
Создаем пакет com.devcolibri.ssl и тут создадим класс Sender.java:
package com.devcolibri.ssl; import javax.mail.*; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import java.util.Properties; public class Sender < private String username; private String password; private Properties props; public Sender(String username, String password) < this.username = username; this.password = password; props = new Properties(); props.put("mail.smtp.host", "smtp.gmail.com"); props.put("mail.smtp.socketFactory.port", "465"); props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); props.put("mail.smtp.auth", "true"); props.put("mail.smtp.port", "465"); >public void send(String subject, String text, String fromEmail, String toEmail) < Session session = Session.getDefaultInstance(props, new Authenticator() < protected PasswordAuthentication getPasswordAuthentication() < return new PasswordAuthentication(username, password); >>); try < Message message = new MimeMessage(session); //от кого message.setFrom(new InternetAddress(username)); //кому message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(toEmail)); //тема сообщения message.setSubject(subject); //текст message.setText(text); //отправляем сообщение Transport.send(message); >catch (MessagingException e) < throw new RuntimeException(e); >> >
В строке 21 мы указываем, что будем использовать для отправки протокол SSL.
Шаг 4
Тестируем отправку сообщение оба протоколами:
package com.devcolibri; public class Main < private static com.devcolibri.tls.Sender tlsSender = new com.devcolibri.tls.Sender("", ""); private static com.devcolibri.ssl.Sender sslSender = new com.devcolibri.ssl.Sender("", ""); public static void main(String[] args) < tlsSender.send("This is Subject", "TLS: This is text!", "support@devcolibri.com", "alex@devcolibri.com"); sslSender.send("This is Subject", "SSL: This is text!", "support@devcolibri.com", "alex@devcolibri.com"); >>
В результате вы увидите на посте следующее:
И содержимое этих писем: