java如何通过任何帐户发送电子邮件

时间:2013-12-10 11:04:22

标签: java javamail

我可以使用以下代码发送电子邮件。但我需要根据用户的帐户类型更改mail.smtp.host和mail.smtp.port。

我正在创建一个应用程序,我希望用户只需提供他的电子邮件地址和密码,然后代码就会计算出详细信息。有没有办法做到这一点?我可以尝试尝试从电子邮件地址中找出帐户类型,但这并不总是很明显。

 import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.nio.ByteBuffer;
    import java.nio.charset.Charset;
    import java.nio.file.Files;
    import java.nio.file.Paths;
    import java.util.Properties;
    import java.util.Scanner;

import javax.activation.*;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

public class MailProjectClass {
    //final static String username = "info@mail.com";
    //final static String password = "xxxx";
    final static String username = "yyyy@gmail.com";
    final static String password = "yyyy";
    static Transport bus;

public static void main(String[] args) {



    Properties props = new Properties();
    props.put("mail.smtp.auth", true);
    props.put("mail.smtp.starttls.enable", true);

    //props.put("mail.smtp.host", "smtpout.europe.secureserver.net");
    //props.put("mail.smtp.port", "80"); //25, 3535, 80    465    
    props.put("mail.smtp.host", "smtp.gmail.com");
    props.put("mail.smtp.port", "587"); //25, 3535, 80    465

    Session session = Session.getInstance(props,
            new javax.mail.Authenticator() {
                protected PasswordAuthentication getPasswordAuthentication() {
                    return new PasswordAuthentication(username, password);
                }
            });


        sendEmail(session,"zzzz@wherever.com");


  }

    public static void sendEmail(Session session, String emailAddress)  {

        try {

            Message message = new MimeMessage(session);
            message.setFrom(new InternetAddress(username));
            message.setRecipients(Message.RecipientType.TO,  InternetAddress.parse(emailAddress));
            message.setSubject("Homework");

            Multipart multipart = new MimeMultipart("alternative");

            MimeBodyPart messageBodyPart = new MimeBodyPart();


            String content = "Blank";
            try {

                content = readFile("C:\\Letter.txt", Charset.defaultCharset());
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            messageBodyPart.setContent(content, "text/plain"); 
            messageBodyPart.setDisposition(Part.INLINE);
            multipart.addBodyPart(messageBodyPart);

            try {

                content = readFile("C:\\Letter.htm", Charset.defaultCharset());
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            messageBodyPart.setContent(content, "text/html"); 
            messageBodyPart.setDisposition(Part.INLINE);
            multipart.addBodyPart(messageBodyPart);


            message.setContent(multipart);

            Transport.send(message);


        } catch (MessagingException e) {
            e.printStackTrace();
        }   
    }

编辑1

如果我想自己编写大部分需要的详细信息 - 是否有 java class 为我做对话 - 即允许根据帐户类型获取所需的所有不同信息?

4 个答案:

答案 0 :(得分:0)

您无法做到这一点,否则将有数百万个网站为您提供访问您的电子邮件的地方,仅凭用户名和密码不足以确定您需要哪个SMTP,除非您通过解析电子邮件地址来覆盖已知的SMTP这不是你想要的。

答案 1 :(得分:0)

你可以这样做,

  1. 创建一个静态地图,其中'gmail'作为关键字,'smtp.gmail.com'作为这样的值放置所有邮件详细信息,如gmail,hotmail,yahoo等。
  2. 为端口创建一个静态地图,其中“gmail”为关键字,“587”为值。
  3. 在添加主持人之前进入物业,获取主机和根据您的用户名从地图端口。从用户名substring获取密钥。

答案 2 :(得分:0)

您是否尝试过设置Outlook Express,Thunderbird或其他各种电子邮件客户端?如果是这样,您将知道他们需要更多信息,只需要一个电子邮件地址和密码。这可以作为你想要的东西的线索。

答案 3 :(得分:0)

您可以尝试找出服务器设置:

  • 在您的程序中存储大型提供程序(hotmail,gmail等)的数据,这应该涵盖大多数情况
  • 检查名称服务器上电子邮件主机部分的mx记录,这将为您提供该域的SMTP服务器,在大多数情况下,IMAP / POP3服务器是相同的。
  • 尝试使用这些服务器上的默认端口并尝试连接可能的协议组合(SMTP / POP3 / IMAP与SSL / TLS / plain / etc ...)。

但总会有用户必须选择的设置,例如,如果他想使用IMAP或POP3。