6

我做了一个简单的应用程序来使用 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) Record[] records = new Lookup(hostName, Type.MX).run(); 总是返回 null。

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

非常感谢,

安德烈亚

4

3 回答 3

1

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

这就是为什么电子邮件客户端(例如 Thunderbird、Outlook 等)通常需要用户手动配置传出 SMTP 服务器名称/端口的原因。您可以通过识别一些流行的 ISP(Google、Yahoo 等)并预先配置正确的值来协助该过程,但没有通用的方法可以自动执行此操作。

于 2012-04-22T14:33:39.033 回答
0

您通常与您拥有的 smtp 服务器通信,它处理将邮件路由到 yahoo Gmail 一些随机 isp 到服务器。

使用的常规 API 是http://javamail.kenai.com/nonav/javadocs/javamail

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

于 2012-04-21T19:08:30.750 回答
0

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

  1. 如果它像 Gmail、Yahoo 或 Outlook 一样是公开的,那么请尝试为它们进行特定配置。

  2. 如果它是私人域或类似的东西。使用端口 587、465 和 25 循环通过传出服务器 smtp.domain.com 和 mail.domain.com。您可能必须检查 TLS 和身份验证。

这个过程有点长,但如果你有几封公共电子邮件和十几封私人电子邮件,你应该能够测试大多数场景。

于 2017-08-03T13:21:43.873 回答