|
19 | 19 | _partnerNs = "urn:partner.soap.sforce.com" |
20 | 20 | _sobjectNs = "urn:sobject.partner.soap.sforce.com" |
21 | 21 | _envNs = "http://schemas.xmlsoap.org/soap/envelope/" |
| 22 | +_schemaInstanceNs = "http://www.w3.org/2001/XMLSchema-instance" |
22 | 23 | _noAttrs = AttributesNSImpl({}, {}) |
23 | 24 |
|
24 | 25 | DEFAULT_SERVER_URL = 'https://login.salesforce.com/services/Soap/u/20.0' |
|
27 | 28 | _tPartnerNS = xmltramp.Namespace(_partnerNs) |
28 | 29 | _tSObjectNS = xmltramp.Namespace(_sobjectNs) |
29 | 30 | _tSoapNS = xmltramp.Namespace(_envNs) |
| 31 | +_tSchemaInstanceNS = xmltramp.Namespace(_schemaInstanceNs) |
30 | 32 |
|
31 | 33 | # global config |
32 | 34 | gzipRequest=True # are we going to gzip the request ? |
@@ -128,6 +130,19 @@ def getUserInfo(self): |
128 | 130 | def convertLeads(self, convertLeads): |
129 | 131 | return ConvertLeadsRequest(self.__serverUrl, self.sessionId, convertLeads).post(self.__conn) |
130 | 132 |
|
| 133 | + def sendEmail(self, emails, massType='SingleEmailMessage'): |
| 134 | + """ |
| 135 | + Send one or more emails from Salesforce. |
| 136 | + |
| 137 | + Parameters: |
| 138 | + emails - a dictionary or list of dictionaries, each representing a single email as described by https://www.salesforce.com/us/developer/docs/api/Content/sforce_api_calls_sendemail.htm |
| 139 | + massType - 'SingleEmailMessage' or 'MassEmailMessage'. MassEmailMessage is used for mailmerge of up to 250 recepients in a single pass. |
| 140 | + |
| 141 | + Note: |
| 142 | + Newly created Salesforce Sandboxes default to System email only. In this situation, sendEmail() will fail with NO_MASS_MAIL_PERMISSION. |
| 143 | + """ |
| 144 | + return SendEmailRequest(self.__serverUrl, self.sessionId, emails, massType).post(self.__conn) |
| 145 | + |
131 | 146 | # fixed version of XmlGenerator, handles unqualified attributes correctly |
132 | 147 | class BeatBoxXmlGenerator(XMLGenerator): |
133 | 148 | def __init__(self, destination, encoding): |
@@ -253,10 +268,12 @@ def __init__(self): |
253 | 268 | self.startPrefixMapping("s", _envNs) |
254 | 269 | self.startPrefixMapping("p", _partnerNs) |
255 | 270 | self.startPrefixMapping("o", _sobjectNs) |
| 271 | + self.startPrefixMapping("x", _schemaInstanceNs) |
256 | 272 | self.startElement(_envNs, "Envelope") |
257 | 273 |
|
258 | 274 | def endDocument(self): |
259 | 275 | self.endElement() # envelope |
| 276 | + self.endPrefixMapping("x") |
260 | 277 | self.endPrefixMapping("o") |
261 | 278 | self.endPrefixMapping("p") |
262 | 279 | self.endPrefixMapping("s") |
@@ -501,6 +518,14 @@ def __init__(self, serverUrl, sessionId, sLeads): |
501 | 518 | def writeBody(self, s): |
502 | 519 | s.writeElement(_partnerNs, "leadConverts", self.__sLeads) |
503 | 520 |
|
| 521 | +class SendEmailRequest(AuthenticatedRequest): |
| 522 | + def __init__(self, serverUrl, sessionId, emails, massType="SingleEmailMessage"): |
| 523 | + AuthenticatedRequest.__init__(self, serverUrl, sessionId, "sendEmail") |
| 524 | + self.__emails = emails |
| 525 | + self.__massType = massType |
| 526 | + |
| 527 | + def writeBody(self, s): |
| 528 | + s.writeElement(_partnerNs, "messages", self.__emails, attrs={(_schemaInstanceNs, 'type'):'p:'+self.__massType}) |
504 | 529 |
|
505 | 530 | class ResetPasswordRequest(AuthenticatedRequest): |
506 | 531 | def __init__(self, serverUrl, sessionId, userId): |
|
0 commit comments