LINUX.ORG.RU

Да, возможно, гуглить по слову javax.mail

Вот пример, правда не standalone а сконфигуренный спрингом бин, да еще и freemarker использующий для шаблонизации, но думаю разберешся

package ru.visang.services;

import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import ru.visang.commons.exceptions.ExpectedException;
import ru.visang.commons.utils.LambdaUtils;

import javax.annotation.PostConstruct;
import javax.mail.*;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.io.File;
import java.io.IOException;
import java.io.StringWriter;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Properties;

import static java.util.stream.Collectors.joining;
import static ru.visang.commons.utils.LambdaUtils.doUnsafe;

/**
 * Email sending service.
 *
 *
 * Created by Antony on 12.11.2014.
 */
@Service
public class NotificationService {

    @Value("${email.smtp.hostname}")
    private String hostname;

    @Value("${email.smtp.port}")
    private Integer port;

    @Value("${email.smtp.login}")
    private String  login;

    @Value("${email.smtp.password}")
    private String password;

    @Value("${email.smtp.use_tls}")
    private Boolean usetls;

    @Value("${email.smtp.use_auth}")
    private Boolean auth;

    @Value("${email.mail.from}")
    private String mailFrom;

    @Value("${email.enabled}")
    private boolean enabled;

    @Value("${email.template.path}")
    private String templateDir;

    private Session session;

    private Configuration fmConfig;

    private Logger log = LoggerFactory.getLogger(getClass());

    @PostConstruct
    protected void init() {
        if (enabled) {
            log.info("=====> Initializing Email notification service.");
            fmConfig = new Configuration();
            fmConfig.setDefaultEncoding("UTF-8");
            try {
                fmConfig.setDirectoryForTemplateLoading(new File(templateDir));
            } catch (IOException e) {
                log.error("======> Cannot set base directory for email notifications templates lookup.", e);
                throw new ExceptionInInitializerError();
            }

            Properties props = new Properties();

            props.put("mail.smtp.auth", auth.toString());
            props.put("mail.smtp.starttls.enable", usetls.toString());
            props.put("mail.smtp.host", hostname);
            props.put("mail.smtp.port", port.toString());

            if (auth) {
                session = Session.getInstance(props, new Authenticator() {
                    @Override
                    protected PasswordAuthentication getPasswordAuthentication() {
                        return new PasswordAuthentication(login, password);
                    }
                });
            } else {
                session = Session.getInstance(props);
            }
        } else {
            log.warn("=====> Email notifications are disabled.");
        }
    }

    /**
     * Enumeration of available notification types.
     */
    public static enum Type {
        FMS_SENT("fms_sent.ftl"), FMS_ACCEPTED("fms_accepted.ftl"), FMS_REJECTED("fms_rejected.ftl");

        private String template;

        Type(String template) {
            this.template = template;
        }

        public String template() {
            return template;
        }
    }

    /**
     * Send notifications to all acceptors
     *
     * @param type Type of notification
     * @param acceptors List of acceptors
     * @param properties Properties that should be substituted in template for this notification type
     */
    public void sendNotifications(Type type, List<String> acceptors, Map<String, Object> properties) {
        if (!enabled) return;

        Objects.requireNonNull(acceptors, "Acceptors list cannot be null.");
        Objects.requireNonNull(properties, "Properties cannot be null.");

        try {
            MimeMessage message = new MimeMessage(session);

            // Set From: header field of the header.
            message.setFrom(new InternetAddress(mailFrom));

            // Set To: header field of the header.
            acceptors.forEach(a -> doUnsafe(() -> message.addRecipient(Message.RecipientType.TO, new InternetAddress(a))));

            // Set Subject: header field
            message.setSubject("Visareg.ru notification!");

            Template template = fmConfig.getTemplate(type.template());

            StringWriter stringWriter = new StringWriter();
            template.process(properties, stringWriter);

            // Send the actual HTML message, as big as you like
            message.setContent(stringWriter.toString(), "text/html");

            // Send message
            Transport.send(message);
        } catch (MessagingException | IOException e) {
            log.error("=====> Error sending notification {} to users: {}. Error: {}", type.name(), acceptors.stream().collect(joining(", ")), e.getMessage());
        } catch (TemplateException e) {
            log.error("=====> Error sending notification {} to users: {}", type.name(), acceptors.stream().collect(joining(", ")), e);
            throw new ExpectedException("Template processing error.", e); //Let us fail if we have an error in template.
        }
    }

}

Nagwal ★★★★
()
Последнее исправление: Nagwal (всего исправлений: 1)
Ответ на: комментарий от Nagwal

Судя по email.smtp.hostname smtp сервер ему все таки нужен, а вопрос был именно в его отсутствии (у меня его тупо нету и заниматся его подъемом не хочется). или я не прав?

kote
() автор топика
Ответ на: комментарий от kote

Вообщем то поднять smtp легче будете чем искать ответ на ваш вопрос. Просто там камней будет побольше в вашем найденом ответе нежели бы вы подняли смтп и работало все как надо. 5 минут дела ssmtp к примеру и еще там пару альтернатив есть не требующих много знаний.Как хотите.

nixbrain
()
Ответ на: комментарий от kote

Зарегистрируйся на любом бесплатном сервисе и будет у тебя SMTP-сервер. Ты хочешь, чтобы у тебя в программе крутился SMTP-сервер? Это плохая идея.

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

Зарегистрируйся на любом бесплатном сервисе и будет у тебя SMTP-сервер.

оно даст отправить с адресом отправителя привязанному к другому домену?

Ты хочешь, чтобы у тебя в программе крутился SMTP-сервер? Это плохая идея.

sendmail как то же работает + php даже под виндами шлет без smtp и тп

kote
() автор топика
Ответ на: комментарий от kote

оно даст отправить с адресом отправителя привязанному к другому домену?

Интересный вопрос, сходу не отвечу. Адрес отправителя не факт, что даст писать. Да и всякие SPF и прочее всё равно кинут такую почту в спам или в мусор, даже если и даст. Надо менять не адрес отправителя, а адрес reply-to.

А на том «другом домене» нет SMTP-сервера, чтобы его использовать, что ли?

sendmail как то же работает + php даже под виндами шлет без smtp и тп

Смысла в этом 0. Такая почта никуда не дойдёт, её любой почтовик отправит в спам. Потому что «под виндами без smtp» письма шлют в основном вирусы.

Думаю, то, что ты хочешь, в Java добиться можно. Надо поискать библиотеку. Вроде commons-email выше писали, посмотрю её. Задача очень простая — соединиться с сервером адресата и заслать ему письмецо. Можно даже без всяких библиотек обойтись, SMTP несложный протокол. Но ещё раз подчеркну, что такие рассылки будут идти в лучшем случае в спам.

Самый надёжный способ рассылать — от имени gmail-а. Такая почта нормально ходит (если письма не похожи на спам) куда угодно. В поле From будет @gmail.com. Ну или специализированные сервисы, вроде амазон предлагал такой. Но это уже не бесплатно, а для бизнеса.

Legioner ★★★★★
()
Последнее исправление: Legioner (всего исправлений: 2)

через sendmail

т.е. через вызов /usr/lib/sendmail ?

делается на java через создание процесса, в нормальных либах такое вряд ли реализуют, т.к. некросплатформенно. Но где-нибудь на гитхабе может и найтись простейшая обертка с человеческим интерфейсом.

maloi ★★★★★
()

решил, что все таки поднять smtp будет лучше

kote
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.