使用JAVA API查找知道电子邮件地址的SMTP主机和端口

时间:2012-04-21 18:57:24

标签: java javamail java-api

我创建了一个使用Java API发送电子邮件的简单应用程序,并提出了一个问题:

有没有办法找出SMTP主机知道将登录发送电子邮件的人的电子邮件地址?还有港口?

例如,如果发件人的电子邮件地址是sender@gmail.com,则SMTP主机为smtp.gmail.com,端口为465.如果发件人的电子邮件地址为sender@yahoo.com,则SMTP主机是smtp.yahoomail.com和端口25。

假设我不知道这个,有没有办法使用Java API类找到这些信息?请注意我是java的新手:)

提前致谢,

安德列亚


感谢您的回答。我试图做以下事情:

    public static String getMXRecordsForEmailAddress(String eMailAddress) { 

            String returnValue = null; 

            try { 
                String hostName = getHostNameFromEmailAddress(eMailAddress); 
                Record[] records = new Lookup(hostName, Type.MX).run(); 
                if (records == null) { 
             throw new RuntimeException("No MX records found for domain " + hostName + ".");
 } 

                // return first entry (not the best solution) 
                if (records.length > 0) { 
                        MXRecord mx = (MXRecord) records[0]; 
                        returnValue = mx.getTarget().toString(); 
                } 
            } catch (TextParseException e) { 
                throw new RuntimeException(e); 
            } 

            System.out.println("return value = "+returnValue);
            return returnValue; 
        } 

但是,无论hostName的值如何(例如.gmail.com,yahoo.com)  记录[]记录=新查找(hostName,Type.MX).run(); 始终返回null。

我很确定我错过了什么,但我不知道是什么。 你能帮我解决这个问题吗?你能告诉我我做错了什么吗?

非常感谢,

安德列亚

4 个答案:

答案 0 :(得分:2)

不幸的是,没有标准方法可以为任意电子邮件地址识别正确的外发SMTP服务器,假设您尝试做的是让用户指定电子邮件地址/密码,然后使用该帐户发送邮件。 / p>

这就是电子邮件客户端(例如Thunderbird,Outlook等)通常要求用户手动配置传出SMTP服务器名称/端口的原因。您可以通过识别一些流行的ISP(谷歌,雅虎等)并预先配置正确的值来协助这一过程,但没有通用的方法来自动完成。

答案 1 :(得分:1)

你的问题中有些事情并不是很清楚。您要么尝试找到SMTP以将电子邮件发送到某个地址,请将其直接发送到他们的服务器。如上所述,这是通过MX记录完成的。

如果我怀疑,您正在尝试找出当前用户(在from字段中)使用哪个SMTP服务器向全世界发送电子邮件。这是一个不同的故事。它无法安全地确定。 MX记录为您提供该域的传入电子邮件的地址,而不是传出的。大多数时候,它会起作用,但不能保证。 例如,GMail在其MX记录中有:

alt1.gmail-smtp-in.l.google.com internet address = 173.194.70.27
alt2.gmail-smtp-in.l.google.com internet address = 173.194.69.27
alt4.gmail-smtp-in.l.google.com internet address = 173.194.79.27

虽然smtp.gmail.com(传出)是:

Name:   gmail-smtp-msa.l.google.com
Address: 173.194.67.108

或者公司foobar.com可能有smtp.foobar.com但只能通过他们的VPN接受外发邮件作为internalmail.foobar.loc。

您可以在thunderbird设置中看到这个猜谜游戏,他们会尝试自动查找服务器,但会要求您确认。

答案 2 :(得分:0)

您通常会与您拥有的smtp服务器通信,它会处理邮件到雅虎Gmail的一些随机isp到服务器的邮件。

要使用的普通API是http://javamail.kenai.com/nonav/javadocs/ javamail。

如果您正在编写自己的smtp服务器: 1请不要 2 smtp信息存储在DNS mxrecord http://en.m.wikipedia.org/wiki/MX_record

答案 3 :(得分:0)

您似乎试图让用户只键入要连接的电子邮件和密码。如果是这样,我们遇到了同样的问题,我们发现的最好方法是获取域名并且:

  1. 如果它像Gmail,Yahoo或Outlook一样公开,那么请尝试使用它们的特定配置。

  2. 如果是私有域或类似的东西。使用端口587,465和25遍历传出服务器smtp.domain.com和mail.domain.com。您可能必须检查TLS和身份验证。

  3. 这个过程有点长,但如果您有几个公共电子邮件和一个私有的电子邮件,您应该能够测试大多数情况。