Enviando e-mails sem usar um servidor de e-mail

11

O JavaMail envia e-mails usando um servidor de e-mail, normalmente através da interface SMTP de um provedor de e-mail. É necessário usar um servidor de email para enviar emails?

Tenho um site que envia e-mails e, se possível, gostaria de enviá-los diretamente do código do site sem usar um servidor de e-mail. O FAQ do JavaMail diz que é necessário um servidor de email.

Existe uma maneira de enviar emails sem usar um servidor de email, com JavaMail ou outra API?

Dean Schulze
fonte
Não, não é possível. Como os clientes de email devem receber o email que você está enviando?
Oded
Uma alternativa, que não funcionará necessariamente com o JavaMail, é configurar um MTA como o Postfix. Você não precisará de um servidor de correio remoto, pois possui um local.
user16764
Precisamente. Suponho que você possa dizer que o antigo Microsoft Mail MTA estava "sem servidor", no sentido de que todos os clientes do Microsoft Mail lidavam individualmente com obtenção e envio de mensagens para / do repositório central de mensagens no sistema de arquivos (em um servidor de arquivos , pelo caminho). Mas, mesmo assim, a única maneira de enviar mensagens desse sistema para as de outras pessoas era através de um gateway, que sempre envolve servidores. Tem certeza de que fez a pergunta que pretendia?
24714 Craig

Respostas:

11

Você pode enviar um email diretamente para um dos servidores SMTP mencionados no registro MX do domínio do endereço. Normalmente, isso é uma péssima idéia:

A entrega do correio para um servidor local é rápida - você quase imediatamente pode continuar e fazer outra coisa e deixar que o servidor lide com a entrega.

A entrega real pode levar algum tempo, por exemplo, o servidor de correio remoto pode estar lento. Ou pode rejeitar o email primeiro - é uma estratégia conhecida contra spam dizer ao remetente para tentar enviar um email pela segunda vez, o que alguns bots de spam não fazem.

Além disso, o servidor de email pode facilmente tentar novamente um dia depois, quando o servidor remoto está inativo, isso reduz o risco de perda de emails.

johannes
fonte
Obrigado pelas informações sobre prevenção de spam. Eu posso ver como a alteração dessas estratégias faz com que o uso de um servidor de email seja uma boa ideia.
Dean Schulze
2
tecnicamente, isso transforma seu aplicativo em um servidor de e-mail; portanto, você ainda está usando um servidor de e-mail, embora seja um pouco básico.
jwenting
@jwenting como seria um servidor de correio se atuasse apenas como um cliente que se conecta a outros servidores? I em vez pensado para ser um "servidor" você tinha que ter pelo menos um "cliente" conectar a você ...
Jason Goemaat
Além disso, é provável que o envio para servidores de correio remoto diretamente do seu aplicativo esteja sujeito a verificações anti-spam SPF / DMARC.
24514 Craig
1

Tudo depende do que você quer dizer com "usar" exatamente.

Se "usar" incluir apenas o uso direto de um servidor de email, você poderá passar o email para enviar indiretamente a outro tipo de serviço para um servidor de email. Para casos de uso prático, essa parece ser uma solução "Good Enough ™" para mim.

Se, no entanto, sua pergunta significa literalmente " sem envolver nenhum servidor de e-mail ", isso só será possível se o seu software puder colocar as mensagens na caixa de entrada do cliente de destino de alguma maneira à sua escolha, mas exceto POP3 ou IMAP ou qualquer outro protocolo relevante para email usado no contexto de email (porque, se você usasse esse protocolo, esse programa específico atuaria como servidor de email, o que não é permitido)

Para responder à pergunta: Sim. Pelo menos em teoria.

JensG
fonte
Estou perguntando se tenho que usar um servidor de email para enviá-lo ao servidor de destinatários (2 servidores de email). Estou interessado em enviar diretamente para o servidor de email dos destinatários do meu código (1 servidor de email). Não estou tentando ignorar o servidor de email dos destinatários, apenas o servidor de email de envio.
Dean Schulze
Para enviar email, você precisa ser um cliente de email ou um servidor de email. Na maioria dos casos, para enviar e-mail como cliente, você precisa ser confiável, seja por lista branca ou por autorização. Para enviar como servidor, as regras de autorização geralmente são mais rígidas. Realmente depende das regras que os servidores de email dos destinatários usam para autorizar remetentes válidos.
BobDalgleish
@ BobDalgleish: Se posso gerenciar o acesso à sua máquina, posso fazer qualquer coisa. Incluindo colocar e-mails em sua caixa de entrada. Concordo que esta é uma opção meramente acadêmica, mas a questão não estava tão claramente definida.
JensG
@ DeanSchulze: Acho que johannes já respondeu a essa pergunta em particular e por que não é uma boa idéia. Se eu fosse você, eu favoreceria a ideia de serviço.
JensG
0

Se precisarmos enviar um email para alguém do código Java, precisamos ter acesso a algumas credenciais do servidor de email. Bem, nem sempre.

O Google forneceu acesso gratuito a um de seus servidores de correio e você pode usá-lo no código Java. Abaixo código escrito, se mais como uma nota para mim. Portanto, se eu precisar dele algum dia, você pode consultar aqui: http://www.computerbuzz.in/2014/02/how-to-send-email-in-java-using-gmail.html

private void setMailServerProperties()
    {
        Properties emailProperties = System.getProperties();
        emailProperties.put("mail.smtp.port", "586");
        emailProperties.put("mail.smtp.auth", "true");
        emailProperties.put("mail.smtp.starttls.enable", "true");
        mailSession = Session.getDefaultInstance(emailProperties, null);
    }

    private MimeMessage draftEmailMessage() throws AddressException, MessagingException
    {
        String[] toEmails = { "[email protected]" };
        String emailSubject = "Test email subject";
        String emailBody = "This is an email sent by http://www.computerbuzz.in.";
        MimeMessage emailMessage = new MimeMessage(mailSession);
        /**
         * Set the mail recipients
         * */
        for (int i = 0; i < toEmails.length; i++)
        {
            emailMessage.addRecipient(Message.RecipientType.TO, new InternetAddress(toEmails[i]));
        }
        emailMessage.setSubject(emailSubject);
        /**
         * If sending HTML mail
         * */
        emailMessage.setContent(emailBody, "text/html");
        /**
         * If sending only text mail
         * */
        //emailMessage.setText(emailBody);// for a text email
        return emailMessage;
    }

    private void sendEmail() throws AddressException, MessagingException
    {
        /**
         * Sender's credentials
         * */
        String fromUser = "[email protected]";
        String fromUserEmailPassword = "*******";

        String emailHost = "smtp.gmail.com";
        Transport transport = mailSession.getTransport("smtp");
        transport.connect(emailHost, fromUser, fromUserEmailPassword);
        /**
         * Draft the message
         * */
        MimeMessage emailMessage = draftEmailMessage();
        /**
         * Send the mail
         * */
        transport.sendMessage(emailMessage, emailMessage.getAllRecipients());
        transport.close();
        System.out.println("Email sent successfully.");
    }
}
user3350913
fonte