Отправка почты на любой сервер сообщений (Gmail, Yahoo и т. Д.) Без аутентификации по паролю в Java - PullRequest
2 голосов
/ 29 октября 2011

Мы разрабатываем простое веб-приложение на JSF , в которое необходимо включить модуль «забыть пароль». Для наглядности и простоты я попробовал следующий код в сервлете Java. Он может отправлять почту в Gmail и работает нормально, никаких проблем нет. Ниже приведен полный код сервлета.

public class MailClient extends HttpServlet {

    private class SMTPAuthenticator extends Authenticator {

        private PasswordAuthentication authentication;

        public SMTPAuthenticator(String login, String password) {
            authentication = new PasswordAuthentication(login, password);
        }

        @Override
        protected PasswordAuthentication getPasswordAuthentication() {
            return authentication;
        }
    }

    protected void processRequest(HttpServletRequest request,
         HttpServletResponse response) throws ServletException, IOException {

        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {
            String from = "bhaveshp1980@gmail.com";
            String to = "bhaveshp1980@gmail.com";
            String subject = "A mail from Java.";
            String message = "My first mail from Java.";
            String login = "bhaveshp1980@gmail.com";
            String password = "password";

            Properties props = new Properties();
            props.setProperty("mail.host", "smtp.gmail.com");
            props.setProperty("mail.smtp.port", "587");
            props.setProperty("mail.smtp.auth", "true");
            props.setProperty("mail.smtp.starttls.enable", "true");

            Authenticator auth = new SMTPAuthenticator(login, password);
            Session session = Session.getInstance(props, auth);
            MimeMessage msg = new MimeMessage(session);

            try {
                msg.setText(message);
                msg.setSubject(subject);
                msg.setFrom(new InternetAddress(from));
                msg.addRecipient(Message.RecipientType.TO,
                        new InternetAddress(to));
                Transport.send(msg);
            } catch (MessagingException ex) {
                Logger.getLogger(MailClient.class.getName()).
                        log(Level.SEVERE, null, ex);
            }
        } finally {
            out.close();
        }
    }

    @Override
    protected void doGet(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {
        processRequest(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {
        processRequest(request, response);
    }

    @Override
    public String getServletInfo() {
        return "Short description";
    }
}

Теперь вопрос first заключается в том, что как только пользователь вводит свой действующий адрес электронной почты, код подтверждения должен быть отправлен на определенный сервер сообщений (Gmail, Yahoo и т. Д.) без запрашивая у пользователя его пароль (что не относится к приведенному выше коду) , что важно при реализации модуля «забыть пароль» в веб-приложении.

Второй вопрос заключается в том, что приведенный выше код предназначен для отправки почты только в Gmail. Если я хочу отправить письмо на другой сервер сообщений, скажем, Yahoo, заявление

props.setProperty("mail.host", "smtp.gmail.com");

необходимо изменить на

props.setProperty("mail.host", "smtp.mail.yahoo.com"); 

[и порт № тоже, в отношении других] означает, что определенный сервер сообщений, на который должно быть отправлено сообщение, должен быть правильно распознан. Какой лучший способ сделать это? Как лучше всего преодолеть эти проблемы, пожалуйста.

Ответы [ 4 ]

6 голосов
/ 29 октября 2011

Изменяете ли вы свои настройки SMTP в почтовом клиенте каждый раз, когда отправляете почту другому почтовому провайдеру? Нет. Вы не устанавливаете SMTP-сервер на gmail при отправке почты на адрес gmail.com. И затем установите его на Yahoo при отправке почты на адрес Yahoo! Вы устанавливаете ваш SMTP-сервер почтового провайдера, и этот SMTP-сервер отправляет почту в соответствующее местоположение.

Просто выберите SMTP-сервер, который соглашается отправлять почту из вашего приложения. Отправка дюжины в день будет в порядке с любым поставщиком SMTP. Но если вы отправляете тысячи в день, у вас могут возникнуть проблемы с вашим провайдером. Просто спросите у своего хостинг-провайдера, как он работает с исходящей почтой (сколько это стоит, сколько в день принимается, есть ли ограничение пропускной способности и т. Д.)

0 голосов
/ 29 октября 2011

Часть аутентификации, которую вы не можете обойти. Это настраивается на удаленном сервере, поэтому, если вы не используете свой собственный почтовый сервер, вы должны делать то, что просит gmail. Но вместо жесткого кодирования логина / пароля вы можете сохранить их в (зашифрованном?) Файле свойств и изменить его, когда захотите использовать другой почтовый сервер.

0 голосов
/ 29 октября 2011

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

Вам необходимо настроить SMTP-сервер или разместить свой домен на почтовом сервисе, через который вы можете отправлять почту. Может быть, ваш провайдер или провайдер хостинга уже предоставляют это, и вам просто нужно подписаться на это. В противном случае есть много мест, которые позволят вам отправлять почту с вашего домена. Я использую:

http://www.authsmtp.com/

Или вы можете разместить свой домен на Google бесплатно, но они накладывают ограничение на количество сообщений, которые вы можете отправлять в день, в прошлый раз, когда я проверял, было около 100. Так что, если ваш сайт планирует отправлять больше почты, чем вы нужно перейти на платный сервис, как authsmtp.

http://www.google.com/apps/intl/en/business/smb/email.html#utm_campaign=en&utm_source=en-ha-na-us-sk&utm_medium=ha&utm_term=%2Bemail%20%2Bhosting

По сути, вам нужно найти почтовый сервер, который отвечает за вашу запись MX, чтобы письма, отправленные на ваш домен, были перенаправлены на эти серверы, и чтобы ваше приложение могло отправлять почту с вашего домена, а не попадать в черный список спамеров потому что ты делаешь непослушные вещи.

Хотя вы можете настроить свой собственный SMTP-сервер, гораздо проще использовать службу, и это дает вам профессиональный взгляд на такие вещи, как обслуживание клиентов и реагирование на людей, когда ваша почта приходит с домена, связанного с вашим сайтом. а не какой-то johnnyappleseed@gmail.com

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

0 голосов
/ 29 октября 2011
  1. Вам необходимо сгенерировать случайный токен и отправить его как часть сообщение. Вы храните токен в базе данных с ассоциацией профиль пользователя. Когда пользователь возвращается на ваш сайт с этим токен (введя его в форму или нажав на ссылку с этим токен в качестве параметра GET) вы можете быть уверены, что пользователь является подлинным и предложить диалог сброса пароля.
  2. Не отправлять сообщение на сервер SMTP получателя, а Сервер SMTP вашего с адреса электронной почты. Так что отправив его в Gmail было бы хорошо. Я бы сделал stmp host url, имя пользователя и пароль настраиваемый, например в файле свойств.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...