Java Mail API направляет электронные письма без изменения заголовка FROM - PullRequest
0 голосов
/ 01 июня 2019

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

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

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

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

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


Я попытаюсь объяснить ситуацию более простым способом.

Я ставлю 2 письма: a@a.com и b@b.com

Теперь электронная почта приходит с c@c.com до a@a.com

Я хочу переслать письмо с a@a.com на b@b.com, но когда письмо приходит к b@b.com в заголовке FROM, я хочу видеть, что оно пришло с c@c.com (НЕ с a@a.com)

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

Это мой код:

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("a@a.com));
                    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();
        }
    }

}

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

1 Ответ

1 голос
/ 03 июня 2019

Это полностью зависит от вашего почтового сервера, разрешит ли он вам отправлять почту на b@b.com, а не будет приходить с a@a.com.Большинство серверов не позволяют этого.

Более простое решение - прочитать сообщение из папки «Входящие» a@a.com и использовать Folder.appendMessages, чтобы добавить его в папку «Входящие» на b@b.com вместоиспользуя Transport.sendMessage для повторной отправки.

...