summaryrefslogtreecommitdiff
path: root/indra/llmessage/llmail.h
blob: 7effb847a47e32619b812141fa48b9aa4952f85e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
/** 
 * @file llmail.h
 * @brief smtp helper functions.
 *
 * $LicenseInfo:firstyear=2001&license=viewergpl$
 * 
 * Copyright (c) 2001-2009, Linden Research, Inc.
 * 
 * Second Life Viewer Source Code
 * The source code in this file ("Source Code") is provided by Linden Lab
 * to you under the terms of the GNU General Public License, version 2.0
 * ("GPL"), unless you have obtained a separate licensing agreement
 * ("Other License"), formally executed by you and Linden Lab.  Terms of
 * the GPL can be found in doc/GPL-license.txt in this distribution, or
 * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
 * 
 * There are special exceptions to the terms and conditions of the GPL as
 * it is applied to this Source Code. View the full text of the exception
 * in the file doc/FLOSS-exception.txt in this software distribution, or
 * online at
 * http://secondlifegrid.net/programs/open_source/licensing/flossexception
 * 
 * By copying, modifying or distributing this software, you acknowledge
 * that you have read and understood your obligations described above,
 * and agree to abide by those obligations.
 * 
 * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
 * COMPLETENESS OR PERFORMANCE.
 * $/LicenseInfo$
 */

#ifndef LL_LLMAIL_H
#define LL_LLMAIL_H

typedef struct apr_pool_t apr_pool_t;

#include "llsd.h"

class LLMail
{
public:
	// if hostname is NULL, then the host is resolved as 'mail'
	static void init(const std::string& hostname, apr_pool_t* pool);

	// Allow all email transmission to be disabled/enabled.
	static void enable(bool mail_enabled);

	/**
	 * @brief send an email
	 * @param from_name The name of the email sender
	 * @param from_address The email address for the sender
	 * @param to_name The name of the email recipient
	 * @param to_address The email recipient address
	 * @param subject The subject of the email
	 * @param headers optional X-Foo headers in an llsd map. 
	 * @return Returns TRUE if the call succeeds, FALSE otherwise.
	 *
	 * Results in:
	 * From: "from_name" <from_address>
	 * To:   "to_name" <to_address>
	 * Subject: subject
	 * 
	 * message
	 */
	static BOOL send(
		const char* from_name,
		const char* from_address,
		const char* to_name,
		const char* to_address,
		const char* subject,
		const char* message,
		const LLSD& headers = LLSD());

	/**
	 * @brief build the complete smtp transaction & header for use in an
	 * mail.
	 *
	 * @param from_name The name of the email sender
	 * @param from_address The email address for the sender
	 * @param to_name The name of the email recipient
	 * @param to_address The email recipient address
	 * @param subject The subject of the email
	 * @param headers optional X-Foo headers in an llsd map. 
	 * @return Returns the complete SMTP transaction mail header.
	 */
	static std::string buildSMTPTransaction(
		const char* from_name,
		const char* from_address,
		const char* to_name,
		const char* to_address,
		const char* subject,
		const LLSD& headers = LLSD());

	/**
	* @brief send an email with header and body.
	*
	* @param header The email header. Use build_mail_header().
	* @param message The unescaped email message.
	* @param from_address Used for debugging
	* @param to_address Used for debugging
	* @return Returns true if the message could be sent.
	*/
	static bool send(
		const std::string& header,
		const std::string& message,
		const char* from_address,
		const char* to_address);

	// IM-to-email sessions use a "session id" based on an encrypted
	// combination of from agent_id, to agent_id, and timestamp.  When
	// a user replies to an email we use the from_id to determine the
	// sender's name and the to_id to route the message.  The address
	// is encrypted to prevent users from building addresses to spoof
	// IMs from other users.  The timestamps allow the "sessions" to 
	// expire, in case one of the sessions is stolen/hijacked.
	//
	// indra/tools/mailglue is responsible for parsing the inbound mail.
	//
	// secret: binary blob passed to blowfish, max length 56 bytes
	// secret_size: length of blob, in bytes
	//
	// Returns: "base64" encoded email local-part, with _ and - as the
	// non-alphanumeric characters.  This allows better compatibility
	// with email systems than the default / and + extra chars.  JC
	static std::string encryptIMEmailAddress(
		const LLUUID& from_agent_id,
		const LLUUID& to_agent_id,
		U32 time,
		const U8* secret,
		size_t secret_size);
};

extern const size_t LL_MAX_KNOWN_GOOD_MAIL_SIZE;

#endif