Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Работа с сетью > javamail


Автор: Bulat 1.9.2006, 15:13
сидел разбирался в маленькой демке, когда перекинул на свою иде:
Код

   public static void receive() throws IOException
     {
        String readstr = dis.readLine();  
        System.out.println("SMTP respons: " + readstr);
     }


то dis.readLine(); сейчас депрекэйтед, а что вместо него тогда сейчас использовать?

Автор: tux 1.9.2006, 15:21
Пардон, а здесь:
Код

String readstr = dis.readLine();

dis - это что?

Автор: Bulat 1.9.2006, 15:26
tux, сорри  smile 
static DataInputStream dis = null;     - получение сообщений

Автор: tux 1.9.2006, 15:37
Так ведь в javadoc написано:
Цитата

As of JDK 1.1, the preferred way to read lines of text is via the BufferedReader.readLine() method.

То есть, вот этот метод - http://java.sun.com/j2se/1.5.0/docs/api/java/io/BufferedReader.html#readLine().

Автор: Tony 2.9.2006, 10:04
Возми DataInput dis=
dis.readLine()

он не депрекэйтед

Автор: Bulat 5.9.2006, 11:51
Это ок.....
вот тут самый простой примерчик, но с такой ошибкой не сталкивался......
Код

package Mail;

import java.util.Properties;

import javax.mail.Session;
import javax.mail.Message;
import javax.mail.Transport;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.InternetAddress;

public class MailTest
{
  static final String ENCODING = "koi8-r";
  static final String FROM = "[email protected]";
  static final String TO = "[email protected]";

  public static void main(String args[]) throws Exception
  {
    Properties mailProps = new Properties();

    mailProps.put("mail.store.protocol","pop3");
    mailProps.put("mail.transport.protocol","smtp");
    mailProps.put("mail.user","myaccount");

    mailProps.put("mail.pop3.host","mail.mydomail.ru");
    mailProps.put("mail.smtp.host","mail.mydomail.ru");

    Session session = Session.getDefaultInstance(mailProps);

    MimeMessage message = new MimeMessage(session);
    message.setFrom(new InternetAddress(FROM));
    message.setRecipient(Message.RecipientType.TO, new InternetAddress(TO));

    message.setSubject("Тестовое письмо",ENCODING);
    message.setText("Текст тестового письма",ENCODING);

    Transport.send(message);
  }

}


Код

Exception in thread "main" java.lang.NoClassDefFoundError: javax/activation/DataSource
    at Mail.MailTest.main(MailTest.java:37)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:585)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:86)

Автор: erka 5.9.2006, 15:25
activation-1.0.2.jar в classpath

Автор: Bulat 12.9.2006, 13:31
Цитата(erka @  5.9.2006,  15:25 Найти цитируемый пост)
activation-1.0.2.jar в classpath 

в стандартных я так понимаю его нет, так у меня тоже, не подскажешь где взять?

Автор: y3u 12.9.2006, 14:55
эхх... когда ж такие вопросы на оффсайтах смотреть будут или у гугла спрашивать ...

http://java.sun.com/products/javamail/downloads/index.html, читай внимательно, там написано и ссылка дана:

Цитата

Note: You will also need the JavaBeans Activation Framework (JAF) extension that provides the javax.activation package. We suggest you use version 1.1 of JAF, the latest release. 

Автор: Bulat 13.9.2006, 08:21
y3u, гугл-то мне как раз и дал только ссылки на подобные посты  smile  и на мой кстати тоже

Автор: Bulat 2.10.2006, 16:16
добью темку smile 

Код

public class MailSend extends java.awt.Component {
    private java.util.List data = new java.util.ArrayList();

    static final String ENCODING = "koi8-r";
    static final String FROM = "[email protected]";
    static String TO = "";

    public MailSend(java.util.List data) {
        this.data = data;

        sendMail();
    }

    public void sendMail() {

        int size = data.size();
        String mailText = String.valueOf(data.get(size - 1));

        java.util.Properties mailProps = new java.util.Properties();

        mailProps.put("mail.store.protocol","pop3");
        mailProps.put("mail.transport.protocol","smtp");
        mailProps.put("mail.user","myaccount");

        mailProps.put("mail.pop3.host","mail.kazan.ru");
        mailProps.put("mail.smtp.host","mail.kazan.ru");


        javax.mail.Session session = javax.mail.Session.getDefaultInstance(mailProps);
        javax.mail.internet.MimeMessage message = new javax.mail.internet.MimeMessage(session);

        for (int i = 0; i < size - 1; i++) {
            TO = String.valueOf(data.get(i));
            try {
                message.setFrom(new javax.mail.internet.InternetAddress(FROM));
                message.setRecipient(javax.mail.Message.RecipientType.TO, new javax.mail.internet.InternetAddress(TO));

                message.setSubject("Информационное письмо",ENCODING);
                message.setText(mailText, ENCODING);

                javax.mail.Transport.send(message);

                javax.swing.JOptionPane op = new javax.swing.JOptionPane("Сообщение на e-mail " + TO + " успешно отправлено");
                javax.swing.JDialog d = op.createDialog(this, "Сообщение о доставке");
                d.repaint();
                d.setVisible(true);
            } catch (Exception e){
                javax.swing.JOptionPane.showMessageDialog(this, e, "Ошибка", javax.swing.JOptionPane.ERROR_MESSAGE);
            }
        }
    }

}


Вот как тут вместо FROM = "[email protected]" сделать FROM = "ОАО Комтат"?

Автор: kkorsakoff 2.10.2006, 17:36
Вообще-то есть вполне опредленный формат e-mail адресов... какой RFC, извините, не помню.
Ты можешь задать как сам адрес, так и его "описание". Но одно "описание" задать нельзя.
Если писать адрес в таком формате
Код

static final String FROM = "ОАО Комтат <[email protected]>";


то многие почтовые программы отобразят именно "ОАО Комтат", но где-нибудь в полном отображении так же укажут <booker-t...>. Ну хотя думаю, тебе и этого хватитsmile

Автор: y3u 2.10.2006, 21:58
Цитата(kkorsakoff @  2.10.2006,  17:36 Найти цитируемый пост)
какой RFC, извините, не помню.


можно найти http://en.wikipedia.org/wiki/Email... блин, оказывается википедия рулит круче гугла!

Автор: Bulat 3.10.2006, 12:58
kkorsakoff, а как быть с кодировкой? если ее не указывать, то вместо "ОАО КОМТАТ" там каракули, если указать "koi8-r", то сам почтовый домен он не воспринимает нормально

Автор: Bulat 3.10.2006, 15:32
Свой предыдущий вопрос решил. И последнее, для тех кто что-то подобное делал: у меня на отправку одного сообщения затрачивается не менее 10-15 секунд, и в целом если адресов будет порядка 1000, то очень долго получается, так вот может есть вариант как-то оптимизировать код. Или это зависит исключительно от сервера и того какая веб служба там стоит? 

Автор: batigoal 3.10.2006, 17:00
А ты переподключаешься, или шлешь по уже установленному соединению?

Автор: kkorsakoff 3.10.2006, 19:47
Поможет только
1. слать в одной сессии (как сказано batigoal)
2. добавить все адреса в CC или BCC. Письмо уйдет разом. Но там есть свои тонкости, чтобы адресаты друг друга не увидели.

Автор: Bulat 4.10.2006, 07:36
Цитата(batigoal @  3.10.2006,  17:00 Найти цитируемый пост)
уже установленному соединению

угу.

Тут еще такая фишка, что и через типичный Bat по нашему почтовому серверу письма медленно отсылаются, но побыстрее чем у меня.

Цитата(kkorsakoff @  3.10.2006,  19:47 Найти цитируемый пост)
добавить все адреса в CC или BCC. Письмо уйдет разом. Но там есть свои тонкости, чтобы адресаты друг друга не увидели. 

А вот можно поподробнее или хотя бы ссылочку smile 

Автор: kkorsakoff 4.10.2006, 13:14
При добавлении адресата, указать Message.RecipientType.BCC и всех адресатов добавить туда. 

Код

Message.addRecipients(Message.RecipientType.BCC, Address[] addresses)


Письмо уйдет быстро и одно точно, но я затрудняюсь сказать, что увидят в поле "адресат" все эти пользователи smile  Возможно себя, возможно всех BCC, а возможно "основого адресата", добавленного как Message.RecipientType.TO. Кстати не забудь одного из адресатов добавить как TO.

Автор: Bulat 9.10.2006, 14:27
Как тады преобразовать java.util.List data = new java.util.ArrayList() в javax.mail.Address[] addresses? Перепробовал с десяток способов, но каждый раз ошибка smile 

Автор: y3u 9.10.2006, 17:25
на эту тему в факу полно информации... Если у тебя в data лежат действительно объекты Address, то делается, к примеру, так:

Код

(Address[])data.toArray(new Address[data.size()]);

Автор: Bulat 10.10.2006, 08:18
y3u, так я тоже пробовал
Код

javax.mail.Address[] addresses = (javax.mail.Address[]) data.toArray(new javax.mail.Address[data.size()]);


но
Цитата

Exception in thread "AWT-EventQueue-0" java.lang.ArrayStoreException
    at java.lang.System.arraycopy(Native Method)
    at java.util.ArrayList.toArray(ArrayList.java:305)
    at MailSender.MailSend.MailSendTest.sendMail(MailSendTest.java:36)
    at MailSender.MailSend.MailSendTest.<init>(MailSendTest.java:20)
    at MailSender.MailInterface.MainForm.ButtonSend.actionPerformed(ButtonSend.java:21)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1849)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2169)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:420)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:258)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:234)
    at java.awt.Component.processMouseEvent(Component.java:5488)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3126)
    at java.awt.Component.processEvent(Component.java:5253)
    at java.awt.Container.processEvent(Container.java:1966)
    at java.awt.Component.dispatchEventImpl(Component.java:3955)
    at java.awt.Container.dispatchEventImpl(Container.java:2024)
    at java.awt.Component.dispatchEvent(Component.java:3803)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4212)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3892)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3822)
    at java.awt.Container.dispatchEventImpl(Container.java:2010)
    at java.awt.Window.dispatchEventImpl(Window.java:1774)
    at java.awt.Component.dispatchEvent(Component.java:3803)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:463)
    at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)


сам список заполняется подобным образом
Код

java.util.List data = new java.util.ArrayList();
for (int i = 0; i < rowCount; i++) {
    data.add(tableAddress.getValueAt(i, 0));
}

Автор: y3u 10.10.2006, 10:46
Код

tableAddress

это что? приведи более полный код

Автор: Bulat 10.10.2006, 11:24
Ок, по названию может не сразу понятно что таблица адресов:
Код

public class ButtonSend extends java.awt.Component implements java.awt.event.ActionListener {
    private javax.swing.JTextArea mailTextArea;
    private javax.swing.JTable tableAddress;

    public ButtonSend(javax.swing.JTextArea mailTextArea, javax.swing.JTable tableAddress) {
        this.mailTextArea = mailTextArea;
        this.tableAddress = tableAddress;
    }

    public void actionPerformed(java.awt.event.ActionEvent ae) {
        String mailText = mailTextArea.getText();
        int rowCount = tableAddress.getRowCount();
        if ((rowCount > 0) && (!mailText.equals(""))) {
            java.util.List data = new java.util.ArrayList();
            for (int i = 0; i < rowCount; i++) {
                data.add(tableAddress.getValueAt(i, 0));
            }
            new MailSender.MailSend.MailSendTest(data);
        } else if (rowCount == 0) {
            javax.swing.JOptionPane.showMessageDialog(this, "Список адресатов пуст", "Ошибка", javax.swing.JOptionPane.ERROR_MESSAGE);
        } else if (mailText.equals("")) {
            javax.swing.JOptionPane.showMessageDialog(this, "Отсутствует текст письма", "Ошибка", javax.swing.JOptionPane.ERROR_MESSAGE);
        }
    }

}


Вообще, через ТО отправляется и все в прядке, а вот если весь список e-mail адресов переводить в тип javax.mail.Address[] проблема.

Автор: y3u 10.10.2006, 11:58
а, ну естественно, у тебя в коллекции стринги, а ты кастишь к Address smile (вот почему надо использовать дженерики)

тебе надо делать не 

Код

        for (int i = 0; i < rowCount; i++) {
                data.add(tableAddress.getValueAt(i, 0));
        }


а

Код

        for (int i = 0; i < rowCount; i++) {
                data.add(new InternetAddress(tableAddress.getValueAt(i, 0)));
        }


еще бы я подобные сравнения 
Код

        mailText.equals("")

заменил бы на

Код

        mailText != null && mailText.trim().length > 0


Автор: Bulat 11.10.2006, 07:31
Цитата(y3u @ 10.10.2006,  11:58)
Код

        for (int i = 0; i < rowCount; i++) {
                data.add(new InternetAddress(tableAddress.getValueAt(i, 0)));
        }


Вот с этого и надо было начинать smile  smile 

Автор: Bulat 17.11.2006, 10:07
вернулся господа к своему детищу, и с таким вопросом, письма на домены, зарегестрированные в нашей почтовой службе отправляются, вот только на иные домены нет, типа на маил.ру и т.п.

Цитата

javax.mail.SendFailedException: Invalid Addresses;
  nested exception is:
    com.sun.mail.smtp.SMTPAddressFailedException: 553 sorry, that domain isn't in my list of allowed rcpthosts (#5.7.1)

    at com.sun.mail.smtp.SMTPTransport.rcptTo(SMTPTransport.java:1196)
    at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:584)
    at javax.mail.Transport.send0(Transport.java:169)
    at javax.mail.Transport.send(Transport.java:98)
    at MailSender.MailSend.MailSend.sendMail(MailSend.java:40)
    at MailSender.MailSend.MailSend.<init>(MailSend.java:14)
    at MailSender.MailInterface.MainForm.ButtonSend.actionPerformed(ButtonSend.java:26)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1849)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2169)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:420)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:258)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:234)
    at java.awt.Component.processMouseEvent(Component.java:5488)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3126)
    at java.awt.Component.processEvent(Component.java:5253)
    at java.awt.Container.processEvent(Container.java:1966)
    at java.awt.Component.dispatchEventImpl(Component.java:3955)
    at java.awt.Container.dispatchEventImpl(Container.java:2024)
    at java.awt.Component.dispatchEvent(Component.java:3803)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4212)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3892)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3822)
    at java.awt.Container.dispatchEventImpl(Container.java:2010)
    at java.awt.Window.dispatchEventImpl(Window.java:1774)
    at java.awt.Component.dispatchEvent(Component.java:3803)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:463)
    at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)
Caused by: com.sun.mail.smtp.SMTPAddressFailedException: 553 sorry, that domain isn't in my list of allowed rcpthosts (#5.7.1)

    at com.sun.mail.smtp.SMTPTransport.rcptTo(SMTPTransport.java:1047)
    ... 30 more



Код

public class MailSend extends java.awt.Component {
    private java.util.List data = new java.util.ArrayList();

    static String MAILTEXT = "";
    static final String ENCODING = "koi8-r";
    static final String FROM = " OAO \"KOMTAT\" <[email protected]>";

    public MailSend(java.util.List data, String mailText) {
        this.data = data;
        MAILTEXT = mailText;

        sendMail();
    }

    public void sendMail() {

        javax.mail.Address[] addresses = (javax.mail.Address[]) data.toArray(new javax.mail.Address[data.size()]);
        java.util.Properties mailProps = new java.util.Properties();

        mailProps.put("mail.store.protocol","pop3");
        mailProps.put("mail.transport.protocol","smtp");
        mailProps.put("mail.user","myaccount");

        mailProps.put("mail.pop3.host","mail.kazan.ru");
        mailProps.put("mail.smtp.host","mail.kazan.ru");

        javax.mail.Session session = javax.mail.Session.getDefaultInstance(mailProps);
        javax.mail.internet.MimeMessage message = new javax.mail.internet.MimeMessage(session);

        try {
            message.setFrom(new javax.mail.internet.InternetAddress(FROM));

            message.addRecipients(javax.mail.Message.RecipientType.BCC, addresses);

            message.setSubject("Информационное письмо",ENCODING);
            message.setText(MAILTEXT, ENCODING);

            javax.mail.Transport.send(message);

            javax.swing.JOptionPane op = new javax.swing.JOptionPane("Рассылка успешно отправлена");
            javax.swing.JDialog d = op.createDialog(this, "Сообщение о доставке");
            d.setVisible(true);
        } catch (Exception e){
            javax.swing.JOptionPane.showMessageDialog(this, e, "Ошибка", javax.swing.JOptionPane.ERROR_MESSAGE);
            e.printStackTrace();
        }
    }

}


так то вроде и понятно отчего ошибка, но как обойти, что дописать не знаю smile 

Автор: kkorsakoff 19.11.2006, 17:02
Тут уже проблема не в java. Твой SMTP сервер не желает отправлять письма на домены вне вашей организации. В принципе можно понять почемуsmile

Варианта три: 
1. найти SMTP сервер, который будет разрешать это делать
2. попросить админа разрешить отправку писем (установив при этом какие-то ограничения, например авторизацию или контроль по ip)
3. разбивать отправку на несколько этапов. Каждый домен (например mail.ru) - коннектишься к почтовому серверу mail.ru, отправляешь письма конкретно на этот домен. И так далее для каждого домена. Узнать адреса почтовых серверов можно при помощи dns (тип записи MX). 

Автор: Bulat 20.11.2006, 13:47
kkorsakoff, но тот же самый TheBat через наш сервер отправляет, а моя прога нет, вот мне и кажется что все же что-то еще есть.......
А линки никакие не можешь дать по этому поводу....

P.S. гугл не предлагать, я там искал, но по этому поводу ничего конкретного smile 

Автор: armixx 9.9.2010, 14:30
Помогите, пожалуйста,  новичку. 
Хочу отправить письма с [email protected] куда-нибудь. Никакого почтового сервера не знаю.
Где взять имя сервера?

Автор: Skipy 9.9.2010, 16:05
Цитата(armixx @ 9.9.2010,  14:30)
Помогите, пожалуйста,  новичку. 
Хочу отправить письма с [email protected] куда-нибудь. Никакого почтового сервера не знаю.
Где взять имя сервера?

Очевидно, у провайдера сервиса почты. Т.е. - inbox.ru: http://mail.ru/pages/help/79.html

Автор: armixx 7.12.2010, 23:07
А кто-нибудь знает как отправить сообщение с форматированным текстом и картинкой в нём? Например, запихнуть в сообщение текст HTML-файла, но так, чтобы и все <img src... уехали.

Автор: kkorsakoff 8.12.2010, 13:04
Что-то вроде
Код

Properties props = new Properties();
        props.setProperty("mail.transport.protocol", "smtp");
        props.setProperty("mail.host", "smtp.mymailserver.com");
        props.setProperty("mail.user", "myuser");
        props.setProperty("mail.password", "mypwd");

        Session mailSession = Session.getDefaultInstance(props, null);
        mailSession.setDebug(true);
        Transport transport = mailSession.getTransport();

        MimeMessage message = new MimeMessage(mailSession);
        message.setSubject("HTML  mail with images");
        message.setFrom(new InternetAddress("[email protected]"));
        message.addRecipient(Message.RecipientType.TO,
             new InternetAddress("[email protected]"));

        //
        // This HTML mail have to 2 part, the BODY and the embedded image
        //
        MimeMultipart multipart = new MimeMultipart("related");

        // first part  (the html)
        BodyPart messageBodyPart = new MimeBodyPart();
        String htmlText = "<H1>Hello</H1><img src=\"cid:image.gif\">";
        messageBodyPart.setContent(htmlText, "text/html");

        // add it
        multipart.addBodyPart(messageBodyPart);
        
        // second part (the image)
        messageBodyPart = new MimeBodyPart();
        DataSource fds = new FileDataSource
          ("C:\\images\\jht.gif");
        messageBodyPart.setDataHandler(new DataHandler(fds));
        messageBodyPart.setHeader("Content-ID","<image.gif>");

        // add it
        multipart.addBodyPart(messageBodyPart);

        // put everything together
        message.setContent(multipart);

        transport.connect();
        transport.sendMessage(message,
            message.getRecipients(Message.RecipientType.TO));
        transport.close();


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)