3

我需要使用 JavaMail 发送简单的 html 消息。而当我试图在网上找一些有解释的好例子时,下一个例子都让我更加愤怒和愤怒。

所有这些愚蠢的示例都包含复制和粘贴的 Java 代码,它们的区别仅在于注释和一个很好的免责声明,即首先您应该配置您的 smtp 和 pop3 服务器。

我知道没有人愿意为某些具体产品做广告,但配置服务器是最难的部分。那么,谁能给我一些关于配置具体服务器(例如 Kerio 或任何其他服务器)的非常有用的信息(没有 java 代码)?

我现在拥有的是下一个例外:

250 2.0.0 Reset state
javax.mail.SendFailedException: Invalid Addresses;
  nested exception is:
    com.sun.mail.smtp.SMTPAddressFailedException: 550 5.7.1 Relaying to <mymail@mycompany.com> denied (authentication required)

UPD。对前面所有文本的简单重新表述是:想象你有 Windows、jdk,没有别的。你想制作java程序并在你的机器上运行它。这个程序应该发送“Hello world!” 到您的 gmail 帐户。列出你的步骤。

UPD2。这是代码:

Properties props = new Properties ();
props.setProperty ("mail.transport.protocol", "smtp");
props.setProperty ("mail.host", "smtp.gmail.com");
props.setProperty ("mail.user", "my_real_address_1@gmail.com");
props.setProperty ("mail.password", "password_from_email_above"); 

Session mailSession = Session.getDefaultInstance (props, null);
mailSession.setDebug (true);
Transport transport = mailSession.getTransport ();

MimeMessage message = new MimeMessage (mailSession);
message.setSubject ("HTML  mail with images");
message.setFrom (new InternetAddress ("my_real_address_1@gmail.com"));
message.setContent ("<h1>Hello world</h1>", "text/html");
message.addRecipient (Message.RecipientType.TO,
        new InternetAddress ("my_real_address_2@gmail.com"));

transport.connect ();
transport.sendMessage (message,
        message.getRecipients (Message.RecipientType.TO));

例外是:

RSET
250 2.1.5 Flushed 3sm23455365fge.10
com.sun.mail.smtp.SMTPSendFailedException: 530 5.7.0 Must issue a STARTTLS command first. 3sm23455365fge.10
    at com.sun.mail.smtp.SMTPTransport.issueSendCommand(SMTPTransport.java:1829)
    at com.sun.mail.smtp.SMTPTransport.mailFrom(SMTPTransport.java:1368)
    at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:886)
    at com.teamdev.imgmail.MailSender.main(MailSender.java:33)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    ...
4

4 回答 4

13

如果您正在寻找配置 SMTP 服务器的教程,那么您不应该寻找 JavaMail。只需在您选择的服务器上查找教程(例如Kerio ... 或EximSendMailApache JamesPostfix)或询问Serverfault。任何符合 SMTP 的服务器都可以很好地与 JavaMail 配合使用。

或者,您甚至可以使用任何“标准”邮件提供商的基础设施。例如,我使用Google Apps帐户和 Google 的 SMTP 基础架构从我们的 Java 应用程序发送邮件。如果您不想设置自己的 SMTP 服务器来简单地测试 JavaMail,那么使用 Gmail 帐户是一个很好的起点。

作为最后一个选项,您甚至可以查找域的MX 记录并将您的邮件直接发送到收件人的 SMTP 服务器。有一些常见的问题可以解决棘手的问题。

最后一点,您必须研究如何避免您的邮件被过滤为垃圾邮件——这本身就是一个巨大的话题。在这里,依靠标准提供商来解决您在托管自己的服务器时可能遇到的一些问题会有所帮助。

顺便说一句:关于您发布的错误消息:SMTP 服务器拒绝转发消息。这是如果您的 SMTP 服务器(认为它)在 example.com 上运行并且您以 bob@example.net 的身份发送到 alice@example.org,那么您要求 SMTP 服务器充当中继。这是几年前的常见做法,直到它 - 你猜对了 - 被垃圾邮件发送者滥用。从那时起,邮政局长被鼓励拒绝转发。您有两种选择:在发送邮件之前进行身份验证或发送到仅在您的服务器上托管的帐户(即在 example.com 上,例如 alice@example.com)。

编辑:

这是一些让您开始使用身份验证的代码(适用于 Gmail 帐户,但也适用于您自己的服务器)

private Session createSmtpSession() {
  final Properties props = new Properties();
  props.setProperty("mail.smtp.host", "smtp.gmail.com");
  props.setProperty("mail.smtp.auth", "true");
  props.setProperty("mail.smtp.port", "" + 587);
  props.setProperty("mail.smtp.starttls.enable", "true");
  // props.setProperty("mail.debug", "true");

  return Session.getDefaultInstance(props, new javax.mail.Authenticator() {

    protected PasswordAuthentication getPasswordAuthentication() {
      return new PasswordAuthentication("john.doe@gmail.com", "mypassword");
    }
  });
}
于 2009-12-22T12:26:44.180 回答
1

我可以看到你的问题的一部分。错误消息中对此进行了充分解释。

您将邮件发送到的 SMTP 服务器(即您在 JavaMail 配置中配置的地址之一)拒绝将邮件转发到mymail@company.com. 看起来像是您的 SMTP 服务器中的配置问题。正如 sfussenegger 所指出的,它与 javamail 无关。

因此,您不会同时在所有方面进行调试,尝试从已知的工作 SMTP 客户端寻址您的 SMTP 服务器可能是一个好主意。例如,Thunderbird 会做得很好。如果您可以从 Thunderbird 通过它发送邮件,那么 JavaMail 应该没有什么问题。


更新:

Google 的 SMTP 服务器的正确地址是:smtp.gmail.com。这是您在 JavaMail 中配置的服务器吗?你能告诉我们匹配的错误信息吗?

于 2009-12-22T12:29:44.587 回答
1

结合上述答案的工作示例,使用activation-1.1.jarmail-1.4.1.jar并且 SMTP 主机是Gmail

  1. 替换user@gmail.comuser_pw在线return new PasswordAuthentication("user@gmail.com", "user_pw");

  2. 此外,您希望替换myRecipientAddress@gmail.com为您希望接收电子邮件的电子邮件地址。

    package com.test.sendEmail;
    import java.util.Properties;
    import javax.mail.*;
    import javax.mail.internet.*;
    
    public class sendEmailTest {
    
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        sendEmailTest emailer = new sendEmailTest();
        //the domains of these email addresses should be valid,
        //or the example will fail:
        emailer.sendEmail();
    }
    
    /**
      * Send a single email.
      */
    public void sendEmail(){
    Session mailSession = createSmtpSession();
    mailSession.setDebug (true);
    
    try {
        Transport transport = mailSession.getTransport ();
    
        MimeMessage message = new MimeMessage (mailSession);
    
        message.setSubject ("HTML  mail with images");
        message.setFrom (new InternetAddress ("myJavaEmailSender@gmail.com"));
        message.setContent ("<h1>Hello world</h1>", "text/html");
        message.addRecipient (Message.RecipientType.TO, new InternetAddress ("myRecipientAddress@gmail.com"));
    
        transport.connect ();
        transport.sendMessage (message, message.getRecipients (Message.RecipientType.TO));  
    }
    catch (MessagingException e) {
        System.err.println("Cannot Send email");
        e.printStackTrace();
    }
    }
    
    private Session createSmtpSession() {
    final Properties props = new Properties();
    props.setProperty ("mail.host", "smtp.gmail.com");
    props.setProperty("mail.smtp.auth", "true");
    props.setProperty("mail.smtp.port", "" + 587);
    props.setProperty("mail.smtp.starttls.enable", "true");
    props.setProperty ("mail.transport.protocol", "smtp");
    // props.setProperty("mail.debug", "true");
    
    return Session.getDefaultInstance(props, new javax.mail.Authenticator() {
      protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication("user@gmail.com", "user_pw");
      }
    });
    }
    
    }
    
于 2011-10-10T09:32:41.070 回答
0

这应该有效:

import java.text.MessageFormat;
import java.util.List;
import java.util.Properties;

import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class Emailer {

    public static void main(String[] args) {

        String hostname = args[0];
        final String userName = args[1];
        final String passWord = args[2];
        String toEmail = args[3];
        String fromEmail = args[4];
        String subject = args[5];
        String body = "";
        // add rest of args as one body text for convenience
        for (int i = 6; i < args.length; i++) {
            body += args[i] + " ";
        }

        Properties props = System.getProperties();
        props.put("mail.smtp.host", hostname);

        Session session = Session.getInstance(props, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(userName, passWord);
            }
        });

        MimeMessage message = new MimeMessage(session);
        try {
            message.setFrom(new InternetAddress(fromEmail));
            message.addRecipient(Message.RecipientType.TO, new InternetAddress(toEmail));
            message.setSubject(subject);
            message.setText(body);
            Transport.send(message);

        } catch (MessagingException e) {
            System.out.println("Cannot send email " + e);
        }
    }
}

您需要将 JavaMail mail.jar 放在 javax.mail 依赖项的类路径中。我不确定 Google 是否允许您按照自己的意愿发送电子邮件。试试其他电子邮件提供商,比如您的 ISP 怎么样?

于 2009-12-22T13:21:14.297 回答