Java Mail API маршрутизирует электронные письма без изменения заголовка FROM

У меня есть 2 адреса электронной почты, и я хочу перенаправлять (автоматически пересылать) все свои письма с одного адреса электронной почты на другой. К сожалению, эта функция в моем почтовом клиенте перестала работать, и я хотел создать небольшое консольное приложение, которое будет проверять мою электронную почту и автоматически пересылать ее каждые 10 минут.

Я начал разработку консольного приложения на Java с использованием Java Mail API, но у меня возникла проблема с установкой соответствующего заголовка FROM. Когда я устанавливаю исходный адрес электронной почты FROM и пытаюсь отправить электронное письмо, SMTP выдает и исключение: SMTP mail FROM does not match authenticated user name.

Это кажется логичным, потому что таким образом я могу подделать отправителей адресов электронной почты, но я не хочу, чтобы электронные письма приходили на другие электронные письма, как будто они были отправлены мной. Это необходимо по нескольким причинам:

  1. Удобство чтения
  2. Когда я хочу ответить на электронное письмо, я хочу иметь возможность ответить своему первоначальному отправителю, а не себе

Я добился этого в контактной форме на своем веб-сайте с помощью PHP, но я не знаю, как это сделать на Java.


Постараюсь объяснить ситуацию проще.

Я отправляю 2 письма: [email protected] и [email protected]

Теперь письмо приходит с [email protected] на [email protected]

Я хочу переслать письмо от [email protected] к [email protected], но когда письмо приходит на [email protected] в заголовке ОТ, я хочу видеть, что оно пришло от [email protected] (НЕ от [email protected])

Мой вопрос: возможно ли это, и если да, то как я могу установить заголовок FROM в качестве исходного отправителя.

Это мой код:

public class ForwardMailService {

    public static void forward() {
        String popHost = "pop.a.com";
        String popPort = "110"; // 995 SSL

        String imapHost = "imap.a.com";
        String imapPort = "143"; // 993 SSL

        String smtpHost = "smtp.a.com";
        String smtpPort = "25";

        String user = "USERNAME";
        String password = "PASSWORD";

        Properties properties = new Properties();

        properties.put("mail.store.protocol", "imap");
        properties.put("mail.imap.host", imapHost);
        properties.put("mail.imap.port", imapPort);
        properties.put("mail.imap.starttls.enable", "true");

        properties.put("mail.smtp.auth", "true");
        properties.put("mail.smtp.host", smtpHost);
        properties.put("mail.smtp.port", smtpPort);

        Session session = Session.getDefaultInstance(properties);

        try {
            Store store = session.getStore("imap");
            store.connect(imapHost, user, password);

            Folder folder = store.getFolder("inbox");
            folder.open(Folder.READ_ONLY);

            SearchTerm searchTerm = new SentDateTerm(ComparisonTerm.GE, new Date());
            Message[] messages = folder.search(searchTerm);
            if (messages.length != 0) {
                for(Message message : messages) {                    
                    String from = InternetAddress.toString(message.getFrom());
                    String replyTo = InternetAddress.toString(message.getReplyTo());
                    String to = InternetAddress.toString(message.getRecipients(Message.RecipientType.TO));
                    String subject = message.getSubject();
                    Date sentDate = message.getSentDate();

                    Message forward = new MimeMessage(session);
                    forward.setRecipients(Message.RecipientType.TO, InternetAddress.parse("[email protected]));
                    forward.setSubject("Fwd: " + message.getSubject());
                    forward.setFrom(new InternetAddress(from));
                    forward.setReplyTo(InternetAddress.parse(replyTo));

                    MimeBodyPart messageBodyPart = new MimeBodyPart();
                    Multipart multipart = new MimeMultipart();
                    messageBodyPart.setContent(message, "message/rfc822");
                    multipart.addBodyPart(messageBodyPart);
                    forward.setContent(multipart);
                    forward.saveChanges();

                    Transport transport = session.getTransport("smtp");
                    try {
                        transport.connect(smtpHost, user, password);
                        transport.sendMessage(forward, forward.getRecipients(Message.RecipientType.TO));
                    } catch(Exception ex) {
                        ex.printStackTrace();
                    } finally {
                        transport.close();
                    }
                }
            }


            folder.close(false);
            store.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

}

Заранее спасибо.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
113
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

От вашего почтового сервера полностью зависит, позволит ли он отправлять почту на [email protected] так, чтобы она не выглядела как отправленная с [email protected]. Большинство серверов этого не допустят.

Более простое решение — прочитать сообщение из папки «Входящие» [email protected] и использовать Folder.appendMessages, чтобы добавить его в папку «Входящие» [email protected], вместо использования Transport.sendMessage для повторной отправки.

Спасибо за Ваш ответ. Я думал сделать то же самое. Я попробую это позже сегодня и вернусь к вам, если это сработает.

anchor 03.06.2019 12:19

Другие вопросы по теме