如何在电子邮件中设置“name”属性

14

我正在使用Java mail和SMTP服务器发送邮件。我想能够更改收件人在收到电子邮件消息时看到的“名称”,而不仅仅是电子邮件地址的前缀(@之前的部分)。

我怀疑我需要更改或添加一个'props.put();'设置,但我无法确定是哪一个。

public class Email {

    private final String HOST = "mail.myserverr.com";
    private final String USER = "me+myserver.com";
    private final String FROM = "me@myserver.com";
    private final String PASS = "mypass";
    private final String PORT = "25";
    private final String AUTH = "true";

    @Test
    public void sendMail(){
        String[] to = {"mygmail@gmail.com","me@myservercom"};
        sendMessage(to,"Let's go","What's up");

    }

    public void sendMessage(String[] to, String subject, String msg) {

        Properties props = System.getProperties();
            props.put("mail.smtp.starttls.enable", "true"); // added this line
            props.put("mail.smtp.host", HOST);
            props.put("mail.smtp.user", USER);
            props.put("mail.smtp.password", PASS);
            props.put("mail.smtp.port", PORT);
            props.put("mail.smtp.auth", AUTH);
            props.put("mail.smtp.socketFactory.port", PORT);
            props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
            props.put("mail.smtp.socketFactory.fallback", "false");


        Session session = Session.getDefaultInstance(props, null);
        MimeMessage message = new MimeMessage(session);
        try {
            message.setFrom(new InternetAddress(FROM));

        InternetAddress[] toAddress = new InternetAddress[to.length];

        // To get the array of addresses
        for( int i=0; i < to.length; i++ ) { // changed from a while loop
            toAddress[i] = new InternetAddress(to[i]);
        }

        for( int i=0; i < toAddress.length; i++) { // changed from a while loop
            message.addRecipient(Message.RecipientType.TO, toAddress[i]);
        }

        message.setSubject(subject);
        message.setText(msg);

        Transport transport = session.getTransport("smtps");
        transport.connect(HOST, USER, PASS);
            transport.sendMessage(message, message.getAllRecipients());
            transport.close();

        } catch (AddressException e) {
            e.printStackTrace();
        } catch (MessagingException e) {
            e.printStackTrace();
        }
    }
}
2个回答

32

典型的地址语法形式为"user@host.domain""个人名称 <user@host.domain>"
您可以将相同的语法用于发件人和收件人字段地址。

例子:
将以下语句更改为:
String[] to = {"mygmail@gmail.com","me@myservercom"};
变成
String[] to = {"Recipient1 Name <mygmail@gmail.com>","My Name <me@myservercom>"};

您还可以构建InternetAddress对象,通过传递相应的电子邮件ID和个人名称作为参数。
例子:

String FROM = "my.email.id@my.server.domain";  
InternetAddress from = new InternetAddress( FROM, "Ravinder" );  

接收者将会看到发送者的名称显示为"Ravinder"而不是"my.email.id@my.server.domain"

参考: javax.mail.internet.InternetAddress


感谢您提供有关更改收件人姓名的额外信息。 - Ankur
是否有可能完全隐藏电子邮件地址?即使在悬停光标后也是如此。 - Sadanand
@Sadanand:你的问题与Java Mail毫无关系。为什么不发布一个新问题,说明电子邮件ID出现的上下文以及悬停与其相关的内容呢? - Ravinder Reddy
@Ankur:希望你已经得到了正确的答案。接受答案:它是如何工作的? - Ravinder Reddy
我们能否同时更改显示的电子邮件地址?我的意思是不同的认证 ID 和显示 ID。 - Manoj Tarkar
@ManojTarkar:SMTP登录只能使用经过身份验证的ID。您可以在“发件人”字段中使用任何其他ID和显示名称。但这可能会导致收件人端出现垃圾邮件。请阅读帮助防止欺骗、网络钓鱼和垃圾邮件 - Ravinder Reddy

13

你需要更改:

message.setFrom(new InternetAddress(FROM));
message.setFrom(new InternetAddress(FROM, "Company XYZ"));

文档: InternetAddress类

InternetAddress

public InternetAddress(String address,
                   String personal)
                   throws UnsupportedEncodingException 

给定地址和个人名称,构造一个InternetAddress。假定该地址是语法上有效的RFC822地址。

参数:

address - RFC822格式的地址

personal - 个人名称

抛出:UnsupportedEncodingException


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接